18640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
28640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
38640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org// found in the LICENSE file.
48640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org
5ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org#include "src/compiler/instruction-selector-unittest.h"
68640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org
78640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgnamespace v8 {
88640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgnamespace internal {
98640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgnamespace compiler {
108640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org
115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgnamespace {
128640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org
135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgtypedef RawMachineAssembler::Label MLabel;
145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgtypedef Node* (RawMachineAssembler::*Constructor)(Node*, Node*);
158640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org
165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Data processing instructions.
185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstruct DPI {
195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Constructor constructor;
205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const char* constructor_name;
215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ArchOpcode arch_opcode;
225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ArchOpcode reverse_arch_opcode;
235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ArchOpcode test_arch_opcode;
245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org};
255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstd::ostream& operator<<(std::ostream& os, const DPI& dpi) {
285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  return os << dpi.constructor_name;
295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic const DPI kDPIs[] = {
335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    {&RawMachineAssembler::Word32And, "Word32And", kArmAnd, kArmAnd, kArmTst},
345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    {&RawMachineAssembler::Word32Or, "Word32Or", kArmOrr, kArmOrr, kArmOrr},
355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    {&RawMachineAssembler::Word32Xor, "Word32Xor", kArmEor, kArmEor, kArmTeq},
365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    {&RawMachineAssembler::Int32Add, "Int32Add", kArmAdd, kArmAdd, kArmCmn},
375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    {&RawMachineAssembler::Int32Sub, "Int32Sub", kArmSub, kArmRsb, kArmCmp}};
385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Data processing instructions with overflow.
415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstruct ODPI {
425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Constructor constructor;
435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const char* constructor_name;
445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ArchOpcode arch_opcode;
455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ArchOpcode reverse_arch_opcode;
465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org};
475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstd::ostream& operator<<(std::ostream& os, const ODPI& odpi) {
505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  return os << odpi.constructor_name;
515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic const ODPI kODPIs[] = {{&RawMachineAssembler::Int32AddWithOverflow,
555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                               "Int32AddWithOverflow", kArmAdd, kArmAdd},
565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                              {&RawMachineAssembler::Int32SubWithOverflow,
575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                               "Int32SubWithOverflow", kArmSub, kArmRsb}};
585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Shifts.
615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstruct Shift {
625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Constructor constructor;
635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const char* constructor_name;
645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  int32_t i_low;          // lowest possible immediate
655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  int32_t i_high;         // highest possible immediate
665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  AddressingMode i_mode;  // Operand2_R_<shift>_I
675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  AddressingMode r_mode;  // Operand2_R_<shift>_R
685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org};
695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstd::ostream& operator<<(std::ostream& os, const Shift& shift) {
725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  return os << shift.constructor_name;
735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic const Shift kShifts[] = {
775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    {&RawMachineAssembler::Word32Sar, "Word32Sar", 1, 32,
785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org     kMode_Operand2_R_ASR_I, kMode_Operand2_R_ASR_R},
795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    {&RawMachineAssembler::Word32Shl, "Word32Shl", 0, 31,
805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org     kMode_Operand2_R_LSL_I, kMode_Operand2_R_LSL_R},
815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    {&RawMachineAssembler::Word32Shr, "Word32Shr", 1, 32,
825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org     kMode_Operand2_R_LSR_I, kMode_Operand2_R_LSR_R},
835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    {&RawMachineAssembler::Word32Ror, "Word32Ror", 1, 31,
845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org     kMode_Operand2_R_ROR_I, kMode_Operand2_R_ROR_R}};
855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Immediates (random subset).
885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic const int32_t kImmediates[] = {
895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    -2147483617, -2147483606, -2113929216, -2080374784, -1996488704,
905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    -1879048192, -1459617792, -1358954496, -1342177265, -1275068414,
915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    -1073741818, -1073741777, -855638016,  -805306368,  -402653184,
925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    -268435444,  -16777216,   0,           35,          61,
935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    105,         116,         171,         245,         255,
945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    692,         1216,        1248,        1520,        1600,
955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    1888,        3744,        4080,        5888,        8384,
965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    9344,        9472,        9792,        13312,       15040,
975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    15360,       20736,       22272,       23296,       32000,
985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    33536,       37120,       45824,       47872,       56320,
995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    59392,       65280,       72704,       101376,      147456,
1005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    161792,      164864,      167936,      173056,      195584,
1015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    209920,      212992,      356352,      655360,      704512,
1025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    716800,      851968,      901120,      1044480,     1523712,
1035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    2572288,     3211264,     3588096,     3833856,     3866624,
1045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    4325376,     5177344,     6488064,     7012352,     7471104,
1055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    14090240,    16711680,    19398656,    22282240,    28573696,
1065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    30408704,    30670848,    43253760,    54525952,    55312384,
1075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    56623104,    68157440,    115343360,   131072000,   187695104,
1085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    188743680,   195035136,   197132288,   203423744,   218103808,
1095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    267386880,   268435470,   285212672,   402653185,   415236096,
1105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    595591168,   603979776,   603979778,   629145600,   1073741835,
1115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    1073741855,  1073741861,  1073741884,  1157627904,  1476395008,
1125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    1476395010,  1610612741,  2030043136,  2080374785,  2097152000};
1135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}  // namespace
1155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// -----------------------------------------------------------------------------
1185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Data processing instructions.
1195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgtypedef InstructionSelectorTestWithParam<DPI> InstructionSelectorDPITest;
1225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorDPITest, Parameters) {
1255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const DPI dpi = GetParam();
1265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
1275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)));
1285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
1295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
1305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode());
1315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
1325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(2U, s[0]->InputCount());
1335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(1U, s[0]->OutputCount());
1345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
1355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorDPITest, Immediate) {
1385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const DPI dpi = GetParam();
1395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
1405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
1415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return((m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)));
1425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
1435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
1445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode());
1455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
1465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
1475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
1485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
1495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
1505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
1515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
1525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return((m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)));
1535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
1545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
1555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(dpi.reverse_arch_opcode, s[0]->arch_opcode());
1565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
1575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
1585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
1595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
1605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
1615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
1625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorDPITest, ShiftByParameter) {
1655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const DPI dpi = GetParam();
1665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
1675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
1685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return((m.*dpi.constructor)(
1695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        m.Parameter(0),
1705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        (m.*shift.constructor)(m.Parameter(1), m.Parameter(2))));
1715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
1725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
1735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode());
1745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
1755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(3U, s[0]->InputCount());
1765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
1775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
1785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
1795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
1805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return((m.*dpi.constructor)(
1815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        (m.*shift.constructor)(m.Parameter(0), m.Parameter(1)),
1825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        m.Parameter(2)));
1835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
1845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
1855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(dpi.reverse_arch_opcode, s[0]->arch_opcode());
1865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
1875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(3U, s[0]->InputCount());
1885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
1895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
1905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
1915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorDPITest, ShiftByImmediate) {
1945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const DPI dpi = GetParam();
1955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
1965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
1975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
1985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return((m.*dpi.constructor)(
1995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          m.Parameter(0),
2005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          (m.*shift.constructor)(m.Parameter(1), m.Int32Constant(imm))));
2015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build();
2025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
2035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode());
2045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
2055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
2065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
2075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(1U, s[0]->OutputCount());
2085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
2095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
2105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
2115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
2125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
2135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return((m.*dpi.constructor)(
2145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          (m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm)),
2155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          m.Parameter(1)));
2165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build();
2175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
2185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(dpi.reverse_arch_opcode, s[0]->arch_opcode());
2195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
2205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
2215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
2225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(1U, s[0]->OutputCount());
2235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
2245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
2255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
2265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
2275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
2285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorDPITest, BranchWithParameters) {
2295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const DPI dpi = GetParam();
2305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
2315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  MLabel a, b;
2325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Branch((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), &a, &b);
2335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Bind(&a);
2345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Constant(1));
2355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Bind(&b);
2365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Constant(0));
2375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
2385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
2395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
2405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
2415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
2425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kNotEqual, s[0]->flags_condition());
2435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
2445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
2455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
2465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorDPITest, BranchWithImmediate) {
2475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const DPI dpi = GetParam();
2485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
2495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
2505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    MLabel a, b;
2515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Branch((m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), &a,
2525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org             &b);
2535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&a);
2545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(1));
2555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&b);
2565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(0));
2575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
2585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
2595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
2605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
2615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
2625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kNotEqual, s[0]->flags_condition());
2635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
2645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
2655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
2665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    MLabel a, b;
2675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Branch((m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)), &a,
2685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org             &b);
2695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&a);
2705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(1));
2715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&b);
2725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(0));
2735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
2745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
2755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
2765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
2775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
2785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kNotEqual, s[0]->flags_condition());
2795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
2805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
2815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
2825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
2835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorDPITest, BranchWithShiftByParameter) {
2845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const DPI dpi = GetParam();
2855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
2865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
2875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    MLabel a, b;
2885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Branch((m.*dpi.constructor)(
2895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 m.Parameter(0),
2905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 (m.*shift.constructor)(m.Parameter(1), m.Parameter(2))),
2915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org             &a, &b);
2925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&a);
2935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(1));
2945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&b);
2955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(0));
2965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
2975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
2985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
2995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
3005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
3015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kNotEqual, s[0]->flags_condition());
3025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
3035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
3045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
3055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    MLabel a, b;
3065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Branch((m.*dpi.constructor)(
3075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 (m.*shift.constructor)(m.Parameter(0), m.Parameter(1)),
3085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 m.Parameter(2)),
3095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org             &a, &b);
3105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&a);
3115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(1));
3125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&b);
3135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(0));
3145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
3155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
3165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
3175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
3185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
3195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kNotEqual, s[0]->flags_condition());
3205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
3215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
3225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
3235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
3245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorDPITest, BranchWithShiftByImmediate) {
3255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const DPI dpi = GetParam();
3265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
3275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
3285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
3295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      MLabel a, b;
3305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Branch((m.*dpi.constructor)(m.Parameter(0),
3315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                                    (m.*shift.constructor)(
3325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                                        m.Parameter(1), m.Int32Constant(imm))),
3335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org               &a, &b);
3345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Bind(&a);
3355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Int32Constant(1));
3365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Bind(&b);
3375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Int32Constant(0));
3385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build();
3395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
3405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
3415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
3425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(5U, s[0]->InputCount());
3435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
3445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
3455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kNotEqual, s[0]->flags_condition());
3465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
3475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
3485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
3495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
3505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
3515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      MLabel a, b;
3525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Branch((m.*dpi.constructor)(
3535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                   (m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm)),
3545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                   m.Parameter(1)),
3555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org               &a, &b);
3565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Bind(&a);
3575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Int32Constant(1));
3585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Bind(&b);
3595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Int32Constant(0));
3605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build();
3615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
3625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
3635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
3645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(5U, s[0]->InputCount());
3655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
3665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
3675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kNotEqual, s[0]->flags_condition());
3685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
3695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
3705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
3715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
3725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
3735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorDPITest, BranchIfZeroWithParameters) {
3745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const DPI dpi = GetParam();
3755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
3765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  MLabel a, b;
3775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Branch(m.Word32Equal((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)),
3785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                         m.Int32Constant(0)),
3795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org           &a, &b);
3805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Bind(&a);
3815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Constant(1));
3825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Bind(&b);
3835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Constant(0));
3845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
3855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
3865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
3875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
3885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
3895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kEqual, s[0]->flags_condition());
3905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
3915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
3925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
3935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorDPITest, BranchIfNotZeroWithParameters) {
3945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const DPI dpi = GetParam();
3955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
3965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  MLabel a, b;
3975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Branch(
3985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Word32NotEqual((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)),
3995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                       m.Int32Constant(0)),
4005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      &a, &b);
4015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Bind(&a);
4025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Constant(1));
4035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Bind(&b);
4045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Constant(0));
4055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
4065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
4075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
4085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
4095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
4105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kNotEqual, s[0]->flags_condition());
4115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
4125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorDPITest, BranchIfZeroWithImmediate) {
4155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const DPI dpi = GetParam();
4165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
4175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
4185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    MLabel a, b;
4195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Branch(m.Word32Equal(
4205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 (m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)),
4215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 m.Int32Constant(0)),
4225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org             &a, &b);
4235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&a);
4245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(1));
4255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&b);
4265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(0));
4275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
4285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
4295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
4305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
4315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
4325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kEqual, s[0]->flags_condition());
4335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
4345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
4355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
4365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    MLabel a, b;
4375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Branch(m.Word32Equal(
4385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 (m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)),
4395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 m.Int32Constant(0)),
4405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org             &a, &b);
4415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&a);
4425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(1));
4435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&b);
4445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(0));
4455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
4465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
4475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
4485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
4495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
4505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kEqual, s[0]->flags_condition());
4515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
4525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
4535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorDPITest, BranchIfNotZeroWithImmediate) {
4565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const DPI dpi = GetParam();
4575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
4585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
4595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    MLabel a, b;
4605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Branch(m.Word32NotEqual(
4615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 (m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)),
4625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 m.Int32Constant(0)),
4635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org             &a, &b);
4645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&a);
4655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(1));
4665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&b);
4675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(0));
4685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
4695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
4705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
4715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
4725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
4735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kNotEqual, s[0]->flags_condition());
4745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
4755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
4765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
4775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    MLabel a, b;
4785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Branch(m.Word32NotEqual(
4795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 (m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)),
4805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 m.Int32Constant(0)),
4815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org             &a, &b);
4825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&a);
4835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(1));
4845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&b);
4855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(0));
4865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
4875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
4885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
4895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
4905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
4915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kNotEqual, s[0]->flags_condition());
4925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
4935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
4945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgINSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorDPITest,
4975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                        ::testing::ValuesIn(kDPIs));
4985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// -----------------------------------------------------------------------------
5015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Data processing instructions with overflow.
5025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgtypedef InstructionSelectorTestWithParam<ODPI> InstructionSelectorODPITest;
5055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, OvfWithParameters) {
5085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
5095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
5105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(
5115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Projection(1, (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1))));
5125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
5135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
5145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
5155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
5165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(2U, s[0]->InputCount());
5175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_LE(1U, s[0]->OutputCount());
5185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kFlags_set, s[0]->flags_mode());
5195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kOverflow, s[0]->flags_condition());
5205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
5215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, OvfWithImmediate) {
5245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
5255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
5265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
5275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Projection(
5285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        1, (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm))));
5295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
5305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
5315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
5325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
5335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
5345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
5355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_LE(1U, s[0]->OutputCount());
5365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
5375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kOverflow, s[0]->flags_condition());
5385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
5395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
5405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
5415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Projection(
5425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        1, (m.*odpi.constructor)(m.Int32Constant(imm), m.Parameter(0))));
5435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
5445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
5455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
5465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
5475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
5485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
5495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_LE(1U, s[0]->OutputCount());
5505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
5515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kOverflow, s[0]->flags_condition());
5525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
5535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
5545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, OvfWithShiftByParameter) {
5575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
5585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
5595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
5605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Projection(
5615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        1, (m.*odpi.constructor)(
5625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org               m.Parameter(0),
5635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org               (m.*shift.constructor)(m.Parameter(1), m.Parameter(2)))));
5645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
5655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
5665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
5675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
5685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(3U, s[0]->InputCount());
5695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_LE(1U, s[0]->OutputCount());
5705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
5715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kOverflow, s[0]->flags_condition());
5725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
5735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
5745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
5755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Projection(
5765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        1, (m.*odpi.constructor)(
5775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org               (m.*shift.constructor)(m.Parameter(0), m.Parameter(1)),
5785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org               m.Parameter(0))));
5795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
5805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
5815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
5825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
5835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(3U, s[0]->InputCount());
5845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_LE(1U, s[0]->OutputCount());
5855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
5865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kOverflow, s[0]->flags_condition());
5875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
5885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
5895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, OvfWithShiftByImmediate) {
5925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
5935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
5945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
5955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
5965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Projection(
5975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          1, (m.*odpi.constructor)(m.Parameter(0),
5985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                                   (m.*shift.constructor)(
5995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                                       m.Parameter(1), m.Int32Constant(imm)))));
6005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build();
6015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
6025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
6035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
6045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
6055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
6065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_LE(1U, s[0]->OutputCount());
6075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kFlags_set, s[0]->flags_mode());
6085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kOverflow, s[0]->flags_condition());
6095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
6105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
6115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
6125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
6135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
6145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Projection(
6155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          1, (m.*odpi.constructor)(
6165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 (m.*shift.constructor)(m.Parameter(1), m.Int32Constant(imm)),
6175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 m.Parameter(0))));
6185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build();
6195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
6205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
6215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
6225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
6235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
6245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_LE(1U, s[0]->OutputCount());
6255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kFlags_set, s[0]->flags_mode());
6265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kOverflow, s[0]->flags_condition());
6275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
6285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
6295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
6305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
6315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
6325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, ValWithParameters) {
6335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
6345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
6355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(
6365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Projection(0, (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1))));
6375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
6385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
6395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
6405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
6415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(2U, s[0]->InputCount());
6425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_LE(1U, s[0]->OutputCount());
6435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kFlags_none, s[0]->flags_mode());
6445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
6455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
6465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
6475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, ValWithImmediate) {
6485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
6495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
6505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
6515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Projection(
6525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        0, (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm))));
6535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
6545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
6555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
6565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
6575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
6585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
6595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_LE(1U, s[0]->OutputCount());
6605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_none, s[0]->flags_mode());
6615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
6625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
6635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
6645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Projection(
6655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        0, (m.*odpi.constructor)(m.Int32Constant(imm), m.Parameter(0))));
6665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
6675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
6685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
6695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
6705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
6715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
6725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_LE(1U, s[0]->OutputCount());
6735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_none, s[0]->flags_mode());
6745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
6755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
6765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
6775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
6785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, ValWithShiftByParameter) {
6795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
6805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
6815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
6825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Projection(
6835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        0, (m.*odpi.constructor)(
6845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org               m.Parameter(0),
6855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org               (m.*shift.constructor)(m.Parameter(1), m.Parameter(2)))));
6865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
6875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
6885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
6895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
6905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(3U, s[0]->InputCount());
6915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_LE(1U, s[0]->OutputCount());
6925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_none, s[0]->flags_mode());
6935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
6945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
6955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
6965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Projection(
6975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        0, (m.*odpi.constructor)(
6985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org               (m.*shift.constructor)(m.Parameter(0), m.Parameter(1)),
6995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org               m.Parameter(0))));
7005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
7015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
7025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
7035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
7045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(3U, s[0]->InputCount());
7055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_LE(1U, s[0]->OutputCount());
7065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_none, s[0]->flags_mode());
7075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
7085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
7095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
7105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
7115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, ValWithShiftByImmediate) {
7125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
7135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
7145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
7155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
7165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Projection(
7175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          0, (m.*odpi.constructor)(m.Parameter(0),
7185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                                   (m.*shift.constructor)(
7195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                                       m.Parameter(1), m.Int32Constant(imm)))));
7205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build();
7215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
7225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
7235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
7245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
7255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
7265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_LE(1U, s[0]->OutputCount());
7275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kFlags_none, s[0]->flags_mode());
7285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
7295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
7305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
7315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
7325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
7335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Projection(
7345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          0, (m.*odpi.constructor)(
7355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 (m.*shift.constructor)(m.Parameter(1), m.Int32Constant(imm)),
7365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                 m.Parameter(0))));
7375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build();
7385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
7395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
7405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
7415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
7425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
7435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_LE(1U, s[0]->OutputCount());
7445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kFlags_none, s[0]->flags_mode());
7455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
7465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
7475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
7485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
7495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
7505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, BothWithParameters) {
7515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
7525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
7535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1));
7545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
7555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
7565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_LE(1U, s.size());
7575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
7585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
7595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(2U, s[0]->InputCount());
7605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(2U, s[0]->OutputCount());
7615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kFlags_set, s[0]->flags_mode());
7625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kOverflow, s[0]->flags_condition());
7635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
7645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
7655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
7665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, BothWithImmediate) {
7675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
7685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
7695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
7705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm));
7715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
7725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
7735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_LE(1U, s.size());
7745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
7755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
7765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
7775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
7785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(2U, s[0]->OutputCount());
7795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
7805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kOverflow, s[0]->flags_condition());
7815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
7825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
7835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
7845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Node* n = (m.*odpi.constructor)(m.Int32Constant(imm), m.Parameter(0));
7855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
7865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
7875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_LE(1U, s.size());
7885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
7895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
7905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
7915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
7925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(2U, s[0]->OutputCount());
7935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
7945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kOverflow, s[0]->flags_condition());
7955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
7965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
7975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
7985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
7995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, BothWithShiftByParameter) {
8005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
8015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
8025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
8035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Node* n = (m.*odpi.constructor)(
8045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        m.Parameter(0), (m.*shift.constructor)(m.Parameter(1), m.Parameter(2)));
8055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
8065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
8075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_LE(1U, s.size());
8085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
8095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
8105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(3U, s[0]->InputCount());
8115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(2U, s[0]->OutputCount());
8125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
8135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kOverflow, s[0]->flags_condition());
8145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
8155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
8165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
8175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Node* n = (m.*odpi.constructor)(
8185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        (m.*shift.constructor)(m.Parameter(0), m.Parameter(1)), m.Parameter(2));
8195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
8205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
8215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_LE(1U, s.size());
8225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
8235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
8245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(3U, s[0]->InputCount());
8255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(2U, s[0]->OutputCount());
8265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
8275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kOverflow, s[0]->flags_condition());
8285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
8295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
8305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
8315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
8325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, BothWithShiftByImmediate) {
8335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
8345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
8355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
8365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
8375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Node* n = (m.*odpi.constructor)(
8385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          m.Parameter(0),
8395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          (m.*shift.constructor)(m.Parameter(1), m.Int32Constant(imm)));
8405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
8415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build();
8425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_LE(1U, s.size());
8435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
8445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
8455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
8465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
8475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(2U, s[0]->OutputCount());
8485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kFlags_set, s[0]->flags_mode());
8495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kOverflow, s[0]->flags_condition());
8505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
8515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
8525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(Shift, shift, kShifts) {
8535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
8545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
8555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Node* n = (m.*odpi.constructor)(
8565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          (m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm)),
8575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          m.Parameter(1));
8585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
8595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build();
8605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_LE(1U, s.size());
8615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
8625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
8635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
8645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
8655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(2U, s[0]->OutputCount());
8665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kFlags_set, s[0]->flags_mode());
8675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kOverflow, s[0]->flags_condition());
8685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
8695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
8705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
8715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
8725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
8735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, BranchWithParameters) {
8745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
8755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
8765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  MLabel a, b;
8775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1));
8785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Branch(m.Projection(1, n), &a, &b);
8795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Bind(&a);
8805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Constant(0));
8815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Bind(&b);
8825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Projection(0, n));
8835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
8845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
8855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
8865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
8875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(4U, s[0]->InputCount());
8885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(1U, s[0]->OutputCount());
8895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
8905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kOverflow, s[0]->flags_condition());
8915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
8925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
8935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
8945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, BranchWithImmediate) {
8955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
8965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
8975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
8985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    MLabel a, b;
8995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm));
9005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Branch(m.Projection(1, n), &a, &b);
9015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&a);
9025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(0));
9035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&b);
9045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Projection(0, n));
9055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
9065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
9075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
9085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
9095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(4U, s[0]->InputCount());
9105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
9115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
9125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
9135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kOverflow, s[0]->flags_condition());
9145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
9155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
9165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
9175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    MLabel a, b;
9185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Node* n = (m.*odpi.constructor)(m.Int32Constant(imm), m.Parameter(0));
9195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Branch(m.Projection(1, n), &a, &b);
9205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&a);
9215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Constant(0));
9225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Bind(&b);
9235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Projection(0, n));
9245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
9255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
9265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
9275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
9285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(4U, s[0]->InputCount());
9295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
9305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
9315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
9325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kOverflow, s[0]->flags_condition());
9335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
9345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
9355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
9365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
9375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, BranchIfZeroWithParameters) {
9385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
9395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
9405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  MLabel a, b;
9415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1));
9425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Branch(m.Word32Equal(m.Projection(1, n), m.Int32Constant(0)), &a, &b);
9435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Bind(&a);
9445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Projection(0, n));
9455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Bind(&b);
9465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Constant(0));
9475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
9485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
9495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
9505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
9515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(4U, s[0]->InputCount());
9525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(1U, s[0]->OutputCount());
9535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
9545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kNotOverflow, s[0]->flags_condition());
9555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
9565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
9575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
9585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorODPITest, BranchIfNotZeroWithParameters) {
9595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const ODPI odpi = GetParam();
9605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
9615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  MLabel a, b;
9625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1));
9635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Branch(m.Word32NotEqual(m.Projection(1, n), m.Int32Constant(0)), &a, &b);
9645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Bind(&a);
9655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Projection(0, n));
9665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Bind(&b);
9675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Constant(0));
9685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
9695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
9705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
9715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
9725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(4U, s[0]->InputCount());
9735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(1U, s[0]->OutputCount());
9745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kFlags_branch, s[0]->flags_mode());
9755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kOverflow, s[0]->flags_condition());
9765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
9775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
9785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
9795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgINSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorODPITest,
9805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                        ::testing::ValuesIn(kODPIs));
9815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
9825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
9835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// -----------------------------------------------------------------------------
9845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Shifts.
9855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
9865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
9875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgtypedef InstructionSelectorTestWithParam<Shift> InstructionSelectorShiftTest;
9885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
9895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
9905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorShiftTest, Parameters) {
9915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const Shift shift = GetParam();
9925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
9935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return((m.*shift.constructor)(m.Parameter(0), m.Parameter(1)));
9945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
9955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
9965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmMov, s[0]->arch_opcode());
9975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
9985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(2U, s[0]->InputCount());
9995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(1U, s[0]->OutputCount());
10005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
10015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
10025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
10035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorShiftTest, Immediate) {
10045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const Shift shift = GetParam();
10055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
10065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
10075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return((m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm)));
10085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
10095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
10105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmMov, s[0]->arch_opcode());
10115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
10125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
10135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
10145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
10155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
10165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
10175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
10185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
10195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorShiftTest, Word32EqualWithParameter) {
10205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const Shift shift = GetParam();
10215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  {
10225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
10235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(
10245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        m.Word32Equal(m.Parameter(0),
10255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                      (m.*shift.constructor)(m.Parameter(1), m.Parameter(2))));
10265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
10275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
10285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
10295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
10305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(3U, s[0]->InputCount());
10315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
10325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
10335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kEqual, s[0]->flags_condition());
10345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
10355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  {
10365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
10375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(
10385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        m.Word32Equal((m.*shift.constructor)(m.Parameter(1), m.Parameter(2)),
10395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                      m.Parameter(0)));
10405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
10415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
10425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
10435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
10445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(3U, s[0]->InputCount());
10455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
10465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
10475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kEqual, s[0]->flags_condition());
10485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
10495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
10505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
10515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
10525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorShiftTest, Word32EqualWithParameterAndImmediate) {
10535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const Shift shift = GetParam();
10545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
10555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
10565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32Equal(
10575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        (m.*shift.constructor)(m.Parameter(1), m.Int32Constant(imm)),
10585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        m.Parameter(0)));
10595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
10605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
10615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
10625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
10635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(3U, s[0]->InputCount());
10645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
10655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
10665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
10675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kEqual, s[0]->flags_condition());
10685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
10695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
10705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
10715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32Equal(
10725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        m.Parameter(0),
10735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        (m.*shift.constructor)(m.Parameter(1), m.Int32Constant(imm))));
10745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
10755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
10765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
10775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
10785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(3U, s[0]->InputCount());
10795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
10805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
10815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
10825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kEqual, s[0]->flags_condition());
10835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
10845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
10855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
10865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
10875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorShiftTest, Word32EqualToZeroWithParameters) {
10885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const Shift shift = GetParam();
10895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
10905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(
10915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Word32Equal(m.Int32Constant(0),
10925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                    (m.*shift.constructor)(m.Parameter(0), m.Parameter(1))));
10935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
10945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
10955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmMov, s[0]->arch_opcode());
10965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
10975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(2U, s[0]->InputCount());
10985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(2U, s[0]->OutputCount());
10995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kFlags_set, s[0]->flags_mode());
11005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kEqual, s[0]->flags_condition());
11015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
11025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorShiftTest, Word32EqualToZeroWithImmediate) {
11055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const Shift shift = GetParam();
11065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
11075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
11085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32Equal(
11095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        m.Int32Constant(0),
11105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        (m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm))));
11115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
11125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
11135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmMov, s[0]->arch_opcode());
11145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
11155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
11165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
11175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(2U, s[0]->OutputCount());
11185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
11195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kEqual, s[0]->flags_condition());
11205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
11215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
11225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorShiftTest, Word32NotWithParameters) {
11255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const Shift shift = GetParam();
11265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
11275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Word32Not((m.*shift.constructor)(m.Parameter(0), m.Parameter(1))));
11285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
11295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
11305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmMvn, s[0]->arch_opcode());
11315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
11325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(2U, s[0]->InputCount());
11335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(1U, s[0]->OutputCount());
11345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
11355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorShiftTest, Word32NotWithImmediate) {
11385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const Shift shift = GetParam();
11395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
11405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
11415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32Not(
11425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        (m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm))));
11435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
11445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
11455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmMvn, s[0]->arch_opcode());
11465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
11475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
11485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
11495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
11505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
11515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
11525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorShiftTest, Word32AndWithWord32NotWithParameters) {
11555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const Shift shift = GetParam();
11565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
11575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Word32And(m.Parameter(0), m.Word32Not((m.*shift.constructor)(
11585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                                           m.Parameter(1), m.Parameter(2)))));
11595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
11605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
11615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmBic, s[0]->arch_opcode());
11625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(shift.r_mode, s[0]->addressing_mode());
11635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(3U, s[0]->InputCount());
11645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(1U, s[0]->OutputCount());
11655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
11665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_P(InstructionSelectorShiftTest, Word32AndWithWord32NotWithImmediate) {
11695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  const Shift shift = GetParam();
11705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) {
11715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
11725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32And(m.Parameter(0),
11735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                         m.Word32Not((m.*shift.constructor)(
11745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                             m.Parameter(1), m.Int32Constant(imm)))));
11755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
11765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
11775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmBic, s[0]->arch_opcode());
11785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(shift.i_mode, s[0]->addressing_mode());
11795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(3U, s[0]->InputCount());
11805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
11815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
11825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
11835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
11845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgINSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorShiftTest,
11875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                        ::testing::ValuesIn(kShifts));
11885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// -----------------------------------------------------------------------------
11916474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org// Memory access instructions.
11926474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
11936474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
11946474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgnamespace {
11956474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
11966474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgstruct MemoryAccess {
11976474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  MachineType type;
11986474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  ArchOpcode ldr_opcode;
11996474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  ArchOpcode str_opcode;
1200fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  bool (InstructionSelectorTest::Stream::*val_predicate)(
1201fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      const InstructionOperand*) const;
12026474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  const int32_t immediates[40];
12036474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org};
12046474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
12056474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
12066474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgstd::ostream& operator<<(std::ostream& os, const MemoryAccess& memacc) {
12076474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  OStringStream ost;
12086474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  ost << memacc.type;
12096474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  return os << ost.c_str();
12106474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}
12116474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
12126474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
12136474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgstatic const MemoryAccess kMemoryAccesses[] = {
12146474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    {kMachInt8,
12156474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     kArmLdrsb,
12166474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     kArmStrb,
1217fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org     &InstructionSelectorTest::Stream::IsInteger,
12186474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89,
12196474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org      -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109,
12206474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org      115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}},
12216474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    {kMachUint8,
12226474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     kArmLdrb,
12236474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     kArmStrb,
1224fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org     &InstructionSelectorTest::Stream::IsInteger,
12256474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     {-4095, -3914, -3536, -3234, -3185, -3169, -1073, -990, -859, -720, -434,
12266474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org      -127, -124, -122, -105, -91, -86, -64, -55, -53, -30, -10, -3, 0, 20, 28,
12276474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org      39, 58, 64, 73, 75, 100, 108, 121, 686, 963, 1363, 2759, 3449, 4095}},
12286474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    {kMachInt16,
12296474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     kArmLdrsh,
12306474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     kArmStrh,
1231fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org     &InstructionSelectorTest::Stream::IsInteger,
12326474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     {-255, -251, -232, -220, -144, -138, -130, -126, -116, -115, -102, -101,
12336474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org      -98, -69, -59, -56, -39, -35, -23, -19, -7, 0, 22, 26, 37, 68, 83, 87, 98,
12346474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org      102, 108, 111, 117, 171, 195, 203, 204, 245, 246, 255}},
12356474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    {kMachUint16,
12366474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     kArmLdrh,
12376474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     kArmStrh,
1238fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org     &InstructionSelectorTest::Stream::IsInteger,
12396474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     {-255, -230, -201, -172, -125, -119, -118, -105, -98, -79, -54, -42, -41,
12406474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org      -32, -12, -11, -5, -4, 0, 5, 9, 25, 28, 51, 58, 60, 89, 104, 108, 109,
12416474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org      114, 116, 120, 138, 150, 161, 166, 172, 228, 255}},
12426474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    {kMachInt32,
12436474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     kArmLdr,
12446474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     kArmStr,
1245fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org     &InstructionSelectorTest::Stream::IsInteger,
12466474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     {-4095, -1898, -1685, -1562, -1408, -1313, -344, -128, -116, -100, -92,
12476474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org      -80, -72, -71, -56, -25, -21, -11, -9, 0, 3, 5, 27, 28, 42, 52, 63, 88,
12486474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org      93, 97, 125, 846, 1037, 2102, 2403, 2597, 2632, 2997, 3935, 4095}},
1249fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    {kMachFloat32,
1250fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org     kArmVldr32,
1251fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org     kArmVstr32,
1252fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org     &InstructionSelectorTest::Stream::IsDouble,
1253fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org     {-1020, -928, -896, -772, -728, -680, -660, -488, -372, -112, -100, -92,
1254fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      -84, -80, -72, -64, -60, -56, -52, -48, -36, -32, -20, -8, -4, 0, 8, 20,
1255fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      24, 40, 64, 112, 204, 388, 516, 852, 856, 976, 988, 1020}},
12566474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    {kMachFloat64,
12576474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     kArmVldr64,
12586474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     kArmVstr64,
1259fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org     &InstructionSelectorTest::Stream::IsDouble,
12606474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org     {-1020, -948, -796, -696, -612, -364, -320, -308, -128, -112, -108, -104,
12616474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org      -96, -84, -80, -56, -48, -40, -20, 0, 24, 28, 36, 48, 64, 84, 96, 100,
12626474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org      108, 116, 120, 140, 156, 408, 432, 444, 772, 832, 940, 1020}}};
12636474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
12646474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}  // namespace
12656474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
12666474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
12676474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgtypedef InstructionSelectorTestWithParam<MemoryAccess>
12686474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    InstructionSelectorMemoryAccessTest;
12696474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
12706474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
12716474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgTEST_P(InstructionSelectorMemoryAccessTest, LoadWithParameters) {
12726474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  const MemoryAccess memacc = GetParam();
12736474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  StreamBuilder m(this, memacc.type, kMachPtr, kMachInt32);
12746474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  m.Return(m.Load(memacc.type, m.Parameter(0), m.Parameter(1)));
12756474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  Stream s = m.Build();
12766474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  ASSERT_EQ(1U, s.size());
12776474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  EXPECT_EQ(memacc.ldr_opcode, s[0]->arch_opcode());
12786474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  EXPECT_EQ(kMode_Offset_RR, s[0]->addressing_mode());
12796474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  EXPECT_EQ(2U, s[0]->InputCount());
1280fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  ASSERT_EQ(1U, s[0]->OutputCount());
1281fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  EXPECT_TRUE((s.*memacc.val_predicate)(s[0]->Output()));
12826474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}
12836474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
12846474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
12856474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgTEST_P(InstructionSelectorMemoryAccessTest, LoadWithImmediateIndex) {
12866474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  const MemoryAccess memacc = GetParam();
12876474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  TRACED_FOREACH(int32_t, index, memacc.immediates) {
12886474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    StreamBuilder m(this, memacc.type, kMachPtr);
12896474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    m.Return(m.Load(memacc.type, m.Parameter(0), m.Int32Constant(index)));
12906474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    Stream s = m.Build();
12916474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(1U, s.size());
12926474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(memacc.ldr_opcode, s[0]->arch_opcode());
12936474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(kMode_Offset_RI, s[0]->addressing_mode());
12946474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
12956474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind());
12966474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1)));
1297fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    ASSERT_EQ(1U, s[0]->OutputCount());
1298fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    EXPECT_TRUE((s.*memacc.val_predicate)(s[0]->Output()));
12996474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  }
13006474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}
13016474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
13026474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
13036474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgTEST_P(InstructionSelectorMemoryAccessTest, StoreWithParameters) {
13046474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  const MemoryAccess memacc = GetParam();
13056474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachPtr, kMachInt32, memacc.type);
13066474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  m.Store(memacc.type, m.Parameter(0), m.Parameter(1), m.Parameter(2));
13076474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  m.Return(m.Int32Constant(0));
13086474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  Stream s = m.Build();
13096474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  ASSERT_EQ(1U, s.size());
13106474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  EXPECT_EQ(memacc.str_opcode, s[0]->arch_opcode());
13116474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  EXPECT_EQ(kMode_Offset_RR, s[0]->addressing_mode());
13126474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  EXPECT_EQ(3U, s[0]->InputCount());
13136474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  EXPECT_EQ(0U, s[0]->OutputCount());
13146474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}
13156474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
13166474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
13176474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgTEST_P(InstructionSelectorMemoryAccessTest, StoreWithImmediateIndex) {
13186474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  const MemoryAccess memacc = GetParam();
13196474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  TRACED_FOREACH(int32_t, index, memacc.immediates) {
13206474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachPtr, memacc.type);
13216474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    m.Store(memacc.type, m.Parameter(0), m.Int32Constant(index),
13226474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org            m.Parameter(1));
13236474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    m.Return(m.Int32Constant(0));
13246474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    Stream s = m.Build();
13256474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(1U, s.size());
13266474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(memacc.str_opcode, s[0]->arch_opcode());
13276474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(kMode_Offset_RI, s[0]->addressing_mode());
13286474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(3U, s[0]->InputCount());
13296474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind());
13306474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1)));
13316474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(0U, s[0]->OutputCount());
13326474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  }
13336474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}
13346474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
13356474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
13366474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgINSTANTIATE_TEST_CASE_P(InstructionSelectorTest,
13376474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org                        InstructionSelectorMemoryAccessTest,
13386474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org                        ::testing::ValuesIn(kMemoryAccesses));
13396474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
13406474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
13416474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org// -----------------------------------------------------------------------------
13425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Miscellaneous.
13435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
13445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
13455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32AddWithInt32Mul) {
13465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  {
13475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
13485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(
13495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        m.Int32Add(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2))));
13505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
13515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
13525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmMla, s[0]->arch_opcode());
13535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(3U, s[0]->InputCount());
13545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
13555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
13565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  {
13575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
13585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(
13595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        m.Int32Add(m.Int32Mul(m.Parameter(1), m.Parameter(2)), m.Parameter(0)));
13605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
13615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
13625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmMla, s[0]->arch_opcode());
13635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(3U, s[0]->InputCount());
13645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
13655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
13665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
13675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
13685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
13695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32DivWithParameters) {
13705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
13715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Div(m.Parameter(0), m.Parameter(1)));
13725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
13735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(4U, s.size());
13745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVcvtF64S32, s[0]->arch_opcode());
13755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[0]->OutputCount());
13765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVcvtF64S32, s[1]->arch_opcode());
13775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[1]->OutputCount());
13785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode());
13795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[2]->InputCount());
13805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[2]->OutputCount());
13815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[2]->InputAt(0)));
13825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1)));
13835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVcvtS32F64, s[3]->arch_opcode());
13845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[3]->InputCount());
13855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[2]->Output()), s.ToVreg(s[3]->InputAt(0)));
13865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
13875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
13885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
13895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32DivWithParametersForSUDIV) {
13905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
13915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Div(m.Parameter(0), m.Parameter(1)));
13925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build(SUDIV);
13935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
13945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmSdiv, s[0]->arch_opcode());
13955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
13965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
13975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
13985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32ModWithParameters) {
13995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
14005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Mod(m.Parameter(0), m.Parameter(1)));
14015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
14025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(6U, s.size());
14035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVcvtF64S32, s[0]->arch_opcode());
14045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[0]->OutputCount());
14055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVcvtF64S32, s[1]->arch_opcode());
14065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[1]->OutputCount());
14075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode());
14085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[2]->InputCount());
14095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[2]->OutputCount());
14105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[2]->InputAt(0)));
14115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1)));
14125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVcvtS32F64, s[3]->arch_opcode());
14135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[3]->InputCount());
14145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[2]->Output()), s.ToVreg(s[3]->InputAt(0)));
14155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmMul, s[4]->arch_opcode());
14165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[4]->OutputCount());
14175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[4]->InputCount());
14185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[3]->Output()), s.ToVreg(s[4]->InputAt(0)));
14195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[1]->InputAt(0)), s.ToVreg(s[4]->InputAt(1)));
14205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmSub, s[5]->arch_opcode());
14215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[5]->OutputCount());
14225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[5]->InputCount());
14235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[5]->InputAt(0)));
14245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[4]->Output()), s.ToVreg(s[5]->InputAt(1)));
14255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
14265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
14275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
14285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32ModWithParametersForSUDIV) {
14295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
14305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Mod(m.Parameter(0), m.Parameter(1)));
14315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build(SUDIV);
14325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(3U, s.size());
14335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmSdiv, s[0]->arch_opcode());
14345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[0]->OutputCount());
14355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[0]->InputCount());
14365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmMul, s[1]->arch_opcode());
14375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[1]->OutputCount());
14385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[1]->InputCount());
14395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0)));
14405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->InputAt(1)), s.ToVreg(s[1]->InputAt(1)));
14415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmSub, s[2]->arch_opcode());
14425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[2]->OutputCount());
14435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[2]->InputCount());
14445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[2]->InputAt(0)));
14455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1)));
14465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
14475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
14485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
14495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32ModWithParametersForSUDIVAndMLS) {
14505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
14515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Mod(m.Parameter(0), m.Parameter(1)));
14525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build(MLS, SUDIV);
14535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s.size());
14545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmSdiv, s[0]->arch_opcode());
14555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[0]->OutputCount());
14565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[0]->InputCount());
14575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmMls, s[1]->arch_opcode());
14585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[1]->OutputCount());
14595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(3U, s[1]->InputCount());
14605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0)));
14615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->InputAt(1)), s.ToVreg(s[1]->InputAt(1)));
14625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[1]->InputAt(2)));
14635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
14645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
14655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
14665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32MulWithParameters) {
14675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
14685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Mul(m.Parameter(0), m.Parameter(1)));
14695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
14705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
14715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmMul, s[0]->arch_opcode());
14725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(2U, s[0]->InputCount());
14735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(1U, s[0]->OutputCount());
14745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
14755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
14765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
14775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32MulWithImmediate) {
14785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  // x * (2^k + 1) -> x + (x >> k)
14795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, k, 1, 30) {
14805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
14815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant((1 << k) + 1)));
14825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
14835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
14845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmAdd, s[0]->arch_opcode());
14855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_R_LSL_I, s[0]->addressing_mode());
14865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(3U, s[0]->InputCount());
14875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1)));
14885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(2)));
14895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
14905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
14915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  // x * (2^k - 1) -> -x + (x >> k)
14925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, k, 3, 30) {
14935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
14945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant((1 << k) - 1)));
14955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
14965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
14975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmRsb, s[0]->arch_opcode());
14985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_R_LSL_I, s[0]->addressing_mode());
14995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(3U, s[0]->InputCount());
15005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1)));
15015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(2)));
15025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
15035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
15045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  // (2^k + 1) * x -> x + (x >> k)
15055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, k, 1, 30) {
15065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
15075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Mul(m.Int32Constant((1 << k) + 1), m.Parameter(0)));
15085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
15095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
15105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmAdd, s[0]->arch_opcode());
15115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_R_LSL_I, s[0]->addressing_mode());
15125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(3U, s[0]->InputCount());
15135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1)));
15145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(2)));
15155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
15165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
15175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  // x * (2^k - 1) -> -x + (x >> k)
15185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, k, 3, 30) {
15195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
15205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Mul(m.Int32Constant((1 << k) - 1), m.Parameter(0)));
15215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
15225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
15235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmRsb, s[0]->arch_opcode());
15245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_R_LSL_I, s[0]->addressing_mode());
15255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(3U, s[0]->InputCount());
15265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1)));
15275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(2)));
15285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
15295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
15305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
15315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
15325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
15335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32SubWithInt32Mul) {
15345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
15355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(
15365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2))));
15375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
15385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s.size());
15395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmMul, s[0]->arch_opcode());
15405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[0]->OutputCount());
15415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmSub, s[1]->arch_opcode());
15425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[1]->InputCount());
15435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(1)));
15445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
15455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
15465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
15475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32SubWithInt32MulForMLS) {
15485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32);
15495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(
15505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2))));
15515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build(MLS);
15525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
15535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmMls, s[0]->arch_opcode());
15545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(1U, s[0]->OutputCount());
15555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(3U, s[0]->InputCount());
15565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
15575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
15585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
15595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32UDivWithParameters) {
15605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
15615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32UDiv(m.Parameter(0), m.Parameter(1)));
15625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
15635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(4U, s.size());
15645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVcvtF64U32, s[0]->arch_opcode());
15655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[0]->OutputCount());
15665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVcvtF64U32, s[1]->arch_opcode());
15675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[1]->OutputCount());
15685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode());
15695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[2]->InputCount());
15705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[2]->OutputCount());
15715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[2]->InputAt(0)));
15725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1)));
15735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVcvtU32F64, s[3]->arch_opcode());
15745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[3]->InputCount());
15755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[2]->Output()), s.ToVreg(s[3]->InputAt(0)));
15765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
15775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
15785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
15795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32UDivWithParametersForSUDIV) {
15805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
15815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32UDiv(m.Parameter(0), m.Parameter(1)));
15825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build(SUDIV);
15835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
15845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmUdiv, s[0]->arch_opcode());
15855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
15865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
15875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
15885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32UModWithParameters) {
15895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
15905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32UMod(m.Parameter(0), m.Parameter(1)));
15915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
15925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(6U, s.size());
15935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVcvtF64U32, s[0]->arch_opcode());
15945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[0]->OutputCount());
15955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVcvtF64U32, s[1]->arch_opcode());
15965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[1]->OutputCount());
15975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode());
15985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[2]->InputCount());
15995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[2]->OutputCount());
16005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[2]->InputAt(0)));
16015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1)));
16025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmVcvtU32F64, s[3]->arch_opcode());
16035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[3]->InputCount());
16045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[2]->Output()), s.ToVreg(s[3]->InputAt(0)));
16055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmMul, s[4]->arch_opcode());
16065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[4]->OutputCount());
16075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[4]->InputCount());
16085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[3]->Output()), s.ToVreg(s[4]->InputAt(0)));
16095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[1]->InputAt(0)), s.ToVreg(s[4]->InputAt(1)));
16105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmSub, s[5]->arch_opcode());
16115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[5]->OutputCount());
16125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[5]->InputCount());
16135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[5]->InputAt(0)));
16145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[4]->Output()), s.ToVreg(s[5]->InputAt(1)));
16155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
16165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
16175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
16185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32UModWithParametersForSUDIV) {
16195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
16205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32UMod(m.Parameter(0), m.Parameter(1)));
16215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build(SUDIV);
16225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(3U, s.size());
16235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmUdiv, s[0]->arch_opcode());
16245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[0]->OutputCount());
16255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[0]->InputCount());
16265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmMul, s[1]->arch_opcode());
16275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[1]->OutputCount());
16285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[1]->InputCount());
16295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0)));
16305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->InputAt(1)), s.ToVreg(s[1]->InputAt(1)));
16315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmSub, s[2]->arch_opcode());
16325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[2]->OutputCount());
16335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[2]->InputCount());
16345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[2]->InputAt(0)));
16355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1)));
16365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
16375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
16385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
16395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32UModWithParametersForSUDIVAndMLS) {
16405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
16415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32UMod(m.Parameter(0), m.Parameter(1)));
16425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build(MLS, SUDIV);
16435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s.size());
16445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmUdiv, s[0]->arch_opcode());
16455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[0]->OutputCount());
16465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(2U, s[0]->InputCount());
16475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmMls, s[1]->arch_opcode());
16485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s[1]->OutputCount());
16495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(3U, s[1]->InputCount());
16505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0)));
16515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->InputAt(1)), s.ToVreg(s[1]->InputAt(1)));
16525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[1]->InputAt(2)));
16535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
16545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
16555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
16565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Word32AndWithUbfxImmediateForARMv7) {
16575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, width, 1, 32) {
16585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
16595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32And(m.Parameter(0),
16605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                         m.Int32Constant(0xffffffffu >> (32 - width))));
16615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build(ARMv7);
16625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
16635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmUbfx, s[0]->arch_opcode());
16645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(3U, s[0]->InputCount());
16655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(1)));
16665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
16675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
16685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, width, 1, 32) {
16695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
16705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32And(m.Int32Constant(0xffffffffu >> (32 - width)),
16715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                         m.Parameter(0)));
16725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build(ARMv7);
16735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
16745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmUbfx, s[0]->arch_opcode());
16755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(3U, s[0]->InputCount());
16765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(1)));
16775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
16785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
16795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
16805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
16815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
16825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Word32AndWithBfcImmediateForARMv7) {
16835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, lsb, 0, 31) {
16845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, width, 1, (32 - lsb) - 1) {
16855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32);
16865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Word32And(
16875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          m.Parameter(0),
16885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          m.Int32Constant(~((0xffffffffu >> (32 - width)) << lsb))));
16895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build(ARMv7);
16905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
16915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kArmBfc, s[0]->arch_opcode());
16925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s[0]->OutputCount());
16935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_TRUE(
16945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          UnallocatedOperand::cast(s[0]->Output())->HasSameAsInputPolicy());
16955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
16965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
16975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
16985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
16995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
17005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, lsb, 0, 31) {
17015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, width, 1, (32 - lsb) - 1) {
17025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32);
17035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(
17045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          m.Word32And(m.Int32Constant(~((0xffffffffu >> (32 - width)) << lsb)),
17055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                      m.Parameter(0)));
17065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build(ARMv7);
17075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
17085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kArmBfc, s[0]->arch_opcode());
17095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s[0]->OutputCount());
17105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_TRUE(
17115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org          UnallocatedOperand::cast(s[0]->Output())->HasSameAsInputPolicy());
17125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
17135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
17145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
17155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
17165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
17175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
17185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
17195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
17205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Word32ShrWithWord32AndWithImmediateForARMv7) {
17215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, lsb, 0, 31) {
17225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, width, 1, 32 - lsb) {
17235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      uint32_t max = 1 << lsb;
17245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      if (max > static_cast<uint32_t>(kMaxInt)) max -= 1;
17255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      uint32_t jnk = rng()->NextInt(max);
17265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      uint32_t msk = ((0xffffffffu >> (32 - width)) << lsb) | jnk;
17275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32);
17285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Word32Shr(m.Word32And(m.Parameter(0), m.Int32Constant(msk)),
17295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                           m.Int32Constant(lsb)));
17305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build(ARMv7);
17315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
17325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kArmUbfx, s[0]->arch_opcode());
17335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
17345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
17355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
17365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
17375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
17385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, lsb, 0, 31) {
17395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, width, 1, 32 - lsb) {
17405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      uint32_t max = 1 << lsb;
17415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      if (max > static_cast<uint32_t>(kMaxInt)) max -= 1;
17425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      uint32_t jnk = rng()->NextInt(max);
17435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      uint32_t msk = ((0xffffffffu >> (32 - width)) << lsb) | jnk;
17445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32);
17455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Word32Shr(m.Word32And(m.Int32Constant(msk), m.Parameter(0)),
17465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                           m.Int32Constant(lsb)));
17475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build(ARMv7);
17485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
17495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kArmUbfx, s[0]->arch_opcode());
17505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
17515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
17525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
17535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
17545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
17555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
17565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
17575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
17585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Word32AndWithWord32Not) {
17595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  {
17605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
17615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32And(m.Parameter(0), m.Word32Not(m.Parameter(1))));
17625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
17635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
17645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmBic, s[0]->arch_opcode());
17655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
17665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(2U, s[0]->InputCount());
17675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
17685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
17695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  {
17705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
17715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32And(m.Word32Not(m.Parameter(0)), m.Parameter(1)));
17725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
17735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
17745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmBic, s[0]->arch_opcode());
17755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
17765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(2U, s[0]->InputCount());
17775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
17785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
17795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
17805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
17815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
17825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Word32EqualWithParameters) {
17835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
17845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Word32Equal(m.Parameter(0), m.Parameter(1)));
17858640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org  Stream s = m.Build();
17868640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org  ASSERT_EQ(1U, s.size());
17875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
17888640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org  EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
17898640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org  EXPECT_EQ(2U, s[0]->InputCount());
17908640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org  EXPECT_EQ(1U, s[0]->OutputCount());
17915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kFlags_set, s[0]->flags_mode());
17925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kEqual, s[0]->flags_condition());
17935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
17945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
17955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
17965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Word32EqualWithImmediate) {
17975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
17985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    if (imm == 0) continue;
17995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
18005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32Equal(m.Parameter(0), m.Int32Constant(imm)));
18015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
18025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
18035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
18045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
18055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
18065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
18075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
18085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
18095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kEqual, s[0]->flags_condition());
18105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
18115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
18125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    if (imm == 0) continue;
18135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
18145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32Equal(m.Int32Constant(imm), m.Parameter(0)));
18155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
18165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
18175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
18185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
18195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
18205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
18215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
18225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
18235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kEqual, s[0]->flags_condition());
18245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
18255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
18265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
18275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
18285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Word32EqualWithZero) {
18295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  {
18305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
18315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32Equal(m.Parameter(0), m.Int32Constant(0)));
18325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
18335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
18345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmTst, s[0]->arch_opcode());
18355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
18365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
18375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1)));
18385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
18395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
18405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kEqual, s[0]->flags_condition());
18415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
18425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  {
18435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
18445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Word32Equal(m.Int32Constant(0), m.Parameter(0)));
18455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
18465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
18475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kArmTst, s[0]->arch_opcode());
18485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
18495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
18505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1)));
18515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
18525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kFlags_set, s[0]->flags_mode());
18535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kEqual, s[0]->flags_condition());
18545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
18555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
18565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
18575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
18585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Word32NotWithParameter) {
18595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32);
18605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Word32Not(m.Parameter(0)));
18615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
18625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
18635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kArmMvn, s[0]->arch_opcode());
18645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
18655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(1U, s[0]->InputCount());
18665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(1U, s[0]->OutputCount());
18675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
18685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
18695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
18705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Word32AndWithWord32ShrWithImmediateForARMv7) {
18715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, lsb, 0, 31) {
18725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, width, 1, 32 - lsb) {
18735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32);
18745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Word32And(m.Word32Shr(m.Parameter(0), m.Int32Constant(lsb)),
18755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                           m.Int32Constant(0xffffffffu >> (32 - width))));
18765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build(ARMv7);
18775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
18785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kArmUbfx, s[0]->arch_opcode());
18795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
18805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
18815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
18825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
18835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
18845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, lsb, 0, 31) {
18855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, width, 1, 32 - lsb) {
18865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32);
18875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Word32And(m.Int32Constant(0xffffffffu >> (32 - width)),
18885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                           m.Word32Shr(m.Parameter(0), m.Int32Constant(lsb))));
18895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build(ARMv7);
18905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
18915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kArmUbfx, s[0]->arch_opcode());
18925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(3U, s[0]->InputCount());
18935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
18945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
18955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
18965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
18978640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org}
18988640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org}  // namespace compiler
18998640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org}  // namespace internal
19008640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org}  // namespace v8
1901