LCOV - code coverage report
Current view: top level - test/unittests/compiler - node-matchers-unittest.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 917 917 100.0 %
Date: 2019-04-19 Functions: 17 23 73.9 %

          Line data    Source code
       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
       3             : // found in the LICENSE file.
       4             : 
       5             : #include "src/compiler/common-operator.h"
       6             : #include "src/compiler/graph.h"
       7             : #include "src/compiler/machine-operator.h"
       8             : #include "src/compiler/node.h"
       9             : #include "src/compiler/node-matchers.h"
      10             : #include "src/compiler/opcodes.h"
      11             : 
      12             : #include "test/unittests/compiler/graph-unittest.h"
      13             : #include "test/unittests/test-utils.h"
      14             : 
      15             : namespace v8 {
      16             : namespace internal {
      17             : namespace compiler {
      18             : 
      19             : class NodeMatcherTest : public GraphTest {
      20             :  public:
      21          12 :   NodeMatcherTest() : machine_(zone()) {}
      22           6 :   ~NodeMatcherTest() override = default;
      23             : 
      24           2 :   MachineOperatorBuilder* machine() { return &machine_; }
      25             : 
      26             :  private:
      27             :   MachineOperatorBuilder machine_;
      28             : };
      29             : 
      30             : namespace {
      31             : 
      32             : template <class Matcher>
      33         272 : void CheckBaseWithIndexAndDisplacement(
      34             :     Matcher* matcher, Node* index, int scale, Node* base, Node* displacement,
      35             :     DisplacementMode displacement_mode = kPositiveDisplacement) {
      36         272 :   EXPECT_TRUE(matcher->matches());
      37         544 :   EXPECT_EQ(index, matcher->index());
      38         544 :   EXPECT_EQ(scale, matcher->scale());
      39         544 :   EXPECT_EQ(base, matcher->base());
      40         544 :   EXPECT_EQ(displacement, matcher->displacement());
      41         544 :   EXPECT_EQ(displacement_mode, matcher->displacement_mode());
      42         272 : }
      43             : 
      44             : }  // namespace
      45             : 
      46             : #define ADD_ADDRESSING_OPERAND_USES(node)                                 \
      47             :   graph()->NewNode(machine()->Load(MachineType::Int32()), node, d0,       \
      48             :                    graph()->start(), graph()->start());                   \
      49             :   graph()->NewNode(machine()->Store(rep), node, d0, d0, graph()->start(), \
      50             :                    graph()->start());                                     \
      51             :   graph()->NewNode(machine()->Int32Add(), node, d0);                      \
      52             :   graph()->NewNode(machine()->Int64Add(), node, d0);
      53             : 
      54             : #define ADD_NONE_ADDRESSING_OPERAND_USES(node)                            \
      55             :   graph()->NewNode(machine()->Store(rep), b0, d0, node, graph()->start(), \
      56             :                    graph()->start());
      57             : 
      58       15419 : TEST_F(NodeMatcherTest, ScaledWithOffset32Matcher) {
      59           1 :   graph()->SetStart(graph()->NewNode(common()->Start(0)));
      60             : 
      61           1 :   const Operator* d0_op = common()->Int32Constant(0);
      62             :   Node* d0 = graph()->NewNode(d0_op);
      63             :   USE(d0);
      64           1 :   const Operator* d1_op = common()->Int32Constant(1);
      65             :   Node* d1 = graph()->NewNode(d1_op);
      66             :   USE(d1);
      67           1 :   const Operator* d2_op = common()->Int32Constant(2);
      68             :   Node* d2 = graph()->NewNode(d2_op);
      69             :   USE(d2);
      70           1 :   const Operator* d3_op = common()->Int32Constant(3);
      71             :   Node* d3 = graph()->NewNode(d3_op);
      72             :   USE(d3);
      73           1 :   const Operator* d4_op = common()->Int32Constant(4);
      74             :   Node* d4 = graph()->NewNode(d4_op);
      75             :   USE(d4);
      76           1 :   const Operator* d5_op = common()->Int32Constant(5);
      77             :   Node* d5 = graph()->NewNode(d5_op);
      78             :   USE(d5);
      79           1 :   const Operator* d7_op = common()->Int32Constant(7);
      80             :   Node* d7 = graph()->NewNode(d7_op);
      81             :   USE(d4);
      82           1 :   const Operator* d8_op = common()->Int32Constant(8);
      83             :   Node* d8 = graph()->NewNode(d8_op);
      84             :   USE(d8);
      85           1 :   const Operator* d9_op = common()->Int32Constant(9);
      86             :   Node* d9 = graph()->NewNode(d9_op);
      87             :   USE(d9);
      88           1 :   const Operator* d15_op = common()->Int32Constant(15);
      89             :   Node* d15 = graph()->NewNode(d15_op);
      90             :   USE(d15);
      91             : 
      92           1 :   const Operator* b0_op = common()->Parameter(0);
      93             :   Node* b0 = graph()->NewNode(b0_op, graph()->start());
      94             :   USE(b0);
      95           1 :   const Operator* b1_op = common()->Parameter(1);
      96             :   Node* b1 = graph()->NewNode(b1_op, graph()->start());
      97             :   USE(b0);
      98             : 
      99           1 :   const Operator* p1_op = common()->Parameter(3);
     100             :   Node* p1 = graph()->NewNode(p1_op, graph()->start());
     101             :   USE(p1);
     102             : 
     103           1 :   const Operator* a_op = machine()->Int32Add();
     104             :   USE(a_op);
     105             : 
     106           1 :   const Operator* sub_op = machine()->Int32Sub();
     107             :   USE(sub_op);
     108             : 
     109           1 :   const Operator* m_op = machine()->Int32Mul();
     110             :   Node* m1 = graph()->NewNode(m_op, p1, d1);
     111             :   Node* m2 = graph()->NewNode(m_op, p1, d2);
     112             :   Node* m3 = graph()->NewNode(m_op, p1, d3);
     113             :   Node* m4 = graph()->NewNode(m_op, p1, d4);
     114             :   Node* m5 = graph()->NewNode(m_op, p1, d5);
     115             :   Node* m7 = graph()->NewNode(m_op, p1, d7);
     116             :   Node* m8 = graph()->NewNode(m_op, p1, d8);
     117             :   Node* m9 = graph()->NewNode(m_op, p1, d9);
     118             :   USE(m1);
     119             :   USE(m2);
     120             :   USE(m3);
     121             :   USE(m4);
     122             :   USE(m5);
     123             :   USE(m7);
     124             :   USE(m8);
     125             :   USE(m9);
     126             : 
     127           1 :   const Operator* s_op = machine()->Word32Shl();
     128             :   Node* s0 = graph()->NewNode(s_op, p1, d0);
     129             :   Node* s1 = graph()->NewNode(s_op, p1, d1);
     130             :   Node* s2 = graph()->NewNode(s_op, p1, d2);
     131             :   Node* s3 = graph()->NewNode(s_op, p1, d3);
     132             :   Node* s4 = graph()->NewNode(s_op, p1, d4);
     133             :   USE(s0);
     134             :   USE(s1);
     135             :   USE(s2);
     136             :   USE(s3);
     137             :   USE(s4);
     138             : 
     139             :   const StoreRepresentation rep(MachineRepresentation::kWord32,
     140             :                                 kNoWriteBarrier);
     141             :   USE(rep);
     142             : 
     143             :   // 1 INPUT
     144             : 
     145             :   // Only relevant test dases is Checking for non-match.
     146           1 :   BaseWithIndexAndDisplacement32Matcher match0(d15);
     147           2 :   EXPECT_FALSE(match0.matches());
     148             : 
     149             :   // 2 INPUT
     150             : 
     151             :   // (B0 + B1) -> [B0, 0, B1, NULL]
     152           1 :   BaseWithIndexAndDisplacement32Matcher match1(graph()->NewNode(a_op, b0, b1));
     153           1 :   CheckBaseWithIndexAndDisplacement(&match1, b1, 0, b0, nullptr);
     154             : 
     155             :   // (B0 + D15) -> [NULL, 0, B0, D15]
     156           1 :   BaseWithIndexAndDisplacement32Matcher match2(graph()->NewNode(a_op, b0, d15));
     157           1 :   CheckBaseWithIndexAndDisplacement(&match2, nullptr, 0, b0, d15);
     158             : 
     159             :   // (D15 + B0) -> [NULL, 0, B0, D15]
     160           1 :   BaseWithIndexAndDisplacement32Matcher match3(graph()->NewNode(a_op, d15, b0));
     161           1 :   CheckBaseWithIndexAndDisplacement(&match3, nullptr, 0, b0, d15);
     162             : 
     163             :   // (B0 + M1) -> [p1, 0, B0, NULL]
     164           1 :   BaseWithIndexAndDisplacement32Matcher match4(graph()->NewNode(a_op, b0, m1));
     165           1 :   CheckBaseWithIndexAndDisplacement(&match4, p1, 0, b0, nullptr);
     166             : 
     167             :   // (M1 + B0) -> [p1, 0, B0, NULL]
     168             :   m1 = graph()->NewNode(m_op, p1, d1);
     169           1 :   BaseWithIndexAndDisplacement32Matcher match5(graph()->NewNode(a_op, m1, b0));
     170           1 :   CheckBaseWithIndexAndDisplacement(&match5, p1, 0, b0, nullptr);
     171             : 
     172             :   // (D15 + M1) -> [P1, 0, NULL, D15]
     173             :   m1 = graph()->NewNode(m_op, p1, d1);
     174           1 :   BaseWithIndexAndDisplacement32Matcher match6(graph()->NewNode(a_op, d15, m1));
     175           1 :   CheckBaseWithIndexAndDisplacement(&match6, p1, 0, nullptr, d15);
     176             : 
     177             :   // (M1 + D15) -> [P1, 0, NULL, D15]
     178             :   m1 = graph()->NewNode(m_op, p1, d1);
     179           1 :   BaseWithIndexAndDisplacement32Matcher match7(graph()->NewNode(a_op, m1, d15));
     180           1 :   CheckBaseWithIndexAndDisplacement(&match7, p1, 0, nullptr, d15);
     181             : 
     182             :   // (B0 + S0) -> [p1, 0, B0, NULL]
     183           1 :   BaseWithIndexAndDisplacement32Matcher match8(graph()->NewNode(a_op, b0, s0));
     184           1 :   CheckBaseWithIndexAndDisplacement(&match8, p1, 0, b0, nullptr);
     185             : 
     186             :   // (S0 + B0) -> [p1, 0, B0, NULL]
     187             :   s0 = graph()->NewNode(s_op, p1, d0);
     188           1 :   BaseWithIndexAndDisplacement32Matcher match9(graph()->NewNode(a_op, s0, b0));
     189           1 :   CheckBaseWithIndexAndDisplacement(&match9, p1, 0, b0, nullptr);
     190             : 
     191             :   // (D15 + S0) -> [P1, 0, NULL, D15]
     192             :   s0 = graph()->NewNode(s_op, p1, d0);
     193             :   BaseWithIndexAndDisplacement32Matcher match10(
     194           1 :       graph()->NewNode(a_op, d15, s0));
     195           1 :   CheckBaseWithIndexAndDisplacement(&match10, p1, 0, nullptr, d15);
     196             : 
     197             :   // (S0 + D15) -> [P1, 0, NULL, D15]
     198             :   s0 = graph()->NewNode(s_op, p1, d0);
     199             :   BaseWithIndexAndDisplacement32Matcher match11(
     200           1 :       graph()->NewNode(a_op, s0, d15));
     201           1 :   CheckBaseWithIndexAndDisplacement(&match11, p1, 0, nullptr, d15);
     202             : 
     203             :   // (B0 + M2) -> [p1, 1, B0, NULL]
     204           1 :   BaseWithIndexAndDisplacement32Matcher match12(graph()->NewNode(a_op, b0, m2));
     205           1 :   CheckBaseWithIndexAndDisplacement(&match12, p1, 1, b0, nullptr);
     206             : 
     207             :   // (M2 + B0) -> [p1, 1, B0, NULL]
     208             :   m2 = graph()->NewNode(m_op, p1, d2);
     209           1 :   BaseWithIndexAndDisplacement32Matcher match13(graph()->NewNode(a_op, m2, b0));
     210           1 :   CheckBaseWithIndexAndDisplacement(&match13, p1, 1, b0, nullptr);
     211             : 
     212             :   // (D15 + M2) -> [P1, 1, NULL, D15]
     213             :   m2 = graph()->NewNode(m_op, p1, d2);
     214             :   BaseWithIndexAndDisplacement32Matcher match14(
     215           1 :       graph()->NewNode(a_op, d15, m2));
     216           1 :   CheckBaseWithIndexAndDisplacement(&match14, p1, 1, nullptr, d15);
     217             : 
     218             :   // (M2 + D15) -> [P1, 1, NULL, D15]
     219             :   m2 = graph()->NewNode(m_op, p1, d2);
     220             :   BaseWithIndexAndDisplacement32Matcher match15(
     221           1 :       graph()->NewNode(a_op, m2, d15));
     222           1 :   CheckBaseWithIndexAndDisplacement(&match15, p1, 1, nullptr, d15);
     223             : 
     224             :   // (B0 + S1) -> [p1, 1, B0, NULL]
     225           1 :   BaseWithIndexAndDisplacement32Matcher match16(graph()->NewNode(a_op, b0, s1));
     226           1 :   CheckBaseWithIndexAndDisplacement(&match16, p1, 1, b0, nullptr);
     227             : 
     228             :   // (S1 + B0) -> [p1, 1, B0, NULL]
     229             :   s1 = graph()->NewNode(s_op, p1, d1);
     230           1 :   BaseWithIndexAndDisplacement32Matcher match17(graph()->NewNode(a_op, s1, b0));
     231           1 :   CheckBaseWithIndexAndDisplacement(&match17, p1, 1, b0, nullptr);
     232             : 
     233             :   // (D15 + S1) -> [P1, 1, NULL, D15]
     234             :   s1 = graph()->NewNode(s_op, p1, d1);
     235             :   BaseWithIndexAndDisplacement32Matcher match18(
     236           1 :       graph()->NewNode(a_op, d15, s1));
     237           1 :   CheckBaseWithIndexAndDisplacement(&match18, p1, 1, nullptr, d15);
     238             : 
     239             :   // (S1 + D15) -> [P1, 1, NULL, D15]
     240             :   s1 = graph()->NewNode(s_op, p1, d1);
     241             :   BaseWithIndexAndDisplacement32Matcher match19(
     242           1 :       graph()->NewNode(a_op, s1, d15));
     243           1 :   CheckBaseWithIndexAndDisplacement(&match19, p1, 1, nullptr, d15);
     244             : 
     245             :   // (B0 + M4) -> [p1, 2, B0, NULL]
     246           1 :   BaseWithIndexAndDisplacement32Matcher match20(graph()->NewNode(a_op, b0, m4));
     247           1 :   CheckBaseWithIndexAndDisplacement(&match20, p1, 2, b0, nullptr);
     248             : 
     249             :   // (M4 + B0) -> [p1, 2, B0, NULL]
     250             :   m4 = graph()->NewNode(m_op, p1, d4);
     251           1 :   BaseWithIndexAndDisplacement32Matcher match21(graph()->NewNode(a_op, m4, b0));
     252           1 :   CheckBaseWithIndexAndDisplacement(&match21, p1, 2, b0, nullptr);
     253             : 
     254             :   // (D15 + M4) -> [p1, 2, NULL, D15]
     255             :   m4 = graph()->NewNode(m_op, p1, d4);
     256             :   BaseWithIndexAndDisplacement32Matcher match22(
     257           1 :       graph()->NewNode(a_op, d15, m4));
     258           1 :   CheckBaseWithIndexAndDisplacement(&match22, p1, 2, nullptr, d15);
     259             : 
     260             :   // (M4 + D15) -> [p1, 2, NULL, D15]
     261             :   m4 = graph()->NewNode(m_op, p1, d4);
     262             :   BaseWithIndexAndDisplacement32Matcher match23(
     263           1 :       graph()->NewNode(a_op, m4, d15));
     264           1 :   CheckBaseWithIndexAndDisplacement(&match23, p1, 2, nullptr, d15);
     265             : 
     266             :   // (B0 + S2) -> [p1, 2, B0, NULL]
     267           1 :   BaseWithIndexAndDisplacement32Matcher match24(graph()->NewNode(a_op, b0, s2));
     268           1 :   CheckBaseWithIndexAndDisplacement(&match24, p1, 2, b0, nullptr);
     269             : 
     270             :   // (S2 + B0) -> [p1, 2, B0, NULL]
     271             :   s2 = graph()->NewNode(s_op, p1, d2);
     272           1 :   BaseWithIndexAndDisplacement32Matcher match25(graph()->NewNode(a_op, s2, b0));
     273           1 :   CheckBaseWithIndexAndDisplacement(&match25, p1, 2, b0, nullptr);
     274             : 
     275             :   // (D15 + S2) -> [p1, 2, NULL, D15]
     276             :   s2 = graph()->NewNode(s_op, p1, d2);
     277             :   BaseWithIndexAndDisplacement32Matcher match26(
     278           1 :       graph()->NewNode(a_op, d15, s2));
     279           1 :   CheckBaseWithIndexAndDisplacement(&match26, p1, 2, nullptr, d15);
     280             : 
     281             :   // (S2 + D15) -> [p1, 2, NULL, D15]
     282             :   s2 = graph()->NewNode(s_op, p1, d2);
     283             :   BaseWithIndexAndDisplacement32Matcher match27(
     284           1 :       graph()->NewNode(a_op, s2, d15));
     285           1 :   CheckBaseWithIndexAndDisplacement(&match27, p1, 2, nullptr, d15);
     286             : 
     287             :   // (B0 + M8) -> [p1, 2, B0, NULL]
     288           1 :   BaseWithIndexAndDisplacement32Matcher match28(graph()->NewNode(a_op, b0, m8));
     289           1 :   CheckBaseWithIndexAndDisplacement(&match28, p1, 3, b0, nullptr);
     290             : 
     291             :   // (M8 + B0) -> [p1, 2, B0, NULL]
     292             :   m8 = graph()->NewNode(m_op, p1, d8);
     293           1 :   BaseWithIndexAndDisplacement32Matcher match29(graph()->NewNode(a_op, m8, b0));
     294           1 :   CheckBaseWithIndexAndDisplacement(&match29, p1, 3, b0, nullptr);
     295             : 
     296             :   // (D15 + M8) -> [p1, 2, NULL, D15]
     297             :   m8 = graph()->NewNode(m_op, p1, d8);
     298             :   BaseWithIndexAndDisplacement32Matcher match30(
     299           1 :       graph()->NewNode(a_op, d15, m8));
     300           1 :   CheckBaseWithIndexAndDisplacement(&match30, p1, 3, nullptr, d15);
     301             : 
     302             :   // (M8 + D15) -> [p1, 2, NULL, D15]
     303             :   m8 = graph()->NewNode(m_op, p1, d8);
     304             :   BaseWithIndexAndDisplacement32Matcher match31(
     305           1 :       graph()->NewNode(a_op, m8, d15));
     306           1 :   CheckBaseWithIndexAndDisplacement(&match31, p1, 3, nullptr, d15);
     307             : 
     308             :   // (B0 + S3) -> [p1, 2, B0, NULL]
     309           1 :   BaseWithIndexAndDisplacement32Matcher match32(graph()->NewNode(a_op, b0, s3));
     310           1 :   CheckBaseWithIndexAndDisplacement(&match32, p1, 3, b0, nullptr);
     311             : 
     312             :   // (S3 + B0) -> [p1, 2, B0, NULL]
     313             :   s3 = graph()->NewNode(s_op, p1, d3);
     314           1 :   BaseWithIndexAndDisplacement32Matcher match33(graph()->NewNode(a_op, s3, b0));
     315           1 :   CheckBaseWithIndexAndDisplacement(&match33, p1, 3, b0, nullptr);
     316             : 
     317             :   // (D15 + S3) -> [p1, 2, NULL, D15]
     318             :   s3 = graph()->NewNode(s_op, p1, d3);
     319             :   BaseWithIndexAndDisplacement32Matcher match34(
     320           1 :       graph()->NewNode(a_op, d15, s3));
     321           1 :   CheckBaseWithIndexAndDisplacement(&match34, p1, 3, nullptr, d15);
     322             : 
     323             :   // (S3 + D15) -> [p1, 2, NULL, D15]
     324             :   s3 = graph()->NewNode(s_op, p1, d3);
     325             :   BaseWithIndexAndDisplacement32Matcher match35(
     326           1 :       graph()->NewNode(a_op, s3, d15));
     327           1 :   CheckBaseWithIndexAndDisplacement(&match35, p1, 3, nullptr, d15);
     328             : 
     329             :   // 2 INPUT - NEGATIVE CASES
     330             : 
     331             :   // (M3 + B1) -> [B0, 0, M3, NULL]
     332           1 :   BaseWithIndexAndDisplacement32Matcher match36(graph()->NewNode(a_op, b1, m3));
     333           1 :   CheckBaseWithIndexAndDisplacement(&match36, m3, 0, b1, nullptr);
     334             : 
     335             :   // (S4 + B1) -> [B0, 0, S4, NULL]
     336           1 :   BaseWithIndexAndDisplacement32Matcher match37(graph()->NewNode(a_op, b1, s4));
     337           1 :   CheckBaseWithIndexAndDisplacement(&match37, s4, 0, b1, nullptr);
     338             : 
     339             :   // 3 INPUT
     340             : 
     341             :   // (D15 + S3) + B0 -> [p1, 2, b0, d15]
     342             :   s3 = graph()->NewNode(s_op, p1, d3);
     343             :   BaseWithIndexAndDisplacement32Matcher match38(
     344           1 :       graph()->NewNode(a_op, graph()->NewNode(a_op, d15, s3), b0));
     345           1 :   CheckBaseWithIndexAndDisplacement(&match38, p1, 3, b0, d15);
     346             : 
     347             :   // (B0 + D15) + S3 -> [p1, 2, b0, d15]
     348             :   s3 = graph()->NewNode(s_op, p1, d3);
     349             :   BaseWithIndexAndDisplacement32Matcher match39(
     350           1 :       graph()->NewNode(a_op, graph()->NewNode(a_op, b0, d15), s3));
     351           1 :   CheckBaseWithIndexAndDisplacement(&match39, p1, 3, b0, d15);
     352             : 
     353             :   // (S3 + B0) + D15 -> [p1, 2, b0, d15]
     354             :   s3 = graph()->NewNode(s_op, p1, d3);
     355             :   BaseWithIndexAndDisplacement32Matcher match40(
     356           1 :       graph()->NewNode(a_op, graph()->NewNode(a_op, s3, b0), d15));
     357           1 :   CheckBaseWithIndexAndDisplacement(&match40, p1, 3, b0, d15);
     358             : 
     359             :   // D15 + (S3 + B0) -> [p1, 2, b0, d15]
     360             :   s3 = graph()->NewNode(s_op, p1, d3);
     361             :   BaseWithIndexAndDisplacement32Matcher match41(
     362           1 :       graph()->NewNode(a_op, d15, graph()->NewNode(a_op, s3, b0)));
     363           1 :   CheckBaseWithIndexAndDisplacement(&match41, p1, 3, b0, d15);
     364             : 
     365             :   // B0 + (D15 + S3) -> [p1, 2, b0, d15]
     366             :   s3 = graph()->NewNode(s_op, p1, d3);
     367             :   BaseWithIndexAndDisplacement32Matcher match42(
     368           1 :       graph()->NewNode(a_op, b0, graph()->NewNode(a_op, d15, s3)));
     369           1 :   CheckBaseWithIndexAndDisplacement(&match42, p1, 3, b0, d15);
     370             : 
     371             :   // S3 + (B0 + D15) -> [p1, 2, b0, d15]
     372             :   s3 = graph()->NewNode(s_op, p1, d3);
     373             :   BaseWithIndexAndDisplacement32Matcher match43(
     374           1 :       graph()->NewNode(a_op, s3, graph()->NewNode(a_op, b0, d15)));
     375           1 :   CheckBaseWithIndexAndDisplacement(&match43, p1, 3, b0, d15);
     376             : 
     377             :   // S3 + (B0 - D15) -> [p1, 2, b0, d15, true]
     378             :   s3 = graph()->NewNode(s_op, p1, d3);
     379             :   BaseWithIndexAndDisplacement32Matcher match44(
     380           1 :       graph()->NewNode(a_op, s3, graph()->NewNode(sub_op, b0, d15)));
     381             :   CheckBaseWithIndexAndDisplacement(&match44, p1, 3, b0, d15,
     382           1 :                                     kNegativeDisplacement);
     383             : 
     384             :   // B0 + (B1 - D15) -> [p1, 2, b0, d15, true]
     385             :   BaseWithIndexAndDisplacement32Matcher match45(
     386           1 :       graph()->NewNode(a_op, b0, graph()->NewNode(sub_op, b1, d15)));
     387             :   CheckBaseWithIndexAndDisplacement(&match45, b1, 0, b0, d15,
     388           1 :                                     kNegativeDisplacement);
     389             : 
     390             :   // (B0 - D15) + S3 -> [p1, 2, b0, d15, true]
     391             :   s3 = graph()->NewNode(s_op, p1, d3);
     392             :   BaseWithIndexAndDisplacement32Matcher match46(
     393           1 :       graph()->NewNode(a_op, graph()->NewNode(sub_op, b0, d15), s3));
     394             :   CheckBaseWithIndexAndDisplacement(&match46, p1, 3, b0, d15,
     395           1 :                                     kNegativeDisplacement);
     396             : 
     397             :   // 4 INPUT - with addressing operand uses
     398             : 
     399             :   // (B0 + M1) -> [p1, 0, B0, NULL]
     400             :   m1 = graph()->NewNode(m_op, p1, d1);
     401           4 :   ADD_ADDRESSING_OPERAND_USES(m1);
     402           1 :   BaseWithIndexAndDisplacement32Matcher match47(graph()->NewNode(a_op, b0, m1));
     403           1 :   CheckBaseWithIndexAndDisplacement(&match47, p1, 0, b0, nullptr);
     404             : 
     405             :   // (M1 + B0) -> [p1, 0, B0, NULL]
     406             :   m1 = graph()->NewNode(m_op, p1, d1);
     407           4 :   ADD_ADDRESSING_OPERAND_USES(m1);
     408           1 :   BaseWithIndexAndDisplacement32Matcher match48(graph()->NewNode(a_op, m1, b0));
     409           1 :   CheckBaseWithIndexAndDisplacement(&match48, p1, 0, b0, nullptr);
     410             : 
     411             :   // (D15 + M1) -> [P1, 0, NULL, D15]
     412             :   m1 = graph()->NewNode(m_op, p1, d1);
     413           4 :   ADD_ADDRESSING_OPERAND_USES(m1);
     414             :   BaseWithIndexAndDisplacement32Matcher match49(
     415           1 :       graph()->NewNode(a_op, d15, m1));
     416           1 :   CheckBaseWithIndexAndDisplacement(&match49, p1, 0, nullptr, d15);
     417             : 
     418             :   // (M1 + D15) -> [P1, 0, NULL, D15]
     419             :   m1 = graph()->NewNode(m_op, p1, d1);
     420           4 :   ADD_ADDRESSING_OPERAND_USES(m1);
     421             :   BaseWithIndexAndDisplacement32Matcher match50(
     422           1 :       graph()->NewNode(a_op, m1, d15));
     423           1 :   CheckBaseWithIndexAndDisplacement(&match50, p1, 0, nullptr, d15);
     424             : 
     425             :   // (B0 + S0) -> [p1, 0, B0, NULL]
     426             :   s0 = graph()->NewNode(s_op, p1, d0);
     427           4 :   ADD_ADDRESSING_OPERAND_USES(s0);
     428           1 :   BaseWithIndexAndDisplacement32Matcher match51(graph()->NewNode(a_op, b0, s0));
     429           1 :   CheckBaseWithIndexAndDisplacement(&match51, p1, 0, b0, nullptr);
     430             : 
     431             :   // (S0 + B0) -> [p1, 0, B0, NULL]
     432             :   s0 = graph()->NewNode(s_op, p1, d0);
     433           4 :   ADD_ADDRESSING_OPERAND_USES(s0);
     434           1 :   BaseWithIndexAndDisplacement32Matcher match52(graph()->NewNode(a_op, s0, b0));
     435           1 :   CheckBaseWithIndexAndDisplacement(&match52, p1, 0, b0, nullptr);
     436             : 
     437             :   // (D15 + S0) -> [P1, 0, NULL, D15]
     438             :   s0 = graph()->NewNode(s_op, p1, d0);
     439           4 :   ADD_ADDRESSING_OPERAND_USES(s0);
     440             :   BaseWithIndexAndDisplacement32Matcher match53(
     441           1 :       graph()->NewNode(a_op, d15, s0));
     442           1 :   CheckBaseWithIndexAndDisplacement(&match53, p1, 0, nullptr, d15);
     443             : 
     444             :   // (S0 + D15) -> [P1, 0, NULL, D15]
     445             :   s0 = graph()->NewNode(s_op, p1, d0);
     446           4 :   ADD_ADDRESSING_OPERAND_USES(s0);
     447             :   BaseWithIndexAndDisplacement32Matcher match54(
     448           1 :       graph()->NewNode(a_op, s0, d15));
     449           1 :   CheckBaseWithIndexAndDisplacement(&match54, p1, 0, nullptr, d15);
     450             : 
     451             :   // (B0 + M2) -> [p1, 1, B0, NULL]
     452             :   m2 = graph()->NewNode(m_op, p1, d2);
     453           4 :   ADD_ADDRESSING_OPERAND_USES(m2);
     454           1 :   BaseWithIndexAndDisplacement32Matcher match55(graph()->NewNode(a_op, b0, m2));
     455           1 :   CheckBaseWithIndexAndDisplacement(&match55, p1, 1, b0, nullptr);
     456             : 
     457             :   // (M2 + B0) -> [p1, 1, B0, NULL]
     458             :   m2 = graph()->NewNode(m_op, p1, d2);
     459           4 :   ADD_ADDRESSING_OPERAND_USES(m2);
     460           1 :   BaseWithIndexAndDisplacement32Matcher match56(graph()->NewNode(a_op, m2, b0));
     461           1 :   CheckBaseWithIndexAndDisplacement(&match56, p1, 1, b0, nullptr);
     462             : 
     463             :   // (D15 + M2) -> [P1, 1, NULL, D15]
     464             :   m2 = graph()->NewNode(m_op, p1, d2);
     465           4 :   ADD_ADDRESSING_OPERAND_USES(m2);
     466             :   BaseWithIndexAndDisplacement32Matcher match57(
     467           1 :       graph()->NewNode(a_op, d15, m2));
     468           1 :   CheckBaseWithIndexAndDisplacement(&match57, p1, 1, nullptr, d15);
     469             : 
     470             :   // (M2 + D15) -> [P1, 1, NULL, D15]
     471             :   m2 = graph()->NewNode(m_op, p1, d2);
     472           4 :   ADD_ADDRESSING_OPERAND_USES(m2);
     473             :   BaseWithIndexAndDisplacement32Matcher match58(
     474           1 :       graph()->NewNode(a_op, m2, d15));
     475           1 :   CheckBaseWithIndexAndDisplacement(&match58, p1, 1, nullptr, d15);
     476             : 
     477             :   // (B0 + S1) -> [p1, 1, B0, NULL]
     478             :   s1 = graph()->NewNode(s_op, p1, d1);
     479           4 :   ADD_ADDRESSING_OPERAND_USES(s1);
     480           1 :   BaseWithIndexAndDisplacement32Matcher match59(graph()->NewNode(a_op, b0, s1));
     481           1 :   CheckBaseWithIndexAndDisplacement(&match59, p1, 1, b0, nullptr);
     482             : 
     483             :   // (S1 + B0) -> [p1, 1, B0, NULL]
     484             :   s1 = graph()->NewNode(s_op, p1, d1);
     485           4 :   ADD_ADDRESSING_OPERAND_USES(s1);
     486           1 :   BaseWithIndexAndDisplacement32Matcher match60(graph()->NewNode(a_op, s1, b0));
     487           1 :   CheckBaseWithIndexAndDisplacement(&match60, p1, 1, b0, nullptr);
     488             : 
     489             :   // (D15 + S1) -> [P1, 1, NULL, D15]
     490             :   s1 = graph()->NewNode(s_op, p1, d1);
     491           4 :   ADD_ADDRESSING_OPERAND_USES(s1);
     492             :   BaseWithIndexAndDisplacement32Matcher match61(
     493           1 :       graph()->NewNode(a_op, d15, s1));
     494           1 :   CheckBaseWithIndexAndDisplacement(&match61, p1, 1, nullptr, d15);
     495             : 
     496             :   // (S1 + D15) -> [P1, 1, NULL, D15]
     497             :   s1 = graph()->NewNode(s_op, p1, d1);
     498           4 :   ADD_ADDRESSING_OPERAND_USES(s1);
     499             :   BaseWithIndexAndDisplacement32Matcher match62(
     500           1 :       graph()->NewNode(a_op, s1, d15));
     501           1 :   CheckBaseWithIndexAndDisplacement(&match62, p1, 1, nullptr, d15);
     502             : 
     503             :   // (B0 + M4) -> [p1, 2, B0, NULL]
     504             :   m4 = graph()->NewNode(m_op, p1, d4);
     505           4 :   ADD_ADDRESSING_OPERAND_USES(m4);
     506           1 :   BaseWithIndexAndDisplacement32Matcher match63(graph()->NewNode(a_op, b0, m4));
     507           1 :   CheckBaseWithIndexAndDisplacement(&match63, p1, 2, b0, nullptr);
     508             : 
     509             :   // (M4 + B0) -> [p1, 2, B0, NULL]
     510             :   m4 = graph()->NewNode(m_op, p1, d4);
     511           4 :   ADD_ADDRESSING_OPERAND_USES(m4);
     512           1 :   BaseWithIndexAndDisplacement32Matcher match64(graph()->NewNode(a_op, m4, b0));
     513           1 :   CheckBaseWithIndexAndDisplacement(&match64, p1, 2, b0, nullptr);
     514             : 
     515             :   // (D15 + M4) -> [p1, 2, NULL, D15]
     516             :   m4 = graph()->NewNode(m_op, p1, d4);
     517           4 :   ADD_ADDRESSING_OPERAND_USES(m4);
     518             :   BaseWithIndexAndDisplacement32Matcher match65(
     519           1 :       graph()->NewNode(a_op, d15, m4));
     520           1 :   CheckBaseWithIndexAndDisplacement(&match65, p1, 2, nullptr, d15);
     521             : 
     522             :   // (M4 + D15) -> [p1, 2, NULL, D15]
     523             :   m4 = graph()->NewNode(m_op, p1, d4);
     524           4 :   ADD_ADDRESSING_OPERAND_USES(m4);
     525             :   BaseWithIndexAndDisplacement32Matcher match66(
     526           1 :       graph()->NewNode(a_op, m4, d15));
     527           1 :   CheckBaseWithIndexAndDisplacement(&match66, p1, 2, nullptr, d15);
     528             : 
     529             :   // (B0 + S2) -> [p1, 2, B0, NULL]
     530             :   s2 = graph()->NewNode(s_op, p1, d2);
     531           4 :   ADD_ADDRESSING_OPERAND_USES(s2);
     532           1 :   BaseWithIndexAndDisplacement32Matcher match67(graph()->NewNode(a_op, b0, s2));
     533           1 :   CheckBaseWithIndexAndDisplacement(&match67, p1, 2, b0, nullptr);
     534             : 
     535             :   // (S2 + B0) -> [p1, 2, B0, NULL]
     536             :   s2 = graph()->NewNode(s_op, p1, d2);
     537           4 :   ADD_ADDRESSING_OPERAND_USES(s2);
     538           1 :   BaseWithIndexAndDisplacement32Matcher match68(graph()->NewNode(a_op, s2, b0));
     539           1 :   CheckBaseWithIndexAndDisplacement(&match68, p1, 2, b0, nullptr);
     540             : 
     541             :   // (D15 + S2) -> [p1, 2, NULL, D15]
     542             :   s2 = graph()->NewNode(s_op, p1, d2);
     543           4 :   ADD_ADDRESSING_OPERAND_USES(s2);
     544             :   BaseWithIndexAndDisplacement32Matcher match69(
     545           1 :       graph()->NewNode(a_op, d15, s2));
     546           1 :   CheckBaseWithIndexAndDisplacement(&match69, p1, 2, nullptr, d15);
     547             : 
     548             :   // (S2 + D15) -> [p1, 2, NULL, D15]
     549             :   s2 = graph()->NewNode(s_op, p1, d2);
     550           4 :   ADD_ADDRESSING_OPERAND_USES(s2);
     551             :   BaseWithIndexAndDisplacement32Matcher match70(
     552           1 :       graph()->NewNode(a_op, s2, d15));
     553           1 :   CheckBaseWithIndexAndDisplacement(&match70, p1, 2, nullptr, d15);
     554             : 
     555             :   // (B0 + M8) -> [p1, 2, B0, NULL]
     556             :   m8 = graph()->NewNode(m_op, p1, d8);
     557           4 :   ADD_ADDRESSING_OPERAND_USES(m8);
     558           1 :   BaseWithIndexAndDisplacement32Matcher match71(graph()->NewNode(a_op, b0, m8));
     559           1 :   CheckBaseWithIndexAndDisplacement(&match71, p1, 3, b0, nullptr);
     560             : 
     561             :   // (M8 + B0) -> [p1, 2, B0, NULL]
     562             :   m8 = graph()->NewNode(m_op, p1, d8);
     563           4 :   ADD_ADDRESSING_OPERAND_USES(m8);
     564           1 :   BaseWithIndexAndDisplacement32Matcher match72(graph()->NewNode(a_op, m8, b0));
     565           1 :   CheckBaseWithIndexAndDisplacement(&match72, p1, 3, b0, nullptr);
     566             : 
     567             :   // (D15 + M8) -> [p1, 2, NULL, D15]
     568             :   m8 = graph()->NewNode(m_op, p1, d8);
     569           4 :   ADD_ADDRESSING_OPERAND_USES(m8);
     570             :   BaseWithIndexAndDisplacement32Matcher match73(
     571           1 :       graph()->NewNode(a_op, d15, m8));
     572           1 :   CheckBaseWithIndexAndDisplacement(&match73, p1, 3, nullptr, d15);
     573             : 
     574             :   // (M8 + D15) -> [p1, 2, NULL, D15]
     575             :   m8 = graph()->NewNode(m_op, p1, d8);
     576           4 :   ADD_ADDRESSING_OPERAND_USES(m8);
     577             :   BaseWithIndexAndDisplacement32Matcher match74(
     578           1 :       graph()->NewNode(a_op, m8, d15));
     579           1 :   CheckBaseWithIndexAndDisplacement(&match74, p1, 3, nullptr, d15);
     580             : 
     581             :   // (B0 + S3) -> [p1, 2, B0, NULL]
     582             :   s3 = graph()->NewNode(s_op, p1, d3);
     583           4 :   ADD_ADDRESSING_OPERAND_USES(s3);
     584           1 :   BaseWithIndexAndDisplacement32Matcher match75(graph()->NewNode(a_op, b0, s3));
     585           1 :   CheckBaseWithIndexAndDisplacement(&match75, p1, 3, b0, nullptr);
     586             : 
     587             :   // (S3 + B0) -> [p1, 2, B0, NULL]
     588             :   s3 = graph()->NewNode(s_op, p1, d3);
     589           4 :   ADD_ADDRESSING_OPERAND_USES(s3);
     590           1 :   BaseWithIndexAndDisplacement32Matcher match76(graph()->NewNode(a_op, s3, b0));
     591           1 :   CheckBaseWithIndexAndDisplacement(&match76, p1, 3, b0, nullptr);
     592             : 
     593             :   // (D15 + S3) -> [p1, 2, NULL, D15]
     594             :   s3 = graph()->NewNode(s_op, p1, d3);
     595           4 :   ADD_ADDRESSING_OPERAND_USES(s3);
     596             :   BaseWithIndexAndDisplacement32Matcher match77(
     597           1 :       graph()->NewNode(a_op, d15, s3));
     598           1 :   CheckBaseWithIndexAndDisplacement(&match77, p1, 3, nullptr, d15);
     599             : 
     600             :   // (S3 + D15) -> [p1, 2, NULL, D15]
     601             :   s3 = graph()->NewNode(s_op, p1, d3);
     602           4 :   ADD_ADDRESSING_OPERAND_USES(s3);
     603             :   BaseWithIndexAndDisplacement32Matcher match78(
     604           1 :       graph()->NewNode(a_op, s3, d15));
     605           1 :   CheckBaseWithIndexAndDisplacement(&match78, p1, 3, nullptr, d15);
     606             : 
     607             :   // (D15 + S3) + B0 -> [p1, 2, b0, d15]
     608             :   s3 = graph()->NewNode(s_op, p1, d3);
     609             :   Node* temp = graph()->NewNode(a_op, d15, s3);
     610           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
     611             :   BaseWithIndexAndDisplacement32Matcher match79(
     612           1 :       graph()->NewNode(a_op, temp, b0));
     613           1 :   CheckBaseWithIndexAndDisplacement(&match79, p1, 3, b0, d15);
     614             : 
     615             :   // (B0 + D15) + S3 -> [p1, 2, b0, d15]
     616             :   s3 = graph()->NewNode(s_op, p1, d3);
     617             :   temp = graph()->NewNode(a_op, b0, d15);
     618           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
     619             :   BaseWithIndexAndDisplacement32Matcher match80(
     620           1 :       graph()->NewNode(a_op, temp, s3));
     621           1 :   CheckBaseWithIndexAndDisplacement(&match80, p1, 3, b0, d15);
     622             : 
     623             :   // (S3 + B0) + D15 -> [NULL, 0, (s3 + b0), d15]
     624             :   // Avoid changing simple addressing to complex addressing
     625             :   s3 = graph()->NewNode(s_op, p1, d3);
     626             :   temp = graph()->NewNode(a_op, s3, b0);
     627           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
     628             :   BaseWithIndexAndDisplacement32Matcher match81(
     629           1 :       graph()->NewNode(a_op, temp, d15));
     630           1 :   CheckBaseWithIndexAndDisplacement(&match81, nullptr, 0, temp, d15);
     631             : 
     632             :   // D15 + (S3 + B0) -> [NULL, 0, (s3 + b0), d15]
     633             :   // Avoid changing simple addressing to complex addressing
     634             :   s3 = graph()->NewNode(s_op, p1, d3);
     635             :   temp = graph()->NewNode(a_op, s3, b0);
     636           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
     637             :   BaseWithIndexAndDisplacement32Matcher match82(
     638           1 :       graph()->NewNode(a_op, d15, temp));
     639           1 :   CheckBaseWithIndexAndDisplacement(&match82, nullptr, 0, temp, d15);
     640             : 
     641             :   // B0 + (D15 + S3) -> [p1, 2, b0, d15]
     642             :   s3 = graph()->NewNode(s_op, p1, d3);
     643             :   temp = graph()->NewNode(a_op, d15, s3);
     644           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
     645             :   BaseWithIndexAndDisplacement32Matcher match83(
     646           1 :       graph()->NewNode(a_op, b0, temp));
     647           1 :   CheckBaseWithIndexAndDisplacement(&match83, p1, 3, b0, d15);
     648             : 
     649             :   // S3 + (B0 + D15) -> [p1, 2, b0, d15]
     650             :   s3 = graph()->NewNode(s_op, p1, d3);
     651             :   temp = graph()->NewNode(a_op, b0, d15);
     652           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
     653             :   BaseWithIndexAndDisplacement32Matcher match84(
     654           1 :       graph()->NewNode(a_op, s3, temp));
     655           1 :   CheckBaseWithIndexAndDisplacement(&match84, p1, 3, b0, d15);
     656             : 
     657             :   // S3 + (B0 - D15) -> [p1, 2, b0, d15, true]
     658             :   s3 = graph()->NewNode(s_op, p1, d3);
     659             :   temp = graph()->NewNode(sub_op, b0, d15);
     660           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
     661             :   BaseWithIndexAndDisplacement32Matcher match85(
     662           1 :       graph()->NewNode(a_op, s3, temp));
     663             :   CheckBaseWithIndexAndDisplacement(&match85, p1, 3, b0, d15,
     664           1 :                                     kNegativeDisplacement);
     665             : 
     666             :   // B0 + (B1 - D15) -> [p1, 2, b0, d15, true]
     667             :   temp = graph()->NewNode(sub_op, b1, d15);
     668           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
     669             :   BaseWithIndexAndDisplacement32Matcher match86(
     670           1 :       graph()->NewNode(a_op, b0, temp));
     671             :   CheckBaseWithIndexAndDisplacement(&match86, b1, 0, b0, d15,
     672           1 :                                     kNegativeDisplacement);
     673             : 
     674             :   // (B0 - D15) + S3 -> [p1, 2, b0, d15, true]
     675             :   s3 = graph()->NewNode(s_op, p1, d3);
     676             :   temp = graph()->NewNode(sub_op, b0, d15);
     677           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
     678             :   BaseWithIndexAndDisplacement32Matcher match87(
     679           1 :       graph()->NewNode(a_op, temp, s3));
     680             :   CheckBaseWithIndexAndDisplacement(&match87, p1, 3, b0, d15,
     681           1 :                                     kNegativeDisplacement);
     682             : 
     683             :   // (B0 + B1) + D15 -> [NULL, 0, (b0 + b1), d15]
     684             :   // Avoid changing simple addressing to complex addressing
     685             :   temp = graph()->NewNode(a_op, b0, b1);
     686           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
     687             :   BaseWithIndexAndDisplacement32Matcher match88(
     688           1 :       graph()->NewNode(a_op, temp, d15));
     689           1 :   CheckBaseWithIndexAndDisplacement(&match88, nullptr, 0, temp, d15);
     690             : 
     691             :   // D15 + (B0 + B1) -> [NULL, 0, (b0 + b1), d15]
     692             :   // Avoid changing simple addressing to complex addressing
     693             :   temp = graph()->NewNode(a_op, b0, b1);
     694           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
     695             :   BaseWithIndexAndDisplacement32Matcher match89(
     696           1 :       graph()->NewNode(a_op, d15, temp));
     697           1 :   CheckBaseWithIndexAndDisplacement(&match89, nullptr, 0, temp, d15);
     698             : 
     699             :   // 5 INPUT - with none-addressing operand uses
     700             : 
     701             :   // (B0 + M1) -> [b0, 0, m1, NULL]
     702             :   m1 = graph()->NewNode(m_op, p1, d1);
     703           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m1);
     704           1 :   BaseWithIndexAndDisplacement32Matcher match90(graph()->NewNode(a_op, b0, m1));
     705           1 :   CheckBaseWithIndexAndDisplacement(&match90, b0, 0, m1, nullptr);
     706             : 
     707             :   // (M1 + B0) -> [b0, 0, m1, NULL]
     708             :   m1 = graph()->NewNode(m_op, p1, d1);
     709           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m1);
     710           1 :   BaseWithIndexAndDisplacement32Matcher match91(graph()->NewNode(a_op, m1, b0));
     711           1 :   CheckBaseWithIndexAndDisplacement(&match91, b0, 0, m1, nullptr);
     712             : 
     713             :   // (D15 + M1) -> [NULL, 0, m1, d15]
     714             :   m1 = graph()->NewNode(m_op, p1, d1);
     715           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m1);
     716             :   BaseWithIndexAndDisplacement32Matcher match92(
     717           1 :       graph()->NewNode(a_op, d15, m1));
     718           1 :   CheckBaseWithIndexAndDisplacement(&match92, nullptr, 0, m1, d15);
     719             : 
     720             :   // (M1 + D15) -> [NULL, 0, m1, d15]
     721             :   m1 = graph()->NewNode(m_op, p1, d1);
     722           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m1);
     723             :   BaseWithIndexAndDisplacement32Matcher match93(
     724           1 :       graph()->NewNode(a_op, m1, d15));
     725           1 :   CheckBaseWithIndexAndDisplacement(&match93, nullptr, 0, m1, d15);
     726             : 
     727             :   // (B0 + S0) -> [b0, 0, s0, NULL]
     728             :   s0 = graph()->NewNode(s_op, p1, d0);
     729           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s0);
     730           1 :   BaseWithIndexAndDisplacement32Matcher match94(graph()->NewNode(a_op, b0, s0));
     731           1 :   CheckBaseWithIndexAndDisplacement(&match94, b0, 0, s0, nullptr);
     732             : 
     733             :   // (S0 + B0) -> [b0, 0, s0, NULL]
     734             :   s0 = graph()->NewNode(s_op, p1, d0);
     735           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s0);
     736           1 :   BaseWithIndexAndDisplacement32Matcher match95(graph()->NewNode(a_op, s0, b0));
     737           1 :   CheckBaseWithIndexAndDisplacement(&match95, b0, 0, s0, nullptr);
     738             : 
     739             :   // (D15 + S0) -> [NULL, 0, s0, d15]
     740             :   s0 = graph()->NewNode(s_op, p1, d0);
     741           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s0);
     742             :   BaseWithIndexAndDisplacement32Matcher match96(
     743           1 :       graph()->NewNode(a_op, d15, s0));
     744           1 :   CheckBaseWithIndexAndDisplacement(&match96, nullptr, 0, s0, d15);
     745             : 
     746             :   // (S0 + D15) -> [NULL, 0, s0, d15]
     747             :   s0 = graph()->NewNode(s_op, p1, d0);
     748           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s0);
     749             :   BaseWithIndexAndDisplacement32Matcher match97(
     750           1 :       graph()->NewNode(a_op, s0, d15));
     751           1 :   CheckBaseWithIndexAndDisplacement(&match97, nullptr, 0, s0, d15);
     752             : 
     753             :   // (B0 + M2) -> [b0, 0, m2, NULL]
     754             :   m2 = graph()->NewNode(m_op, p1, d2);
     755           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m2);
     756           1 :   BaseWithIndexAndDisplacement32Matcher match98(graph()->NewNode(a_op, b0, m2));
     757           1 :   CheckBaseWithIndexAndDisplacement(&match98, b0, 0, m2, nullptr);
     758             : 
     759             :   // (M2 + B0) -> [b0, 0, m2, NULL]
     760             :   m2 = graph()->NewNode(m_op, p1, d2);
     761           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m2);
     762           1 :   BaseWithIndexAndDisplacement32Matcher match99(graph()->NewNode(a_op, m2, b0));
     763           1 :   CheckBaseWithIndexAndDisplacement(&match99, b0, 0, m2, nullptr);
     764             : 
     765             :   // (D15 + M2) -> [NULL, 0, m2, d15]
     766             :   m2 = graph()->NewNode(m_op, p1, d2);
     767           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m2);
     768             :   BaseWithIndexAndDisplacement32Matcher match100(
     769           1 :       graph()->NewNode(a_op, d15, m2));
     770           1 :   CheckBaseWithIndexAndDisplacement(&match100, nullptr, 0, m2, d15);
     771             : 
     772             :   // (M2 + D15) -> [NULL, 0, m2, d15]
     773             :   m2 = graph()->NewNode(m_op, p1, d2);
     774           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m2);
     775             :   BaseWithIndexAndDisplacement32Matcher match101(
     776           1 :       graph()->NewNode(a_op, m2, d15));
     777           1 :   CheckBaseWithIndexAndDisplacement(&match101, nullptr, 0, m2, d15);
     778             : 
     779             :   // (B0 + S1) -> [b0, 0, s1, NULL]
     780             :   s1 = graph()->NewNode(s_op, p1, d1);
     781           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s1);
     782             :   BaseWithIndexAndDisplacement32Matcher match102(
     783           1 :       graph()->NewNode(a_op, b0, s1));
     784           1 :   CheckBaseWithIndexAndDisplacement(&match102, b0, 0, s1, nullptr);
     785             : 
     786             :   // (S1 + B0) -> [b0, 0, s1, NULL]
     787             :   s1 = graph()->NewNode(s_op, p1, d1);
     788           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s1);
     789             :   BaseWithIndexAndDisplacement32Matcher match103(
     790           1 :       graph()->NewNode(a_op, s1, b0));
     791           1 :   CheckBaseWithIndexAndDisplacement(&match103, b0, 0, s1, nullptr);
     792             : 
     793             :   // (D15 + S1) -> [NULL, 0, s1, d15]
     794             :   s1 = graph()->NewNode(s_op, p1, d1);
     795           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s1);
     796             :   BaseWithIndexAndDisplacement32Matcher match104(
     797           1 :       graph()->NewNode(a_op, d15, s1));
     798           1 :   CheckBaseWithIndexAndDisplacement(&match104, nullptr, 0, s1, d15);
     799             : 
     800             :   // (S1 + D15) -> [NULL, 0, s1, d15]
     801             :   s1 = graph()->NewNode(s_op, p1, d1);
     802           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s1);
     803             :   BaseWithIndexAndDisplacement32Matcher match105(
     804           1 :       graph()->NewNode(a_op, s1, d15));
     805           1 :   CheckBaseWithIndexAndDisplacement(&match105, nullptr, 0, s1, d15);
     806             : 
     807             :   // (B0 + M4) -> [b0, 0, m4, NULL]
     808             :   m4 = graph()->NewNode(m_op, p1, d4);
     809           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m4);
     810             :   BaseWithIndexAndDisplacement32Matcher match106(
     811           1 :       graph()->NewNode(a_op, b0, m4));
     812           1 :   CheckBaseWithIndexAndDisplacement(&match106, b0, 0, m4, nullptr);
     813             : 
     814             :   // (M4 + B0) -> [b0, 0, m4, NULL]
     815             :   m4 = graph()->NewNode(m_op, p1, d4);
     816           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m4);
     817             :   BaseWithIndexAndDisplacement32Matcher match107(
     818           1 :       graph()->NewNode(a_op, m4, b0));
     819           1 :   CheckBaseWithIndexAndDisplacement(&match107, b0, 0, m4, nullptr);
     820             : 
     821             :   // (D15 + M4) -> [NULL, 0, m4, d15]
     822             :   m4 = graph()->NewNode(m_op, p1, d4);
     823           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m4);
     824             :   BaseWithIndexAndDisplacement32Matcher match108(
     825           1 :       graph()->NewNode(a_op, d15, m4));
     826           1 :   CheckBaseWithIndexAndDisplacement(&match108, nullptr, 0, m4, d15);
     827             : 
     828             :   // (M4 + D15) -> [NULL, 0, m4, d15]
     829             :   m4 = graph()->NewNode(m_op, p1, d4);
     830           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m4);
     831             :   BaseWithIndexAndDisplacement32Matcher match109(
     832           1 :       graph()->NewNode(a_op, m4, d15));
     833           1 :   CheckBaseWithIndexAndDisplacement(&match109, nullptr, 0, m4, d15);
     834             : 
     835             :   // (B0 + S2) -> [b0, 0, s2, NULL]
     836             :   s2 = graph()->NewNode(s_op, p1, d2);
     837           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s2);
     838             :   BaseWithIndexAndDisplacement32Matcher match110(
     839           1 :       graph()->NewNode(a_op, b0, s2));
     840           1 :   CheckBaseWithIndexAndDisplacement(&match110, b0, 0, s2, nullptr);
     841             : 
     842             :   // (S2 + B0) -> [b0, 0, s2, NULL]
     843             :   s2 = graph()->NewNode(s_op, p1, d2);
     844           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s2);
     845             :   BaseWithIndexAndDisplacement32Matcher match111(
     846           1 :       graph()->NewNode(a_op, s2, b0));
     847           1 :   CheckBaseWithIndexAndDisplacement(&match111, b0, 0, s2, nullptr);
     848             : 
     849             :   // (D15 + S2) -> [NULL, 0, s2, d15]
     850             :   s2 = graph()->NewNode(s_op, p1, d2);
     851           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s2);
     852             :   BaseWithIndexAndDisplacement32Matcher match112(
     853           1 :       graph()->NewNode(a_op, d15, s2));
     854           1 :   CheckBaseWithIndexAndDisplacement(&match112, nullptr, 0, s2, d15);
     855             : 
     856             :   // (S2 + D15) -> [NULL, 0, s2, d15]
     857             :   s2 = graph()->NewNode(s_op, p1, d2);
     858           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s2);
     859             :   BaseWithIndexAndDisplacement32Matcher match113(
     860           1 :       graph()->NewNode(a_op, s2, d15));
     861           1 :   CheckBaseWithIndexAndDisplacement(&match113, nullptr, 0, s2, d15);
     862             : 
     863             :   // (B0 + M8) -> [b0, 0, m8, NULL]
     864             :   m8 = graph()->NewNode(m_op, p1, d8);
     865           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m8);
     866             :   BaseWithIndexAndDisplacement32Matcher match114(
     867           1 :       graph()->NewNode(a_op, b0, m8));
     868           1 :   CheckBaseWithIndexAndDisplacement(&match114, b0, 0, m8, nullptr);
     869             : 
     870             :   // (M8 + B0) -> [b0, 0, m8, NULL]
     871             :   m8 = graph()->NewNode(m_op, p1, d8);
     872           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m8);
     873             :   BaseWithIndexAndDisplacement32Matcher match115(
     874           1 :       graph()->NewNode(a_op, m8, b0));
     875           1 :   CheckBaseWithIndexAndDisplacement(&match115, b0, 0, m8, nullptr);
     876             : 
     877             :   // (D15 + M8) -> [NULL, 0, m8, d15]
     878             :   m8 = graph()->NewNode(m_op, p1, d8);
     879           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m8);
     880             :   BaseWithIndexAndDisplacement32Matcher match116(
     881           1 :       graph()->NewNode(a_op, d15, m8));
     882           1 :   CheckBaseWithIndexAndDisplacement(&match116, nullptr, 0, m8, d15);
     883             : 
     884             :   // (M8 + D15) -> [NULL, 0, m8, d15]
     885             :   m8 = graph()->NewNode(m_op, p1, d8);
     886           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m8);
     887             :   BaseWithIndexAndDisplacement32Matcher match117(
     888           1 :       graph()->NewNode(a_op, m8, d15));
     889           1 :   CheckBaseWithIndexAndDisplacement(&match117, nullptr, 0, m8, d15);
     890             : 
     891             :   // (B0 + S3) -> [b0, 0, s3, NULL]
     892             :   s3 = graph()->NewNode(s_op, p1, d3);
     893           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s3);
     894             :   BaseWithIndexAndDisplacement32Matcher match118(
     895           1 :       graph()->NewNode(a_op, b0, s3));
     896           1 :   CheckBaseWithIndexAndDisplacement(&match118, b0, 0, s3, nullptr);
     897             : 
     898             :   // (S3 + B0) -> [b0, 0, s3, NULL]
     899             :   s3 = graph()->NewNode(s_op, p1, d3);
     900           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s3);
     901             :   BaseWithIndexAndDisplacement32Matcher match119(
     902           1 :       graph()->NewNode(a_op, s3, b0));
     903           1 :   CheckBaseWithIndexAndDisplacement(&match119, b0, 0, s3, nullptr);
     904             : 
     905             :   // (D15 + S3) -> [NULL, 0, s3, d15]
     906             :   s3 = graph()->NewNode(s_op, p1, d3);
     907           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s3);
     908             :   BaseWithIndexAndDisplacement32Matcher match120(
     909           1 :       graph()->NewNode(a_op, d15, s3));
     910           1 :   CheckBaseWithIndexAndDisplacement(&match120, nullptr, 0, s3, d15);
     911             : 
     912             :   // (S3 + D15) -> [NULL, 0, s3, d15]
     913             :   s3 = graph()->NewNode(s_op, p1, d3);
     914           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s3);
     915             :   BaseWithIndexAndDisplacement32Matcher match121(
     916           1 :       graph()->NewNode(a_op, s3, d15));
     917           1 :   CheckBaseWithIndexAndDisplacement(&match121, nullptr, 0, s3, d15);
     918             : 
     919             :   // (D15 + S3) + B0 -> [b0, 0, (D15 + S3), NULL]
     920             :   s3 = graph()->NewNode(s_op, p1, d3);
     921             :   temp = graph()->NewNode(a_op, d15, s3);
     922           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
     923             :   BaseWithIndexAndDisplacement32Matcher match122(
     924           1 :       graph()->NewNode(a_op, temp, b0));
     925           1 :   CheckBaseWithIndexAndDisplacement(&match122, b0, 0, temp, nullptr);
     926             : 
     927             :   // (B0 + D15) + S3 -> [p1, 3, (B0 + D15), NULL]
     928             :   s3 = graph()->NewNode(s_op, p1, d3);
     929             :   temp = graph()->NewNode(a_op, b0, d15);
     930           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
     931             :   BaseWithIndexAndDisplacement32Matcher match123(
     932           1 :       graph()->NewNode(a_op, temp, s3));
     933           1 :   CheckBaseWithIndexAndDisplacement(&match123, p1, 3, temp, nullptr);
     934             : 
     935             :   // (S3 + B0) + D15 -> [NULL, 0, (S3 + B0), d15]
     936             :   s3 = graph()->NewNode(s_op, p1, d3);
     937             :   temp = graph()->NewNode(a_op, s3, b0);
     938           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
     939             :   BaseWithIndexAndDisplacement32Matcher match124(
     940           1 :       graph()->NewNode(a_op, temp, d15));
     941           1 :   CheckBaseWithIndexAndDisplacement(&match124, nullptr, 0, temp, d15);
     942             : 
     943             :   // D15 + (S3 + B0) -> [NULL, 0, (S3 + B0), d15]
     944             :   s3 = graph()->NewNode(s_op, p1, d3);
     945             :   temp = graph()->NewNode(a_op, s3, b0);
     946           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
     947             :   BaseWithIndexAndDisplacement32Matcher match125(
     948           1 :       graph()->NewNode(a_op, d15, temp));
     949           1 :   CheckBaseWithIndexAndDisplacement(&match125, nullptr, 0, temp, d15);
     950             : 
     951             :   // B0 + (D15 + S3) -> [b0, 0, (D15 + S3), NULL]
     952             :   s3 = graph()->NewNode(s_op, p1, d3);
     953             :   temp = graph()->NewNode(a_op, d15, s3);
     954           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
     955             :   BaseWithIndexAndDisplacement32Matcher match126(
     956           1 :       graph()->NewNode(a_op, b0, temp));
     957           1 :   CheckBaseWithIndexAndDisplacement(&match126, b0, 0, temp, nullptr);
     958             : 
     959             :   // S3 + (B0 + D15) -> [p1, 3, (B0 + D15), NULL]
     960             :   s3 = graph()->NewNode(s_op, p1, d3);
     961             :   temp = graph()->NewNode(a_op, b0, d15);
     962           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
     963             :   BaseWithIndexAndDisplacement32Matcher match127(
     964           1 :       graph()->NewNode(a_op, s3, temp));
     965           1 :   CheckBaseWithIndexAndDisplacement(&match127, p1, 3, temp, nullptr);
     966             : 
     967             :   // S3 + (B0 - D15) -> [p1, 3, (B0 - D15), NULL]
     968             :   s3 = graph()->NewNode(s_op, p1, d3);
     969             :   temp = graph()->NewNode(sub_op, b0, d15);
     970           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
     971             :   BaseWithIndexAndDisplacement32Matcher match128(
     972           1 :       graph()->NewNode(a_op, s3, temp));
     973           1 :   CheckBaseWithIndexAndDisplacement(&match128, p1, 3, temp, nullptr);
     974             : 
     975             :   // B0 + (B1 - D15) -> [b0, 0, (B1 - D15), NULL]
     976             :   temp = graph()->NewNode(sub_op, b1, d15);
     977           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
     978             :   BaseWithIndexAndDisplacement32Matcher match129(
     979           1 :       graph()->NewNode(a_op, b0, temp));
     980           1 :   CheckBaseWithIndexAndDisplacement(&match129, b0, 0, temp, nullptr);
     981             : 
     982             :   // (B0 - D15) + S3 -> [p1, 3, temp, NULL]
     983             :   s3 = graph()->NewNode(s_op, p1, d3);
     984             :   temp = graph()->NewNode(sub_op, b0, d15);
     985           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
     986             :   BaseWithIndexAndDisplacement32Matcher match130(
     987           1 :       graph()->NewNode(a_op, temp, s3));
     988           1 :   CheckBaseWithIndexAndDisplacement(&match130, p1, 3, temp, nullptr);
     989             : 
     990             :   // (B0 + B1) + D15 -> [NULL, 0, (B0 + B1), d15]
     991             :   temp = graph()->NewNode(a_op, b0, b1);
     992           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
     993             :   BaseWithIndexAndDisplacement32Matcher match131(
     994           1 :       graph()->NewNode(a_op, temp, d15));
     995           1 :   CheckBaseWithIndexAndDisplacement(&match131, nullptr, 0, temp, d15);
     996             : 
     997             :   // D15 + (B0 + B1) -> [NULL, 0, (B0 + B1), d15]
     998             :   temp = graph()->NewNode(a_op, b0, b1);
     999           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
    1000             :   BaseWithIndexAndDisplacement32Matcher match132(
    1001           1 :       graph()->NewNode(a_op, d15, temp));
    1002           1 :   CheckBaseWithIndexAndDisplacement(&match132, nullptr, 0, temp, d15);
    1003           1 : }
    1004             : 
    1005             : 
    1006       15419 : TEST_F(NodeMatcherTest, ScaledWithOffset64Matcher) {
    1007           1 :   graph()->SetStart(graph()->NewNode(common()->Start(0)));
    1008             : 
    1009           1 :   const Operator* d0_op = common()->Int64Constant(0);
    1010             :   Node* d0 = graph()->NewNode(d0_op);
    1011             :   USE(d0);
    1012           1 :   const Operator* d1_op = common()->Int64Constant(1);
    1013             :   Node* d1 = graph()->NewNode(d1_op);
    1014             :   USE(d1);
    1015           1 :   const Operator* d2_op = common()->Int64Constant(2);
    1016             :   Node* d2 = graph()->NewNode(d2_op);
    1017             :   USE(d2);
    1018           1 :   const Operator* d3_op = common()->Int64Constant(3);
    1019             :   Node* d3 = graph()->NewNode(d3_op);
    1020             :   USE(d3);
    1021           1 :   const Operator* d4_op = common()->Int64Constant(4);
    1022             :   Node* d4 = graph()->NewNode(d4_op);
    1023             :   USE(d4);
    1024           1 :   const Operator* d5_op = common()->Int64Constant(5);
    1025             :   Node* d5 = graph()->NewNode(d5_op);
    1026             :   USE(d5);
    1027           1 :   const Operator* d7_op = common()->Int64Constant(7);
    1028             :   Node* d7 = graph()->NewNode(d7_op);
    1029             :   USE(d7);
    1030           1 :   const Operator* d8_op = common()->Int64Constant(8);
    1031             :   Node* d8 = graph()->NewNode(d8_op);
    1032             :   USE(d8);
    1033           1 :   const Operator* d9_op = common()->Int64Constant(9);
    1034             :   Node* d9 = graph()->NewNode(d9_op);
    1035             :   USE(d8);
    1036           1 :   const Operator* d15_op = common()->Int64Constant(15);
    1037             :   Node* d15 = graph()->NewNode(d15_op);
    1038             :   USE(d15);
    1039           1 :   const Operator* d15_32_op = common()->Int32Constant(15);
    1040             :   Node* d15_32 = graph()->NewNode(d15_32_op);
    1041             :   USE(d15_32);
    1042             : 
    1043           1 :   const Operator* b0_op = common()->Parameter(0);
    1044             :   Node* b0 = graph()->NewNode(b0_op, graph()->start());
    1045             :   USE(b0);
    1046           1 :   const Operator* b1_op = common()->Parameter(1);
    1047             :   Node* b1 = graph()->NewNode(b1_op, graph()->start());
    1048             :   USE(b0);
    1049             : 
    1050           1 :   const Operator* p1_op = common()->Parameter(3);
    1051             :   Node* p1 = graph()->NewNode(p1_op, graph()->start());
    1052             :   USE(p1);
    1053             : 
    1054           1 :   const Operator* a_op = machine()->Int64Add();
    1055             :   USE(a_op);
    1056             : 
    1057           1 :   const Operator* sub_op = machine()->Int64Sub();
    1058             :   USE(sub_op);
    1059             : 
    1060           1 :   const Operator* m_op = machine()->Int64Mul();
    1061             :   Node* m1 = graph()->NewNode(m_op, p1, d1);
    1062             :   Node* m2 = graph()->NewNode(m_op, p1, d2);
    1063             :   Node* m3 = graph()->NewNode(m_op, p1, d3);
    1064             :   Node* m4 = graph()->NewNode(m_op, p1, d4);
    1065             :   Node* m5 = graph()->NewNode(m_op, p1, d5);
    1066             :   Node* m7 = graph()->NewNode(m_op, p1, d7);
    1067             :   Node* m8 = graph()->NewNode(m_op, p1, d8);
    1068             :   Node* m9 = graph()->NewNode(m_op, p1, d9);
    1069             :   USE(m1);
    1070             :   USE(m2);
    1071             :   USE(m3);
    1072             :   USE(m4);
    1073             :   USE(m5);
    1074             :   USE(m7);
    1075             :   USE(m8);
    1076             :   USE(m9);
    1077             : 
    1078           1 :   const Operator* s_op = machine()->Word64Shl();
    1079             :   Node* s0 = graph()->NewNode(s_op, p1, d0);
    1080             :   Node* s1 = graph()->NewNode(s_op, p1, d1);
    1081             :   Node* s2 = graph()->NewNode(s_op, p1, d2);
    1082             :   Node* s3 = graph()->NewNode(s_op, p1, d3);
    1083             :   Node* s4 = graph()->NewNode(s_op, p1, d4);
    1084             :   USE(s0);
    1085             :   USE(s1);
    1086             :   USE(s2);
    1087             :   USE(s3);
    1088             :   USE(s4);
    1089             : 
    1090             :   const StoreRepresentation rep(MachineRepresentation::kWord32,
    1091             :                                 kNoWriteBarrier);
    1092             :   USE(rep);
    1093             : 
    1094             :   // 1 INPUT
    1095             : 
    1096             :   // Only relevant test dases is Checking for non-match.
    1097           1 :   BaseWithIndexAndDisplacement64Matcher match0(d15);
    1098           2 :   EXPECT_FALSE(match0.matches());
    1099             : 
    1100             :   // 2 INPUT
    1101             : 
    1102             :   // (B0 + B1) -> [B0, 0, B1, NULL]
    1103           1 :   BaseWithIndexAndDisplacement64Matcher match1(graph()->NewNode(a_op, b0, b1));
    1104           1 :   CheckBaseWithIndexAndDisplacement(&match1, b1, 0, b0, nullptr);
    1105             : 
    1106             :   // (B0 + D15) -> [NULL, 0, B0, D15]
    1107           1 :   BaseWithIndexAndDisplacement64Matcher match2(graph()->NewNode(a_op, b0, d15));
    1108           1 :   CheckBaseWithIndexAndDisplacement(&match2, nullptr, 0, b0, d15);
    1109             : 
    1110             :   BaseWithIndexAndDisplacement64Matcher match2_32(
    1111           1 :       graph()->NewNode(a_op, b0, d15_32));
    1112           1 :   CheckBaseWithIndexAndDisplacement(&match2_32, nullptr, 0, b0, d15_32);
    1113             : 
    1114             :   // (D15 + B0) -> [NULL, 0, B0, D15]
    1115           1 :   BaseWithIndexAndDisplacement64Matcher match3(graph()->NewNode(a_op, d15, b0));
    1116           1 :   CheckBaseWithIndexAndDisplacement(&match3, nullptr, 0, b0, d15);
    1117             : 
    1118             :   // (B0 + M1) -> [p1, 0, B0, NULL]
    1119           1 :   BaseWithIndexAndDisplacement64Matcher match4(graph()->NewNode(a_op, b0, m1));
    1120           1 :   CheckBaseWithIndexAndDisplacement(&match4, p1, 0, b0, nullptr);
    1121             : 
    1122             :   // (M1 + B0) -> [p1, 0, B0, NULL]
    1123             :   m1 = graph()->NewNode(m_op, p1, d1);
    1124           1 :   BaseWithIndexAndDisplacement64Matcher match5(graph()->NewNode(a_op, m1, b0));
    1125           1 :   CheckBaseWithIndexAndDisplacement(&match5, p1, 0, b0, nullptr);
    1126             : 
    1127             :   // (D15 + M1) -> [P1, 0, NULL, D15]
    1128             :   m1 = graph()->NewNode(m_op, p1, d1);
    1129           1 :   BaseWithIndexAndDisplacement64Matcher match6(graph()->NewNode(a_op, d15, m1));
    1130           1 :   CheckBaseWithIndexAndDisplacement(&match6, p1, 0, nullptr, d15);
    1131             : 
    1132             :   // (M1 + D15) -> [P1, 0, NULL, D15]
    1133             :   m1 = graph()->NewNode(m_op, p1, d1);
    1134           1 :   BaseWithIndexAndDisplacement64Matcher match7(graph()->NewNode(a_op, m1, d15));
    1135           1 :   CheckBaseWithIndexAndDisplacement(&match7, p1, 0, nullptr, d15);
    1136             : 
    1137             :   // (B0 + S0) -> [p1, 0, B0, NULL]
    1138           1 :   BaseWithIndexAndDisplacement64Matcher match8(graph()->NewNode(a_op, b0, s0));
    1139           1 :   CheckBaseWithIndexAndDisplacement(&match8, p1, 0, b0, nullptr);
    1140             : 
    1141             :   // (S0 + B0) -> [p1, 0, B0, NULL]
    1142             :   s0 = graph()->NewNode(s_op, p1, d0);
    1143           1 :   BaseWithIndexAndDisplacement64Matcher match9(graph()->NewNode(a_op, s0, b0));
    1144           1 :   CheckBaseWithIndexAndDisplacement(&match9, p1, 0, b0, nullptr);
    1145             : 
    1146             :   // (D15 + S0) -> [P1, 0, NULL, D15]
    1147             :   s0 = graph()->NewNode(s_op, p1, d0);
    1148             :   BaseWithIndexAndDisplacement64Matcher match10(
    1149           1 :       graph()->NewNode(a_op, d15, s0));
    1150           1 :   CheckBaseWithIndexAndDisplacement(&match10, p1, 0, nullptr, d15);
    1151             : 
    1152             :   // (S0 + D15) -> [P1, 0, NULL, D15]
    1153             :   s0 = graph()->NewNode(s_op, p1, d0);
    1154             :   BaseWithIndexAndDisplacement64Matcher match11(
    1155           1 :       graph()->NewNode(a_op, s0, d15));
    1156           1 :   CheckBaseWithIndexAndDisplacement(&match11, p1, 0, nullptr, d15);
    1157             : 
    1158             :   // (B0 + M2) -> [p1, 1, B0, NULL]
    1159           1 :   BaseWithIndexAndDisplacement64Matcher match12(graph()->NewNode(a_op, b0, m2));
    1160           1 :   CheckBaseWithIndexAndDisplacement(&match12, p1, 1, b0, nullptr);
    1161             : 
    1162             :   // (M2 + B0) -> [p1, 1, B0, NULL]
    1163             :   m2 = graph()->NewNode(m_op, p1, d2);
    1164           1 :   BaseWithIndexAndDisplacement64Matcher match13(graph()->NewNode(a_op, m2, b0));
    1165           1 :   CheckBaseWithIndexAndDisplacement(&match13, p1, 1, b0, nullptr);
    1166             : 
    1167             :   // (D15 + M2) -> [P1, 1, NULL, D15]
    1168             :   m2 = graph()->NewNode(m_op, p1, d2);
    1169             :   BaseWithIndexAndDisplacement64Matcher match14(
    1170           1 :       graph()->NewNode(a_op, d15, m2));
    1171           1 :   CheckBaseWithIndexAndDisplacement(&match14, p1, 1, nullptr, d15);
    1172             : 
    1173             :   // (M2 + D15) -> [P1, 1, NULL, D15]
    1174             :   m2 = graph()->NewNode(m_op, p1, d2);
    1175             :   BaseWithIndexAndDisplacement64Matcher match15(
    1176           1 :       graph()->NewNode(a_op, m2, d15));
    1177           1 :   CheckBaseWithIndexAndDisplacement(&match15, p1, 1, nullptr, d15);
    1178             : 
    1179             :   // (B0 + S1) -> [p1, 1, B0, NULL]
    1180           1 :   BaseWithIndexAndDisplacement64Matcher match16(graph()->NewNode(a_op, b0, s1));
    1181           1 :   CheckBaseWithIndexAndDisplacement(&match16, p1, 1, b0, nullptr);
    1182             : 
    1183             :   // (S1 + B0) -> [p1, 1, B0, NULL]
    1184             :   s1 = graph()->NewNode(s_op, p1, d1);
    1185           1 :   BaseWithIndexAndDisplacement64Matcher match17(graph()->NewNode(a_op, s1, b0));
    1186           1 :   CheckBaseWithIndexAndDisplacement(&match17, p1, 1, b0, nullptr);
    1187             : 
    1188             :   // (D15 + S1) -> [P1, 1, NULL, D15]
    1189             :   s1 = graph()->NewNode(s_op, p1, d1);
    1190             :   BaseWithIndexAndDisplacement64Matcher match18(
    1191           1 :       graph()->NewNode(a_op, d15, s1));
    1192           1 :   CheckBaseWithIndexAndDisplacement(&match18, p1, 1, nullptr, d15);
    1193             : 
    1194             :   // (S1 + D15) -> [P1, 1, NULL, D15]
    1195             :   s1 = graph()->NewNode(s_op, p1, d1);
    1196             :   BaseWithIndexAndDisplacement64Matcher match19(
    1197           1 :       graph()->NewNode(a_op, s1, d15));
    1198           1 :   CheckBaseWithIndexAndDisplacement(&match19, p1, 1, nullptr, d15);
    1199             : 
    1200             :   // (B0 + M4) -> [p1, 2, B0, NULL]
    1201           1 :   BaseWithIndexAndDisplacement64Matcher match20(graph()->NewNode(a_op, b0, m4));
    1202           1 :   CheckBaseWithIndexAndDisplacement(&match20, p1, 2, b0, nullptr);
    1203             : 
    1204             :   // (M4 + B0) -> [p1, 2, B0, NULL]
    1205             :   m4 = graph()->NewNode(m_op, p1, d4);
    1206           1 :   BaseWithIndexAndDisplacement64Matcher match21(graph()->NewNode(a_op, m4, b0));
    1207           1 :   CheckBaseWithIndexAndDisplacement(&match21, p1, 2, b0, nullptr);
    1208             : 
    1209             :   // (D15 + M4) -> [p1, 2, NULL, D15]
    1210             :   m4 = graph()->NewNode(m_op, p1, d4);
    1211             :   BaseWithIndexAndDisplacement64Matcher match22(
    1212           1 :       graph()->NewNode(a_op, d15, m4));
    1213           1 :   CheckBaseWithIndexAndDisplacement(&match22, p1, 2, nullptr, d15);
    1214             : 
    1215             :   // (M4 + D15) -> [p1, 2, NULL, D15]
    1216             :   m4 = graph()->NewNode(m_op, p1, d4);
    1217             :   BaseWithIndexAndDisplacement64Matcher match23(
    1218           1 :       graph()->NewNode(a_op, m4, d15));
    1219           1 :   CheckBaseWithIndexAndDisplacement(&match23, p1, 2, nullptr, d15);
    1220             : 
    1221             :   // (B0 + S2) -> [p1, 2, B0, NULL]
    1222           1 :   BaseWithIndexAndDisplacement64Matcher match24(graph()->NewNode(a_op, b0, s2));
    1223           1 :   CheckBaseWithIndexAndDisplacement(&match24, p1, 2, b0, nullptr);
    1224             : 
    1225             :   // (S2 + B0) -> [p1, 2, B0, NULL]
    1226             :   s2 = graph()->NewNode(s_op, p1, d2);
    1227           1 :   BaseWithIndexAndDisplacement64Matcher match25(graph()->NewNode(a_op, s2, b0));
    1228           1 :   CheckBaseWithIndexAndDisplacement(&match25, p1, 2, b0, nullptr);
    1229             : 
    1230             :   // (D15 + S2) -> [p1, 2, NULL, D15]
    1231             :   s2 = graph()->NewNode(s_op, p1, d2);
    1232             :   BaseWithIndexAndDisplacement64Matcher match26(
    1233           1 :       graph()->NewNode(a_op, d15, s2));
    1234           1 :   CheckBaseWithIndexAndDisplacement(&match26, p1, 2, nullptr, d15);
    1235             : 
    1236             :   // (S2 + D15) -> [p1, 2, NULL, D15]
    1237             :   s2 = graph()->NewNode(s_op, p1, d2);
    1238             :   BaseWithIndexAndDisplacement64Matcher match27(
    1239           1 :       graph()->NewNode(a_op, s2, d15));
    1240           1 :   CheckBaseWithIndexAndDisplacement(&match27, p1, 2, nullptr, d15);
    1241             : 
    1242             :   // (B0 + M8) -> [p1, 2, B0, NULL]
    1243           1 :   BaseWithIndexAndDisplacement64Matcher match28(graph()->NewNode(a_op, b0, m8));
    1244           1 :   CheckBaseWithIndexAndDisplacement(&match28, p1, 3, b0, nullptr);
    1245             : 
    1246             :   // (M8 + B0) -> [p1, 2, B0, NULL]
    1247             :   m8 = graph()->NewNode(m_op, p1, d8);
    1248           1 :   BaseWithIndexAndDisplacement64Matcher match29(graph()->NewNode(a_op, m8, b0));
    1249           1 :   CheckBaseWithIndexAndDisplacement(&match29, p1, 3, b0, nullptr);
    1250             : 
    1251             :   // (D15 + M8) -> [p1, 2, NULL, D15]
    1252             :   m8 = graph()->NewNode(m_op, p1, d8);
    1253             :   BaseWithIndexAndDisplacement64Matcher match30(
    1254           1 :       graph()->NewNode(a_op, d15, m8));
    1255           1 :   CheckBaseWithIndexAndDisplacement(&match30, p1, 3, nullptr, d15);
    1256             : 
    1257             :   // (M8 + D15) -> [p1, 2, NULL, D15]
    1258             :   m8 = graph()->NewNode(m_op, p1, d8);
    1259             :   BaseWithIndexAndDisplacement64Matcher match31(
    1260           1 :       graph()->NewNode(a_op, m8, d15));
    1261           1 :   CheckBaseWithIndexAndDisplacement(&match31, p1, 3, nullptr, d15);
    1262             : 
    1263             :   // (B0 + S3) -> [p1, 2, B0, NULL]
    1264           1 :   BaseWithIndexAndDisplacement64Matcher match32(graph()->NewNode(a_op, b0, s3));
    1265           1 :   CheckBaseWithIndexAndDisplacement(&match32, p1, 3, b0, nullptr);
    1266             : 
    1267             :   // (S3 + B0) -> [p1, 2, B0, NULL]
    1268             :   s3 = graph()->NewNode(s_op, p1, d3);
    1269           1 :   BaseWithIndexAndDisplacement64Matcher match33(graph()->NewNode(a_op, s3, b0));
    1270           1 :   CheckBaseWithIndexAndDisplacement(&match33, p1, 3, b0, nullptr);
    1271             : 
    1272             :   // (D15 + S3) -> [p1, 2, NULL, D15]
    1273             :   s3 = graph()->NewNode(s_op, p1, d3);
    1274             :   BaseWithIndexAndDisplacement64Matcher match34(
    1275           1 :       graph()->NewNode(a_op, d15, s3));
    1276           1 :   CheckBaseWithIndexAndDisplacement(&match34, p1, 3, nullptr, d15);
    1277             : 
    1278             :   // (S3 + D15) -> [p1, 2, NULL, D15]
    1279             :   s3 = graph()->NewNode(s_op, p1, d3);
    1280             :   BaseWithIndexAndDisplacement64Matcher match35(
    1281           1 :       graph()->NewNode(a_op, s3, d15));
    1282           1 :   CheckBaseWithIndexAndDisplacement(&match35, p1, 3, nullptr, d15);
    1283             : 
    1284             :   // 2 INPUT - NEGATIVE CASES
    1285             : 
    1286             :   // (M3 + B1) -> [B0, 0, M3, NULL]
    1287           1 :   BaseWithIndexAndDisplacement64Matcher match36(graph()->NewNode(a_op, b1, m3));
    1288           1 :   CheckBaseWithIndexAndDisplacement(&match36, m3, 0, b1, nullptr);
    1289             : 
    1290             :   // (S4 + B1) -> [B0, 0, S4, NULL]
    1291           1 :   BaseWithIndexAndDisplacement64Matcher match37(graph()->NewNode(a_op, b1, s4));
    1292           1 :   CheckBaseWithIndexAndDisplacement(&match37, s4, 0, b1, nullptr);
    1293             : 
    1294             :   // 3 INPUT
    1295             : 
    1296             :   // (D15 + S3) + B0 -> [p1, 2, b0, d15]
    1297             :   s3 = graph()->NewNode(s_op, p1, d3);
    1298             :   BaseWithIndexAndDisplacement64Matcher match38(
    1299           1 :       graph()->NewNode(a_op, graph()->NewNode(a_op, d15, s3), b0));
    1300           1 :   CheckBaseWithIndexAndDisplacement(&match38, p1, 3, b0, d15);
    1301             : 
    1302             :   // (B0 + D15) + S3 -> [p1, 2, b0, d15]
    1303             :   s3 = graph()->NewNode(s_op, p1, d3);
    1304             :   BaseWithIndexAndDisplacement64Matcher match39(
    1305           1 :       graph()->NewNode(a_op, graph()->NewNode(a_op, b0, d15), s3));
    1306           1 :   CheckBaseWithIndexAndDisplacement(&match39, p1, 3, b0, d15);
    1307             : 
    1308             :   // (S3 + B0) + D15 -> [p1, 2, b0, d15]
    1309             :   s3 = graph()->NewNode(s_op, p1, d3);
    1310             :   BaseWithIndexAndDisplacement64Matcher match40(
    1311           1 :       graph()->NewNode(a_op, graph()->NewNode(a_op, s3, b0), d15));
    1312           1 :   CheckBaseWithIndexAndDisplacement(&match40, p1, 3, b0, d15);
    1313             : 
    1314             :   // D15 + (S3 + B0) -> [p1, 2, b0, d15]
    1315             :   s3 = graph()->NewNode(s_op, p1, d3);
    1316             :   BaseWithIndexAndDisplacement64Matcher match41(
    1317           1 :       graph()->NewNode(a_op, d15, graph()->NewNode(a_op, s3, b0)));
    1318           1 :   CheckBaseWithIndexAndDisplacement(&match41, p1, 3, b0, d15);
    1319             : 
    1320             :   // B0 + (D15 + S3) -> [p1, 2, b0, d15]
    1321             :   s3 = graph()->NewNode(s_op, p1, d3);
    1322             :   BaseWithIndexAndDisplacement64Matcher match42(
    1323           1 :       graph()->NewNode(a_op, b0, graph()->NewNode(a_op, d15, s3)));
    1324           1 :   CheckBaseWithIndexAndDisplacement(&match42, p1, 3, b0, d15);
    1325             : 
    1326             :   // S3 + (B0 + D15) -> [p1, 2, b0, d15]
    1327             :   s3 = graph()->NewNode(s_op, p1, d3);
    1328             :   BaseWithIndexAndDisplacement64Matcher match43(
    1329           1 :       graph()->NewNode(a_op, s3, graph()->NewNode(a_op, b0, d15)));
    1330           1 :   CheckBaseWithIndexAndDisplacement(&match43, p1, 3, b0, d15);
    1331             : 
    1332             :   // 2 INPUT with non-power of 2 scale
    1333             : 
    1334             :   // (M3 + D15) -> [p1, 1, p1, D15]
    1335             :   m3 = graph()->NewNode(m_op, p1, d3);
    1336             :   BaseWithIndexAndDisplacement64Matcher match44(
    1337           1 :       graph()->NewNode(a_op, m3, d15));
    1338           1 :   CheckBaseWithIndexAndDisplacement(&match44, p1, 1, p1, d15);
    1339             : 
    1340             :   // (M5 + D15) -> [p1, 2, p1, D15]
    1341             :   m5 = graph()->NewNode(m_op, p1, d5);
    1342             :   BaseWithIndexAndDisplacement64Matcher match45(
    1343           1 :       graph()->NewNode(a_op, m5, d15));
    1344           1 :   CheckBaseWithIndexAndDisplacement(&match45, p1, 2, p1, d15);
    1345             : 
    1346             :   // (M9 + D15) -> [p1, 3, p1, D15]
    1347             :   m9 = graph()->NewNode(m_op, p1, d9);
    1348             :   BaseWithIndexAndDisplacement64Matcher match46(
    1349           1 :       graph()->NewNode(a_op, m9, d15));
    1350           1 :   CheckBaseWithIndexAndDisplacement(&match46, p1, 3, p1, d15);
    1351             : 
    1352             :   // 3 INPUT negative cases: non-power of 2 scale but with a base
    1353             : 
    1354             :   // ((M3 + B0) + D15) -> [m3, 0, b0, D15]
    1355             :   m3 = graph()->NewNode(m_op, p1, d3);
    1356             :   Node* temp = graph()->NewNode(a_op, m3, b0);
    1357             :   BaseWithIndexAndDisplacement64Matcher match47(
    1358           1 :       graph()->NewNode(a_op, temp, d15));
    1359           1 :   CheckBaseWithIndexAndDisplacement(&match47, m3, 0, b0, d15);
    1360             : 
    1361             :   // (M3 + (B0 + D15)) -> [m3, 0, b0, D15]
    1362             :   m3 = graph()->NewNode(m_op, p1, d3);
    1363             :   temp = graph()->NewNode(a_op, d15, b0);
    1364             :   BaseWithIndexAndDisplacement64Matcher match48(
    1365           1 :       graph()->NewNode(a_op, m3, temp));
    1366           1 :   CheckBaseWithIndexAndDisplacement(&match48, m3, 0, b0, d15);
    1367             : 
    1368             :   // ((B0 + M3) + D15) -> [m3, 0, b0, D15]
    1369             :   m3 = graph()->NewNode(m_op, p1, d3);
    1370             :   temp = graph()->NewNode(a_op, b0, m3);
    1371             :   BaseWithIndexAndDisplacement64Matcher match49(
    1372           1 :       graph()->NewNode(a_op, temp, d15));
    1373           1 :   CheckBaseWithIndexAndDisplacement(&match49, m3, 0, b0, d15);
    1374             : 
    1375             :   // (M3 + (D15 + B0)) -> [m3, 0, b0, D15]
    1376             :   m3 = graph()->NewNode(m_op, p1, d3);
    1377             :   temp = graph()->NewNode(a_op, b0, d15);
    1378             :   BaseWithIndexAndDisplacement64Matcher match50(
    1379           1 :       graph()->NewNode(a_op, m3, temp));
    1380           1 :   CheckBaseWithIndexAndDisplacement(&match50, m3, 0, b0, d15);
    1381             : 
    1382             :   // S3 + (B0 - D15) -> [p1, 2, b0, d15, true]
    1383             :   s3 = graph()->NewNode(s_op, p1, d3);
    1384             :   BaseWithIndexAndDisplacement64Matcher match51(
    1385           1 :       graph()->NewNode(a_op, s3, graph()->NewNode(sub_op, b0, d15)));
    1386             :   CheckBaseWithIndexAndDisplacement(&match51, p1, 3, b0, d15,
    1387           1 :                                     kNegativeDisplacement);
    1388             : 
    1389             :   // B0 + (B1 - D15) -> [p1, 2, b0, d15, true]
    1390             :   BaseWithIndexAndDisplacement64Matcher match52(
    1391           1 :       graph()->NewNode(a_op, b0, graph()->NewNode(sub_op, b1, d15)));
    1392             :   CheckBaseWithIndexAndDisplacement(&match52, b1, 0, b0, d15,
    1393           1 :                                     kNegativeDisplacement);
    1394             : 
    1395             :   // (B0 - D15) + S3 -> [p1, 2, b0, d15, true]
    1396             :   s3 = graph()->NewNode(s_op, p1, d3);
    1397             :   BaseWithIndexAndDisplacement64Matcher match53(
    1398           1 :       graph()->NewNode(a_op, graph()->NewNode(sub_op, b0, d15), s3));
    1399             :   CheckBaseWithIndexAndDisplacement(&match53, p1, 3, b0, d15,
    1400           1 :                                     kNegativeDisplacement);
    1401             : 
    1402             :   // 4 INPUT - with addressing operand uses
    1403             : 
    1404             :   // (B0 + M1) -> [p1, 0, B0, NULL]
    1405             :   m1 = graph()->NewNode(m_op, p1, d1);
    1406           4 :   ADD_ADDRESSING_OPERAND_USES(m1);
    1407           1 :   BaseWithIndexAndDisplacement64Matcher match54(graph()->NewNode(a_op, b0, m1));
    1408           1 :   CheckBaseWithIndexAndDisplacement(&match54, p1, 0, b0, nullptr);
    1409             : 
    1410             :   // (M1 + B0) -> [p1, 0, B0, NULL]
    1411             :   m1 = graph()->NewNode(m_op, p1, d1);
    1412           4 :   ADD_ADDRESSING_OPERAND_USES(m1);
    1413           1 :   BaseWithIndexAndDisplacement64Matcher match55(graph()->NewNode(a_op, m1, b0));
    1414           1 :   CheckBaseWithIndexAndDisplacement(&match55, p1, 0, b0, nullptr);
    1415             : 
    1416             :   // (D15 + M1) -> [P1, 0, NULL, D15]
    1417             :   m1 = graph()->NewNode(m_op, p1, d1);
    1418           4 :   ADD_ADDRESSING_OPERAND_USES(m1);
    1419             :   BaseWithIndexAndDisplacement64Matcher match56(
    1420           1 :       graph()->NewNode(a_op, d15, m1));
    1421           1 :   CheckBaseWithIndexAndDisplacement(&match56, p1, 0, nullptr, d15);
    1422             : 
    1423             :   // (M1 + D15) -> [P1, 0, NULL, D15]
    1424             :   m1 = graph()->NewNode(m_op, p1, d1);
    1425           4 :   ADD_ADDRESSING_OPERAND_USES(m1);
    1426             :   BaseWithIndexAndDisplacement64Matcher match57(
    1427           1 :       graph()->NewNode(a_op, m1, d15));
    1428           1 :   CheckBaseWithIndexAndDisplacement(&match57, p1, 0, nullptr, d15);
    1429             : 
    1430             :   // (B0 + S0) -> [p1, 0, B0, NULL]
    1431             :   s0 = graph()->NewNode(s_op, p1, d0);
    1432           4 :   ADD_ADDRESSING_OPERAND_USES(s0);
    1433           1 :   BaseWithIndexAndDisplacement64Matcher match58(graph()->NewNode(a_op, b0, s0));
    1434           1 :   CheckBaseWithIndexAndDisplacement(&match58, p1, 0, b0, nullptr);
    1435             : 
    1436             :   // (S0 + B0) -> [p1, 0, B0, NULL]
    1437             :   s0 = graph()->NewNode(s_op, p1, d0);
    1438           4 :   ADD_ADDRESSING_OPERAND_USES(s0);
    1439           1 :   BaseWithIndexAndDisplacement64Matcher match59(graph()->NewNode(a_op, s0, b0));
    1440           1 :   CheckBaseWithIndexAndDisplacement(&match59, p1, 0, b0, nullptr);
    1441             : 
    1442             :   // (D15 + S0) -> [P1, 0, NULL, D15]
    1443             :   s0 = graph()->NewNode(s_op, p1, d0);
    1444           4 :   ADD_ADDRESSING_OPERAND_USES(s0);
    1445             :   BaseWithIndexAndDisplacement64Matcher match60(
    1446           1 :       graph()->NewNode(a_op, d15, s0));
    1447           1 :   CheckBaseWithIndexAndDisplacement(&match60, p1, 0, nullptr, d15);
    1448             : 
    1449             :   // (S0 + D15) -> [P1, 0, NULL, D15]
    1450             :   s0 = graph()->NewNode(s_op, p1, d0);
    1451           4 :   ADD_ADDRESSING_OPERAND_USES(s0);
    1452             :   BaseWithIndexAndDisplacement64Matcher match61(
    1453           1 :       graph()->NewNode(a_op, s0, d15));
    1454           1 :   CheckBaseWithIndexAndDisplacement(&match61, p1, 0, nullptr, d15);
    1455             : 
    1456             :   // (B0 + M2) -> [p1, 1, B0, NULL]
    1457             :   m2 = graph()->NewNode(m_op, p1, d2);
    1458           4 :   ADD_ADDRESSING_OPERAND_USES(m2);
    1459           1 :   BaseWithIndexAndDisplacement64Matcher match62(graph()->NewNode(a_op, b0, m2));
    1460           1 :   CheckBaseWithIndexAndDisplacement(&match62, p1, 1, b0, nullptr);
    1461             : 
    1462             :   // (M2 + B0) -> [p1, 1, B0, NULL]
    1463             :   m2 = graph()->NewNode(m_op, p1, d2);
    1464           4 :   ADD_ADDRESSING_OPERAND_USES(m2);
    1465           1 :   BaseWithIndexAndDisplacement64Matcher match63(graph()->NewNode(a_op, m2, b0));
    1466           1 :   CheckBaseWithIndexAndDisplacement(&match63, p1, 1, b0, nullptr);
    1467             : 
    1468             :   // (D15 + M2) -> [P1, 1, NULL, D15]
    1469             :   m2 = graph()->NewNode(m_op, p1, d2);
    1470           4 :   ADD_ADDRESSING_OPERAND_USES(m2);
    1471             :   BaseWithIndexAndDisplacement64Matcher match64(
    1472           1 :       graph()->NewNode(a_op, d15, m2));
    1473           1 :   CheckBaseWithIndexAndDisplacement(&match64, p1, 1, nullptr, d15);
    1474             : 
    1475             :   // (M2 + D15) -> [P1, 1, NULL, D15]
    1476             :   m2 = graph()->NewNode(m_op, p1, d2);
    1477           4 :   ADD_ADDRESSING_OPERAND_USES(m2);
    1478             :   BaseWithIndexAndDisplacement64Matcher match65(
    1479           1 :       graph()->NewNode(a_op, m2, d15));
    1480           1 :   CheckBaseWithIndexAndDisplacement(&match65, p1, 1, nullptr, d15);
    1481             : 
    1482             :   // (B0 + S1) -> [p1, 1, B0, NULL]
    1483             :   s1 = graph()->NewNode(s_op, p1, d1);
    1484           4 :   ADD_ADDRESSING_OPERAND_USES(s1);
    1485           1 :   BaseWithIndexAndDisplacement64Matcher match66(graph()->NewNode(a_op, b0, s1));
    1486           1 :   CheckBaseWithIndexAndDisplacement(&match66, p1, 1, b0, nullptr);
    1487             : 
    1488             :   // (S1 + B0) -> [p1, 1, B0, NULL]
    1489             :   s1 = graph()->NewNode(s_op, p1, d1);
    1490           4 :   ADD_ADDRESSING_OPERAND_USES(s1);
    1491           1 :   BaseWithIndexAndDisplacement64Matcher match67(graph()->NewNode(a_op, s1, b0));
    1492           1 :   CheckBaseWithIndexAndDisplacement(&match67, p1, 1, b0, nullptr);
    1493             : 
    1494             :   // (D15 + S1) -> [P1, 1, NULL, D15]
    1495             :   s1 = graph()->NewNode(s_op, p1, d1);
    1496           4 :   ADD_ADDRESSING_OPERAND_USES(s1);
    1497             :   BaseWithIndexAndDisplacement64Matcher match68(
    1498           1 :       graph()->NewNode(a_op, d15, s1));
    1499           1 :   CheckBaseWithIndexAndDisplacement(&match68, p1, 1, nullptr, d15);
    1500             : 
    1501             :   // (S1 + D15) -> [P1, 1, NULL, D15]
    1502             :   s1 = graph()->NewNode(s_op, p1, d1);
    1503           4 :   ADD_ADDRESSING_OPERAND_USES(s1);
    1504             :   BaseWithIndexAndDisplacement64Matcher match69(
    1505           1 :       graph()->NewNode(a_op, s1, d15));
    1506           1 :   CheckBaseWithIndexAndDisplacement(&match69, p1, 1, nullptr, d15);
    1507             : 
    1508             :   // (B0 + M4) -> [p1, 2, B0, NULL]
    1509             :   m4 = graph()->NewNode(m_op, p1, d4);
    1510           4 :   ADD_ADDRESSING_OPERAND_USES(m4);
    1511           1 :   BaseWithIndexAndDisplacement64Matcher match70(graph()->NewNode(a_op, b0, m4));
    1512           1 :   CheckBaseWithIndexAndDisplacement(&match70, p1, 2, b0, nullptr);
    1513             : 
    1514             :   // (M4 + B0) -> [p1, 2, B0, NULL]
    1515             :   m4 = graph()->NewNode(m_op, p1, d4);
    1516           4 :   ADD_ADDRESSING_OPERAND_USES(m4);
    1517           1 :   BaseWithIndexAndDisplacement64Matcher match71(graph()->NewNode(a_op, m4, b0));
    1518           1 :   CheckBaseWithIndexAndDisplacement(&match71, p1, 2, b0, nullptr);
    1519             : 
    1520             :   // (D15 + M4) -> [p1, 2, NULL, D15]
    1521             :   m4 = graph()->NewNode(m_op, p1, d4);
    1522           4 :   ADD_ADDRESSING_OPERAND_USES(m4);
    1523             :   BaseWithIndexAndDisplacement64Matcher match72(
    1524           1 :       graph()->NewNode(a_op, d15, m4));
    1525           1 :   CheckBaseWithIndexAndDisplacement(&match72, p1, 2, nullptr, d15);
    1526             : 
    1527             :   // (M4 + D15) -> [p1, 2, NULL, D15]
    1528             :   m4 = graph()->NewNode(m_op, p1, d4);
    1529           4 :   ADD_ADDRESSING_OPERAND_USES(m4);
    1530             :   BaseWithIndexAndDisplacement64Matcher match73(
    1531           1 :       graph()->NewNode(a_op, m4, d15));
    1532           1 :   CheckBaseWithIndexAndDisplacement(&match73, p1, 2, nullptr, d15);
    1533             : 
    1534             :   // (B0 + S2) -> [p1, 2, B0, NULL]
    1535             :   s2 = graph()->NewNode(s_op, p1, d2);
    1536           4 :   ADD_ADDRESSING_OPERAND_USES(s2);
    1537           1 :   BaseWithIndexAndDisplacement64Matcher match74(graph()->NewNode(a_op, b0, s2));
    1538           1 :   CheckBaseWithIndexAndDisplacement(&match74, p1, 2, b0, nullptr);
    1539             : 
    1540             :   // (S2 + B0) -> [p1, 2, B0, NULL]
    1541             :   s2 = graph()->NewNode(s_op, p1, d2);
    1542           4 :   ADD_ADDRESSING_OPERAND_USES(s2);
    1543           1 :   BaseWithIndexAndDisplacement64Matcher match75(graph()->NewNode(a_op, s2, b0));
    1544           1 :   CheckBaseWithIndexAndDisplacement(&match75, p1, 2, b0, nullptr);
    1545             : 
    1546             :   // (D15 + S2) -> [p1, 2, NULL, D15]
    1547             :   s2 = graph()->NewNode(s_op, p1, d2);
    1548           4 :   ADD_ADDRESSING_OPERAND_USES(s2);
    1549             :   BaseWithIndexAndDisplacement64Matcher match76(
    1550           1 :       graph()->NewNode(a_op, d15, s2));
    1551           1 :   CheckBaseWithIndexAndDisplacement(&match76, p1, 2, nullptr, d15);
    1552             : 
    1553             :   // (S2 + D15) -> [p1, 2, NULL, D15]
    1554             :   s2 = graph()->NewNode(s_op, p1, d2);
    1555           4 :   ADD_ADDRESSING_OPERAND_USES(s2);
    1556             :   BaseWithIndexAndDisplacement64Matcher match77(
    1557           1 :       graph()->NewNode(a_op, s2, d15));
    1558           1 :   CheckBaseWithIndexAndDisplacement(&match77, p1, 2, nullptr, d15);
    1559             : 
    1560             :   // (B0 + M8) -> [p1, 2, B0, NULL]
    1561             :   m8 = graph()->NewNode(m_op, p1, d8);
    1562           4 :   ADD_ADDRESSING_OPERAND_USES(m8);
    1563           1 :   BaseWithIndexAndDisplacement64Matcher match78(graph()->NewNode(a_op, b0, m8));
    1564           1 :   CheckBaseWithIndexAndDisplacement(&match78, p1, 3, b0, nullptr);
    1565             : 
    1566             :   // (M8 + B0) -> [p1, 2, B0, NULL]
    1567             :   m8 = graph()->NewNode(m_op, p1, d8);
    1568           4 :   ADD_ADDRESSING_OPERAND_USES(m8);
    1569           1 :   BaseWithIndexAndDisplacement64Matcher match79(graph()->NewNode(a_op, m8, b0));
    1570           1 :   CheckBaseWithIndexAndDisplacement(&match79, p1, 3, b0, nullptr);
    1571             : 
    1572             :   // (D15 + M8) -> [p1, 2, NULL, D15]
    1573             :   m8 = graph()->NewNode(m_op, p1, d8);
    1574           4 :   ADD_ADDRESSING_OPERAND_USES(m8);
    1575             :   BaseWithIndexAndDisplacement64Matcher match80(
    1576           1 :       graph()->NewNode(a_op, d15, m8));
    1577           1 :   CheckBaseWithIndexAndDisplacement(&match80, p1, 3, nullptr, d15);
    1578             : 
    1579             :   // (M8 + D15) -> [p1, 2, NULL, D15]
    1580             :   m8 = graph()->NewNode(m_op, p1, d8);
    1581           4 :   ADD_ADDRESSING_OPERAND_USES(m8);
    1582             :   BaseWithIndexAndDisplacement64Matcher match81(
    1583           1 :       graph()->NewNode(a_op, m8, d15));
    1584           1 :   CheckBaseWithIndexAndDisplacement(&match81, p1, 3, nullptr, d15);
    1585             : 
    1586             :   // (B0 + S3) -> [p1, 2, B0, NULL]
    1587             :   s3 = graph()->NewNode(s_op, p1, d3);
    1588           4 :   ADD_ADDRESSING_OPERAND_USES(s3);
    1589           1 :   BaseWithIndexAndDisplacement64Matcher match82(graph()->NewNode(a_op, b0, s3));
    1590           1 :   CheckBaseWithIndexAndDisplacement(&match82, p1, 3, b0, nullptr);
    1591             : 
    1592             :   // (S3 + B0) -> [p1, 2, B0, NULL]
    1593             :   s3 = graph()->NewNode(s_op, p1, d3);
    1594           4 :   ADD_ADDRESSING_OPERAND_USES(s3);
    1595           1 :   BaseWithIndexAndDisplacement64Matcher match83(graph()->NewNode(a_op, s3, b0));
    1596           1 :   CheckBaseWithIndexAndDisplacement(&match83, p1, 3, b0, nullptr);
    1597             : 
    1598             :   // (D15 + S3) -> [p1, 2, NULL, D15]
    1599             :   s3 = graph()->NewNode(s_op, p1, d3);
    1600           4 :   ADD_ADDRESSING_OPERAND_USES(s3);
    1601             :   BaseWithIndexAndDisplacement64Matcher match84(
    1602           1 :       graph()->NewNode(a_op, d15, s3));
    1603           1 :   CheckBaseWithIndexAndDisplacement(&match84, p1, 3, nullptr, d15);
    1604             : 
    1605             :   // (S3 + D15) -> [p1, 2, NULL, D15]
    1606             :   s3 = graph()->NewNode(s_op, p1, d3);
    1607           4 :   ADD_ADDRESSING_OPERAND_USES(s3);
    1608             :   BaseWithIndexAndDisplacement64Matcher match85(
    1609           1 :       graph()->NewNode(a_op, s3, d15));
    1610           1 :   CheckBaseWithIndexAndDisplacement(&match85, p1, 3, nullptr, d15);
    1611             : 
    1612             :   // (D15 + S3) + B0 -> [p1, 2, b0, d15]
    1613             :   s3 = graph()->NewNode(s_op, p1, d3);
    1614             :   temp = graph()->NewNode(a_op, d15, s3);
    1615           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
    1616             :   BaseWithIndexAndDisplacement64Matcher match86(
    1617           1 :       graph()->NewNode(a_op, temp, b0));
    1618           1 :   CheckBaseWithIndexAndDisplacement(&match86, p1, 3, b0, d15);
    1619             : 
    1620             :   // (B0 + D15) + S3 -> [p1, 2, b0, d15]
    1621             :   s3 = graph()->NewNode(s_op, p1, d3);
    1622             :   temp = graph()->NewNode(a_op, b0, d15);
    1623           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
    1624             :   BaseWithIndexAndDisplacement64Matcher match87(
    1625           1 :       graph()->NewNode(a_op, temp, s3));
    1626           1 :   CheckBaseWithIndexAndDisplacement(&match87, p1, 3, b0, d15);
    1627             : 
    1628             :   // (S3 + B0) + D15 -> [NULL, 0, (s3 + b0), d15]
    1629             :   // Avoid changing simple addressing to complex addressing
    1630             :   s3 = graph()->NewNode(s_op, p1, d3);
    1631             :   temp = graph()->NewNode(a_op, s3, b0);
    1632           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
    1633             :   BaseWithIndexAndDisplacement64Matcher match88(
    1634           1 :       graph()->NewNode(a_op, temp, d15));
    1635           1 :   CheckBaseWithIndexAndDisplacement(&match88, nullptr, 0, temp, d15);
    1636             : 
    1637             :   // D15 + (S3 + B0) -> [NULL, 0, (s3 + b0), d15]
    1638             :   // Avoid changing simple addressing to complex addressing
    1639             :   s3 = graph()->NewNode(s_op, p1, d3);
    1640             :   temp = graph()->NewNode(a_op, s3, b0);
    1641           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
    1642             :   BaseWithIndexAndDisplacement64Matcher match89(
    1643           1 :       graph()->NewNode(a_op, d15, temp));
    1644           1 :   CheckBaseWithIndexAndDisplacement(&match89, nullptr, 0, temp, d15);
    1645             : 
    1646             :   // B0 + (D15 + S3) -> [p1, 2, b0, d15]
    1647             :   s3 = graph()->NewNode(s_op, p1, d3);
    1648             :   temp = graph()->NewNode(a_op, d15, s3);
    1649           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
    1650             :   BaseWithIndexAndDisplacement64Matcher match90(
    1651           1 :       graph()->NewNode(a_op, b0, temp));
    1652           1 :   CheckBaseWithIndexAndDisplacement(&match90, p1, 3, b0, d15);
    1653             : 
    1654             :   // S3 + (B0 + D15) -> [p1, 2, b0, d15]
    1655             :   s3 = graph()->NewNode(s_op, p1, d3);
    1656             :   temp = graph()->NewNode(a_op, b0, d15);
    1657           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
    1658             :   BaseWithIndexAndDisplacement64Matcher match91(
    1659           1 :       graph()->NewNode(a_op, s3, temp));
    1660           1 :   CheckBaseWithIndexAndDisplacement(&match91, p1, 3, b0, d15);
    1661             : 
    1662             :   // S3 + (B0 - D15) -> [p1, 2, b0, d15, true]
    1663             :   s3 = graph()->NewNode(s_op, p1, d3);
    1664             :   temp = graph()->NewNode(sub_op, b0, d15);
    1665           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
    1666             :   BaseWithIndexAndDisplacement64Matcher match92(
    1667           1 :       graph()->NewNode(a_op, s3, temp));
    1668             :   CheckBaseWithIndexAndDisplacement(&match92, p1, 3, b0, d15,
    1669           1 :                                     kNegativeDisplacement);
    1670             : 
    1671             :   // B0 + (B1 - D15) -> [p1, 2, b0, d15, true]
    1672             :   temp = graph()->NewNode(sub_op, b1, d15);
    1673           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
    1674             :   BaseWithIndexAndDisplacement64Matcher match93(
    1675           1 :       graph()->NewNode(a_op, b0, temp));
    1676             :   CheckBaseWithIndexAndDisplacement(&match93, b1, 0, b0, d15,
    1677           1 :                                     kNegativeDisplacement);
    1678             : 
    1679             :   // (B0 - D15) + S3 -> [p1, 2, b0, d15, true]
    1680             :   s3 = graph()->NewNode(s_op, p1, d3);
    1681             :   temp = graph()->NewNode(sub_op, b0, d15);
    1682           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
    1683             :   BaseWithIndexAndDisplacement64Matcher match94(
    1684           1 :       graph()->NewNode(a_op, temp, s3));
    1685             :   CheckBaseWithIndexAndDisplacement(&match94, p1, 3, b0, d15,
    1686           1 :                                     kNegativeDisplacement);
    1687             : 
    1688             :   // (B0 + B1) + D15 -> [NULL, 0, (b0 + b1), d15]
    1689             :   // Avoid changing simple addressing to complex addressing
    1690             :   temp = graph()->NewNode(a_op, b0, b1);
    1691           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
    1692             :   BaseWithIndexAndDisplacement64Matcher match95(
    1693           1 :       graph()->NewNode(a_op, temp, d15));
    1694           1 :   CheckBaseWithIndexAndDisplacement(&match95, nullptr, 0, temp, d15);
    1695             : 
    1696             :   // D15 + (B0 + B1) -> [NULL, 0, (b0 + b1), d15]
    1697             :   // Avoid changing simple addressing to complex addressing
    1698             :   temp = graph()->NewNode(a_op, b0, b1);
    1699           4 :   ADD_ADDRESSING_OPERAND_USES(temp);
    1700             :   BaseWithIndexAndDisplacement64Matcher match96(
    1701           1 :       graph()->NewNode(a_op, d15, temp));
    1702           1 :   CheckBaseWithIndexAndDisplacement(&match96, nullptr, 0, temp, d15);
    1703             : 
    1704             :   // 5 INPUT - with none-addressing operand uses
    1705             : 
    1706             :   // (B0 + M1) -> [b0, 0, m1, NULL]
    1707             :   m1 = graph()->NewNode(m_op, p1, d1);
    1708           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m1);
    1709           1 :   BaseWithIndexAndDisplacement64Matcher match97(graph()->NewNode(a_op, b0, m1));
    1710           1 :   CheckBaseWithIndexAndDisplacement(&match97, b0, 0, m1, nullptr);
    1711             : 
    1712             :   // (M1 + B0) -> [b0, 0, m1, NULL]
    1713             :   m1 = graph()->NewNode(m_op, p1, d1);
    1714           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m1);
    1715           1 :   BaseWithIndexAndDisplacement64Matcher match98(graph()->NewNode(a_op, m1, b0));
    1716           1 :   CheckBaseWithIndexAndDisplacement(&match98, b0, 0, m1, nullptr);
    1717             : 
    1718             :   // (D15 + M1) -> [NULL, 0, m1, d15]
    1719             :   m1 = graph()->NewNode(m_op, p1, d1);
    1720           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m1);
    1721             :   BaseWithIndexAndDisplacement64Matcher match99(
    1722           1 :       graph()->NewNode(a_op, d15, m1));
    1723           1 :   CheckBaseWithIndexAndDisplacement(&match99, nullptr, 0, m1, d15);
    1724             : 
    1725             :   // (M1 + D15) -> [NULL, 0, m1, d15]
    1726             :   m1 = graph()->NewNode(m_op, p1, d1);
    1727           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m1);
    1728             :   BaseWithIndexAndDisplacement64Matcher match100(
    1729           1 :       graph()->NewNode(a_op, m1, d15));
    1730           1 :   CheckBaseWithIndexAndDisplacement(&match100, nullptr, 0, m1, d15);
    1731             : 
    1732             :   // (B0 + S0) -> [b0, 0, s0, NULL]
    1733             :   s0 = graph()->NewNode(s_op, p1, d0);
    1734           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s0);
    1735             :   BaseWithIndexAndDisplacement64Matcher match101(
    1736           1 :       graph()->NewNode(a_op, b0, s0));
    1737           1 :   CheckBaseWithIndexAndDisplacement(&match101, b0, 0, s0, nullptr);
    1738             : 
    1739             :   // (S0 + B0) -> [b0, 0, s0, NULL]
    1740             :   s0 = graph()->NewNode(s_op, p1, d0);
    1741           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s0);
    1742             :   BaseWithIndexAndDisplacement64Matcher match102(
    1743           1 :       graph()->NewNode(a_op, s0, b0));
    1744           1 :   CheckBaseWithIndexAndDisplacement(&match102, b0, 0, s0, nullptr);
    1745             : 
    1746             :   // (D15 + S0) -> [NULL, 0, s0, d15]
    1747             :   s0 = graph()->NewNode(s_op, p1, d0);
    1748           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s0);
    1749             :   BaseWithIndexAndDisplacement64Matcher match103(
    1750           1 :       graph()->NewNode(a_op, d15, s0));
    1751           1 :   CheckBaseWithIndexAndDisplacement(&match103, nullptr, 0, s0, d15);
    1752             : 
    1753             :   // (S0 + D15) -> [NULL, 0, s0, d15]
    1754             :   s0 = graph()->NewNode(s_op, p1, d0);
    1755           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s0);
    1756             :   BaseWithIndexAndDisplacement64Matcher match104(
    1757           1 :       graph()->NewNode(a_op, s0, d15));
    1758           1 :   CheckBaseWithIndexAndDisplacement(&match104, nullptr, 0, s0, d15);
    1759             : 
    1760             :   // (B0 + M2) -> [b0, 0, m2, NULL]
    1761             :   m2 = graph()->NewNode(m_op, p1, d2);
    1762           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m2);
    1763             :   BaseWithIndexAndDisplacement64Matcher match105(
    1764           1 :       graph()->NewNode(a_op, b0, m2));
    1765           1 :   CheckBaseWithIndexAndDisplacement(&match105, b0, 0, m2, nullptr);
    1766             : 
    1767             :   // (M2 + B0) -> [b0, 0, m2, NULL]
    1768             :   m2 = graph()->NewNode(m_op, p1, d2);
    1769           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m2);
    1770             :   BaseWithIndexAndDisplacement64Matcher match106(
    1771           1 :       graph()->NewNode(a_op, m2, b0));
    1772           1 :   CheckBaseWithIndexAndDisplacement(&match106, b0, 0, m2, nullptr);
    1773             : 
    1774             :   // (D15 + M2) -> [NULL, 0, m2, d15]
    1775             :   m2 = graph()->NewNode(m_op, p1, d2);
    1776           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m2);
    1777             :   BaseWithIndexAndDisplacement64Matcher match107(
    1778           1 :       graph()->NewNode(a_op, d15, m2));
    1779           1 :   CheckBaseWithIndexAndDisplacement(&match107, nullptr, 0, m2, d15);
    1780             : 
    1781             :   // (M2 + D15) -> [NULL, 0, m2, d15]
    1782             :   m2 = graph()->NewNode(m_op, p1, d2);
    1783           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m2);
    1784             :   BaseWithIndexAndDisplacement64Matcher match108(
    1785           1 :       graph()->NewNode(a_op, m2, d15));
    1786           1 :   CheckBaseWithIndexAndDisplacement(&match108, nullptr, 0, m2, d15);
    1787             : 
    1788             :   // (B0 + S1) -> [b0, 0, s1, NULL]
    1789             :   s1 = graph()->NewNode(s_op, p1, d1);
    1790           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s1);
    1791             :   BaseWithIndexAndDisplacement64Matcher match109(
    1792           1 :       graph()->NewNode(a_op, b0, s1));
    1793           1 :   CheckBaseWithIndexAndDisplacement(&match109, b0, 0, s1, nullptr);
    1794             : 
    1795             :   // (S1 + B0) -> [b0, 0, s1, NULL]
    1796             :   s1 = graph()->NewNode(s_op, p1, d1);
    1797           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s1);
    1798             :   BaseWithIndexAndDisplacement64Matcher match110(
    1799           1 :       graph()->NewNode(a_op, s1, b0));
    1800           1 :   CheckBaseWithIndexAndDisplacement(&match110, b0, 0, s1, nullptr);
    1801             : 
    1802             :   // (D15 + S1) -> [NULL, 0, s1, d15]
    1803             :   s1 = graph()->NewNode(s_op, p1, d1);
    1804           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s1);
    1805             :   BaseWithIndexAndDisplacement64Matcher match111(
    1806           1 :       graph()->NewNode(a_op, d15, s1));
    1807           1 :   CheckBaseWithIndexAndDisplacement(&match111, nullptr, 0, s1, d15);
    1808             : 
    1809             :   // (S1 + D15) -> [NULL, 0, s1, d15]
    1810             :   s1 = graph()->NewNode(s_op, p1, d1);
    1811           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s1);
    1812             :   BaseWithIndexAndDisplacement64Matcher match112(
    1813           1 :       graph()->NewNode(a_op, s1, d15));
    1814           1 :   CheckBaseWithIndexAndDisplacement(&match112, nullptr, 0, s1, d15);
    1815             : 
    1816             :   // (B0 + M4) -> [b0, 0, m4, NULL]
    1817             :   m4 = graph()->NewNode(m_op, p1, d4);
    1818           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m4);
    1819             :   BaseWithIndexAndDisplacement64Matcher match113(
    1820           1 :       graph()->NewNode(a_op, b0, m4));
    1821           1 :   CheckBaseWithIndexAndDisplacement(&match113, b0, 0, m4, nullptr);
    1822             : 
    1823             :   // (M4 + B0) -> [b0, 0, m4, NULL]
    1824             :   m4 = graph()->NewNode(m_op, p1, d4);
    1825           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m4);
    1826             :   BaseWithIndexAndDisplacement64Matcher match114(
    1827           1 :       graph()->NewNode(a_op, m4, b0));
    1828           1 :   CheckBaseWithIndexAndDisplacement(&match114, b0, 0, m4, nullptr);
    1829             : 
    1830             :   // (D15 + M4) -> [NULL, 0, m4, d15]
    1831             :   m4 = graph()->NewNode(m_op, p1, d4);
    1832           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m4);
    1833             :   BaseWithIndexAndDisplacement64Matcher match115(
    1834           1 :       graph()->NewNode(a_op, d15, m4));
    1835           1 :   CheckBaseWithIndexAndDisplacement(&match115, nullptr, 0, m4, d15);
    1836             : 
    1837             :   // (M4 + D15) -> [NULL, 0, m4, d15]
    1838             :   m4 = graph()->NewNode(m_op, p1, d4);
    1839           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m4);
    1840             :   BaseWithIndexAndDisplacement64Matcher match116(
    1841           1 :       graph()->NewNode(a_op, m4, d15));
    1842           1 :   CheckBaseWithIndexAndDisplacement(&match116, nullptr, 0, m4, d15);
    1843             : 
    1844             :   // (B0 + S2) -> [b0, 0, s2, NULL]
    1845             :   s2 = graph()->NewNode(s_op, p1, d2);
    1846           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s2);
    1847             :   BaseWithIndexAndDisplacement64Matcher match117(
    1848           1 :       graph()->NewNode(a_op, b0, s2));
    1849           1 :   CheckBaseWithIndexAndDisplacement(&match117, b0, 0, s2, nullptr);
    1850             : 
    1851             :   // (S2 + B0) -> [b0, 0, s2, NULL]
    1852             :   s2 = graph()->NewNode(s_op, p1, d2);
    1853           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s2);
    1854             :   BaseWithIndexAndDisplacement64Matcher match118(
    1855           1 :       graph()->NewNode(a_op, s2, b0));
    1856           1 :   CheckBaseWithIndexAndDisplacement(&match118, b0, 0, s2, nullptr);
    1857             : 
    1858             :   // (D15 + S2) -> [NULL, 0, s2, d15]
    1859             :   s2 = graph()->NewNode(s_op, p1, d2);
    1860           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s2);
    1861             :   BaseWithIndexAndDisplacement64Matcher match119(
    1862           1 :       graph()->NewNode(a_op, d15, s2));
    1863           1 :   CheckBaseWithIndexAndDisplacement(&match119, nullptr, 0, s2, d15);
    1864             : 
    1865             :   // (S2 + D15) -> [NULL, 0, s2, d15]
    1866             :   s2 = graph()->NewNode(s_op, p1, d2);
    1867           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s2);
    1868             :   BaseWithIndexAndDisplacement64Matcher match120(
    1869           1 :       graph()->NewNode(a_op, s2, d15));
    1870           1 :   CheckBaseWithIndexAndDisplacement(&match120, nullptr, 0, s2, d15);
    1871             : 
    1872             :   // (B0 + M8) -> [b0, 0, m8, NULL]
    1873             :   m8 = graph()->NewNode(m_op, p1, d8);
    1874           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m8);
    1875             :   BaseWithIndexAndDisplacement64Matcher match121(
    1876           1 :       graph()->NewNode(a_op, b0, m8));
    1877           1 :   CheckBaseWithIndexAndDisplacement(&match121, b0, 0, m8, nullptr);
    1878             : 
    1879             :   // (M8 + B0) -> [b0, 0, m8, NULL]
    1880             :   m8 = graph()->NewNode(m_op, p1, d8);
    1881           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m8);
    1882             :   BaseWithIndexAndDisplacement64Matcher match122(
    1883           1 :       graph()->NewNode(a_op, m8, b0));
    1884           1 :   CheckBaseWithIndexAndDisplacement(&match122, b0, 0, m8, nullptr);
    1885             : 
    1886             :   // (D15 + M8) -> [NULL, 0, m8, d15]
    1887             :   m8 = graph()->NewNode(m_op, p1, d8);
    1888           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m8);
    1889             :   BaseWithIndexAndDisplacement64Matcher match123(
    1890           1 :       graph()->NewNode(a_op, d15, m8));
    1891           1 :   CheckBaseWithIndexAndDisplacement(&match123, nullptr, 0, m8, d15);
    1892             : 
    1893             :   // (M8 + D15) -> [NULL, 0, m8, d15]
    1894             :   m8 = graph()->NewNode(m_op, p1, d8);
    1895           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(m8);
    1896             :   BaseWithIndexAndDisplacement64Matcher match124(
    1897           1 :       graph()->NewNode(a_op, m8, d15));
    1898           1 :   CheckBaseWithIndexAndDisplacement(&match124, nullptr, 0, m8, d15);
    1899             : 
    1900             :   // (B0 + S3) -> [b0, 0, s3, NULL]
    1901             :   s3 = graph()->NewNode(s_op, p1, d3);
    1902           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s3);
    1903             :   BaseWithIndexAndDisplacement64Matcher match125(
    1904           1 :       graph()->NewNode(a_op, b0, s3));
    1905           1 :   CheckBaseWithIndexAndDisplacement(&match125, b0, 0, s3, nullptr);
    1906             : 
    1907             :   // (S3 + B0) -> [b0, 0, s3, NULL]
    1908             :   s3 = graph()->NewNode(s_op, p1, d3);
    1909           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s3);
    1910             :   BaseWithIndexAndDisplacement64Matcher match126(
    1911           1 :       graph()->NewNode(a_op, s3, b0));
    1912           1 :   CheckBaseWithIndexAndDisplacement(&match126, b0, 0, s3, nullptr);
    1913             : 
    1914             :   // (D15 + S3) -> [NULL, 0, s3, d15]
    1915             :   s3 = graph()->NewNode(s_op, p1, d3);
    1916           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s3);
    1917             :   BaseWithIndexAndDisplacement64Matcher match127(
    1918           1 :       graph()->NewNode(a_op, d15, s3));
    1919           1 :   CheckBaseWithIndexAndDisplacement(&match127, nullptr, 0, s3, d15);
    1920             : 
    1921             :   // (S3 + D15) -> [NULL, 0, s3, d15]
    1922             :   s3 = graph()->NewNode(s_op, p1, d3);
    1923           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(s3);
    1924             :   BaseWithIndexAndDisplacement64Matcher match128(
    1925           1 :       graph()->NewNode(a_op, s3, d15));
    1926           1 :   CheckBaseWithIndexAndDisplacement(&match128, nullptr, 0, s3, d15);
    1927             : 
    1928             :   // (D15 + S3) + B0 -> [b0, 0, (D15 + S3), NULL]
    1929             :   s3 = graph()->NewNode(s_op, p1, d3);
    1930             :   temp = graph()->NewNode(a_op, d15, s3);
    1931           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
    1932             :   BaseWithIndexAndDisplacement64Matcher match129(
    1933           1 :       graph()->NewNode(a_op, temp, b0));
    1934           1 :   CheckBaseWithIndexAndDisplacement(&match129, b0, 0, temp, nullptr);
    1935             : 
    1936             :   // (B0 + D15) + S3 -> [p1, 3, (B0 + D15), NULL]
    1937             :   s3 = graph()->NewNode(s_op, p1, d3);
    1938             :   temp = graph()->NewNode(a_op, b0, d15);
    1939           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
    1940             :   BaseWithIndexAndDisplacement64Matcher match130(
    1941           1 :       graph()->NewNode(a_op, temp, s3));
    1942           1 :   CheckBaseWithIndexAndDisplacement(&match130, p1, 3, temp, nullptr);
    1943             : 
    1944             :   // (S3 + B0) + D15 -> [NULL, 0, (S3 + B0), d15]
    1945             :   s3 = graph()->NewNode(s_op, p1, d3);
    1946             :   temp = graph()->NewNode(a_op, s3, b0);
    1947           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
    1948             :   BaseWithIndexAndDisplacement64Matcher match131(
    1949           1 :       graph()->NewNode(a_op, temp, d15));
    1950           1 :   CheckBaseWithIndexAndDisplacement(&match131, nullptr, 0, temp, d15);
    1951             : 
    1952             :   // D15 + (S3 + B0) -> [NULL, 0, (S3 + B0), d15]
    1953             :   s3 = graph()->NewNode(s_op, p1, d3);
    1954             :   temp = graph()->NewNode(a_op, s3, b0);
    1955           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
    1956             :   BaseWithIndexAndDisplacement64Matcher match132(
    1957           1 :       graph()->NewNode(a_op, d15, temp));
    1958           1 :   CheckBaseWithIndexAndDisplacement(&match132, nullptr, 0, temp, d15);
    1959             : 
    1960             :   // B0 + (D15 + S3) -> [b0, 0, (D15 + S3), NULL]
    1961             :   s3 = graph()->NewNode(s_op, p1, d3);
    1962             :   temp = graph()->NewNode(a_op, d15, s3);
    1963           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
    1964             :   BaseWithIndexAndDisplacement64Matcher match133(
    1965           1 :       graph()->NewNode(a_op, b0, temp));
    1966           1 :   CheckBaseWithIndexAndDisplacement(&match133, b0, 0, temp, nullptr);
    1967             : 
    1968             :   // S3 + (B0 + D15) -> [p1, 3, (B0 + D15), NULL]
    1969             :   s3 = graph()->NewNode(s_op, p1, d3);
    1970             :   temp = graph()->NewNode(a_op, b0, d15);
    1971           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
    1972             :   BaseWithIndexAndDisplacement64Matcher match134(
    1973           1 :       graph()->NewNode(a_op, s3, temp));
    1974           1 :   CheckBaseWithIndexAndDisplacement(&match134, p1, 3, temp, nullptr);
    1975             : 
    1976             :   // S3 + (B0 - D15) -> [p1, 3, (B0 - D15), NULL]
    1977             :   s3 = graph()->NewNode(s_op, p1, d3);
    1978             :   temp = graph()->NewNode(sub_op, b0, d15);
    1979           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
    1980             :   BaseWithIndexAndDisplacement64Matcher match135(
    1981           1 :       graph()->NewNode(a_op, s3, temp));
    1982           1 :   CheckBaseWithIndexAndDisplacement(&match135, p1, 3, temp, nullptr);
    1983             : 
    1984             :   // B0 + (B1 - D15) -> [b0, 0, (B1 - D15), NULL]
    1985             :   temp = graph()->NewNode(sub_op, b1, d15);
    1986           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
    1987             :   BaseWithIndexAndDisplacement64Matcher match136(
    1988           1 :       graph()->NewNode(a_op, b0, temp));
    1989           1 :   CheckBaseWithIndexAndDisplacement(&match136, b0, 0, temp, nullptr);
    1990             : 
    1991             :   // (B0 - D15) + S3 -> [p1, 3, temp, NULL]
    1992             :   s3 = graph()->NewNode(s_op, p1, d3);
    1993             :   temp = graph()->NewNode(sub_op, b0, d15);
    1994           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
    1995             :   BaseWithIndexAndDisplacement64Matcher match137(
    1996           1 :       graph()->NewNode(a_op, temp, s3));
    1997           1 :   CheckBaseWithIndexAndDisplacement(&match137, p1, 3, temp, nullptr);
    1998             : 
    1999             :   // (B0 + B1) + D15 -> [NULL, 0, (B0 + B1), d15]
    2000             :   temp = graph()->NewNode(a_op, b0, b1);
    2001           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
    2002             :   BaseWithIndexAndDisplacement64Matcher match138(
    2003           1 :       graph()->NewNode(a_op, temp, d15));
    2004           1 :   CheckBaseWithIndexAndDisplacement(&match138, nullptr, 0, temp, d15);
    2005             : 
    2006             :   // D15 + (B0 + B1) -> [NULL, 0, (B0 + B1), d15]
    2007             :   temp = graph()->NewNode(a_op, b0, b1);
    2008           1 :   ADD_NONE_ADDRESSING_OPERAND_USES(temp);
    2009             :   BaseWithIndexAndDisplacement64Matcher match139(
    2010           1 :       graph()->NewNode(a_op, d15, temp));
    2011           1 :   CheckBaseWithIndexAndDisplacement(&match139, nullptr, 0, temp, d15);
    2012           1 : }
    2013             : 
    2014       15419 : TEST_F(NodeMatcherTest, BranchMatcher_match) {
    2015           1 :   Node* zero = graph()->NewNode(common()->Int32Constant(0));
    2016             : 
    2017             :   {
    2018           2 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2019           2 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
    2020           2 :     Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
    2021           1 :     BranchMatcher matcher(branch);
    2022           1 :     EXPECT_TRUE(matcher.Matched());
    2023           2 :     EXPECT_EQ(branch, matcher.Branch());
    2024           2 :     EXPECT_EQ(if_true, matcher.IfTrue());
    2025           2 :     EXPECT_EQ(if_false, matcher.IfFalse());
    2026             :   }
    2027             : 
    2028             :   {
    2029           2 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2030           2 :     Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
    2031           2 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
    2032           1 :     BranchMatcher matcher(branch);
    2033           1 :     EXPECT_TRUE(matcher.Matched());
    2034           2 :     EXPECT_EQ(branch, matcher.Branch());
    2035           2 :     EXPECT_EQ(if_true, matcher.IfTrue());
    2036           2 :     EXPECT_EQ(if_false, matcher.IfFalse());
    2037             :   }
    2038             : 
    2039             :   {
    2040           2 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2041           2 :     Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
    2042           2 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
    2043           1 :     Node* other = graph()->NewNode(common()->IfValue(33), branch);
    2044           1 :     BranchMatcher matcher(branch);
    2045           1 :     EXPECT_TRUE(matcher.Matched());
    2046           2 :     EXPECT_EQ(branch, matcher.Branch());
    2047           2 :     EXPECT_EQ(if_true, matcher.IfTrue());
    2048           2 :     EXPECT_EQ(if_false, matcher.IfFalse());
    2049             :     USE(other);
    2050             :   }
    2051           1 : }
    2052             : 
    2053             : 
    2054       15419 : TEST_F(NodeMatcherTest, BranchMatcher_fail) {
    2055           1 :   Node* zero = graph()->NewNode(common()->Int32Constant(0));
    2056             : 
    2057             :   {
    2058           1 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2059           1 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
    2060           1 :     BranchMatcher matcher(branch);
    2061           2 :     EXPECT_FALSE(matcher.Matched());
    2062             :     USE(if_true);
    2063             :   }
    2064             : 
    2065             :   {
    2066           1 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2067           1 :     Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
    2068           1 :     BranchMatcher matcher(branch);
    2069           2 :     EXPECT_FALSE(matcher.Matched());
    2070             :     USE(if_false);
    2071             :   }
    2072             : 
    2073             :   {
    2074           1 :     BranchMatcher matcher(zero);
    2075           2 :     EXPECT_FALSE(matcher.Matched());
    2076             :   }
    2077             : 
    2078             :   {
    2079           1 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2080           1 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
    2081           1 :     Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
    2082           2 :     EXPECT_TRUE(BranchMatcher(branch).Matched());
    2083           3 :     EXPECT_FALSE(BranchMatcher(if_true).Matched());
    2084           3 :     EXPECT_FALSE(BranchMatcher(if_false).Matched());
    2085             :   }
    2086             : 
    2087             :   {
    2088           1 :     Node* sw = graph()->NewNode(common()->Switch(5), zero, graph()->start());
    2089           1 :     Node* if_true = graph()->NewNode(common()->IfTrue(), sw);
    2090           1 :     Node* if_false = graph()->NewNode(common()->IfFalse(), sw);
    2091           3 :     EXPECT_FALSE(BranchMatcher(sw).Matched());
    2092           3 :     EXPECT_FALSE(BranchMatcher(if_true).Matched());
    2093           3 :     EXPECT_FALSE(BranchMatcher(if_false).Matched());
    2094             :   }
    2095             : 
    2096             :   {
    2097           1 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2098           1 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
    2099           1 :     Node* if_value = graph()->NewNode(common()->IfValue(2), branch);
    2100           1 :     BranchMatcher matcher(branch);
    2101           2 :     EXPECT_FALSE(matcher.Matched());
    2102           3 :     EXPECT_FALSE(BranchMatcher(if_true).Matched());
    2103           3 :     EXPECT_FALSE(BranchMatcher(if_value).Matched());
    2104             :   }
    2105           1 : }
    2106             : 
    2107             : 
    2108       15419 : TEST_F(NodeMatcherTest, DiamondMatcher_match) {
    2109           1 :   Node* zero = graph()->NewNode(common()->Int32Constant(0));
    2110             : 
    2111             :   {
    2112           2 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2113           2 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
    2114           2 :     Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
    2115           2 :     Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
    2116           1 :     DiamondMatcher matcher(merge);
    2117           1 :     EXPECT_TRUE(matcher.Matched());
    2118           2 :     EXPECT_EQ(branch, matcher.Branch());
    2119           2 :     EXPECT_EQ(if_true, matcher.IfTrue());
    2120           2 :     EXPECT_EQ(if_false, matcher.IfFalse());
    2121           2 :     EXPECT_EQ(merge, matcher.Merge());
    2122             :   }
    2123             : 
    2124             :   {
    2125           2 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2126           2 :     Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
    2127           2 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
    2128           2 :     Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
    2129           1 :     DiamondMatcher matcher(merge);
    2130           1 :     EXPECT_TRUE(matcher.Matched());
    2131           2 :     EXPECT_EQ(branch, matcher.Branch());
    2132           2 :     EXPECT_EQ(if_true, matcher.IfTrue());
    2133           2 :     EXPECT_EQ(if_false, matcher.IfFalse());
    2134           2 :     EXPECT_EQ(merge, matcher.Merge());
    2135             :   }
    2136             : 
    2137             :   {
    2138           2 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2139           2 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
    2140           2 :     Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
    2141           2 :     Node* merge = graph()->NewNode(common()->Merge(2), if_false, if_true);
    2142           1 :     DiamondMatcher matcher(merge);
    2143           1 :     EXPECT_TRUE(matcher.Matched());
    2144           2 :     EXPECT_EQ(branch, matcher.Branch());
    2145           2 :     EXPECT_EQ(if_true, matcher.IfTrue());
    2146           2 :     EXPECT_EQ(if_false, matcher.IfFalse());
    2147           2 :     EXPECT_EQ(merge, matcher.Merge());
    2148             :   }
    2149           1 : }
    2150             : 
    2151             : 
    2152       15419 : TEST_F(NodeMatcherTest, DiamondMatcher_fail) {
    2153           1 :   Node* zero = graph()->NewNode(common()->Int32Constant(0));
    2154             : 
    2155             :   {
    2156           1 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2157           1 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
    2158           1 :     Node* if_value = graph()->NewNode(common()->IfValue(1), branch);
    2159           1 :     Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_value);
    2160           1 :     DiamondMatcher matcher(merge);
    2161           2 :     EXPECT_FALSE(matcher.Matched());
    2162             :   }
    2163             : 
    2164             :   {
    2165           1 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2166           1 :     Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
    2167           1 :     Node* if_value = graph()->NewNode(common()->IfValue(1), branch);
    2168           1 :     Node* merge = graph()->NewNode(common()->Merge(2), if_false, if_value);
    2169           1 :     DiamondMatcher matcher(merge);
    2170           2 :     EXPECT_FALSE(matcher.Matched());
    2171             :   }
    2172             : 
    2173             :   {
    2174           2 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2175           2 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
    2176           2 :     Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
    2177           2 :     Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
    2178           1 :     DiamondMatcher matcher(merge);
    2179           1 :     EXPECT_TRUE(matcher.Matched());
    2180           2 :     EXPECT_EQ(branch, matcher.Branch());
    2181           2 :     EXPECT_EQ(if_true, matcher.IfTrue());
    2182           2 :     EXPECT_EQ(if_false, matcher.IfFalse());
    2183           2 :     EXPECT_EQ(merge, matcher.Merge());
    2184             : 
    2185           2 :     EXPECT_FALSE(DiamondMatcher(branch).Matched());  // Must be the merge.
    2186           2 :     EXPECT_FALSE(DiamondMatcher(if_true).Matched());
    2187           2 :     EXPECT_FALSE(DiamondMatcher(if_false).Matched());
    2188             :   }
    2189             : 
    2190             :   {
    2191           1 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2192           1 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
    2193           1 :     Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
    2194           1 :     Node* merge = graph()->NewNode(common()->Merge(3), if_true, if_false,
    2195             :                                    graph()->start());
    2196           1 :     DiamondMatcher matcher(merge);
    2197           2 :     EXPECT_FALSE(matcher.Matched());  // Too many inputs to merge.
    2198             :   }
    2199             : 
    2200             :   {
    2201           1 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2202           1 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
    2203             :     Node* if_false = graph()->start();
    2204           1 :     Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
    2205           1 :     DiamondMatcher matcher(merge);
    2206           2 :     EXPECT_FALSE(matcher.Matched());
    2207             :   }
    2208             : 
    2209             :   {
    2210           1 :     Node* branch = graph()->NewNode(common()->Branch(), zero, graph()->start());
    2211             :     Node* if_true = graph()->start();
    2212           1 :     Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
    2213           1 :     Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
    2214           1 :     DiamondMatcher matcher(merge);
    2215           2 :     EXPECT_FALSE(matcher.Matched());
    2216             :   }
    2217             : 
    2218             :   {
    2219             :     Node* branch1 =
    2220           1 :         graph()->NewNode(common()->Branch(), zero, graph()->start());
    2221             :     Node* branch2 =
    2222           1 :         graph()->NewNode(common()->Branch(), zero, graph()->start());
    2223           1 :     Node* if_true = graph()->NewNode(common()->IfTrue(), branch1);
    2224           1 :     Node* if_false = graph()->NewNode(common()->IfFalse(), branch2);
    2225           1 :     Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
    2226           1 :     DiamondMatcher matcher(merge);
    2227           2 :     EXPECT_FALSE(matcher.Matched());
    2228             :   }
    2229           1 : }
    2230             : 
    2231             : 
    2232             : }  // namespace compiler
    2233             : }  // namespace internal
    2234        9249 : }  // namespace v8

Generated by: LCOV version 1.10