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