15e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
25e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
35e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// found in the LICENSE file.
45e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org#include "src/compiler/instruction-selector-unittest.h"
65e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
75e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgnamespace v8 {
85e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgnamespace internal {
95e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgnamespace compiler {
105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgnamespace {
125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Immediates (random subset).
145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic const int32_t kImmediates[] = {
155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    kMinInt, -42, -1, 0,  1,  2,    3,      4,          5,
165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    6,       7,   8,  16, 42, 0xff, 0xffff, 0x0f0f0f0f, kMaxInt};
175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}  // namespace
195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32AddWithParameter) {
225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Add(m.Parameter(0), m.Parameter(1)));
245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kIA32Add, s[0]->arch_opcode());
275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32AddWithImmediate) {
315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    {
335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32);
345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Int32Add(m.Parameter(0), m.Int32Constant(imm)));
355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build();
365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kIA32Add, s[0]->arch_opcode());
385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(2U, s[0]->InputCount());
395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    {
425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      StreamBuilder m(this, kMachInt32, kMachInt32);
435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      m.Return(m.Int32Add(m.Int32Constant(imm), m.Parameter(0)));
445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Stream s = m.Build();
455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(1U, s.size());
465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(kIA32Add, s[0]->arch_opcode());
475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      ASSERT_EQ(2U, s[0]->InputCount());
485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32SubWithParameter) {
555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32);
565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  m.Return(m.Int32Sub(m.Parameter(0), m.Parameter(1)));
575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Stream s = m.Build();
585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  ASSERT_EQ(1U, s.size());
595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(kIA32Sub, s[0]->arch_opcode());
605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(1U, s[0]->OutputCount());
615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(InstructionSelectorTest, Int32SubWithImmediate) {
655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FOREACH(int32_t, imm, kImmediates) {
665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32);
675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    m.Return(m.Int32Sub(m.Parameter(0), m.Int32Constant(imm)));
685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Stream s = m.Build();
695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(1U, s.size());
705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(kIA32Sub, s[0]->arch_opcode());
715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
766474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
776474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org// -----------------------------------------------------------------------------
786474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org// Loads and stores
796474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
806474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgnamespace {
816474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
826474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgstruct MemoryAccess {
836474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  MachineType type;
846474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  ArchOpcode load_opcode;
856474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  ArchOpcode store_opcode;
866474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org};
876474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
886474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
896474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgstd::ostream& operator<<(std::ostream& os, const MemoryAccess& memacc) {
906474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  OStringStream ost;
916474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  ost << memacc.type;
926474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  return os << ost.c_str();
936474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}
946474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
956474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
966474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgstatic const MemoryAccess kMemoryAccesses[] = {
976474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    {kMachInt8, kIA32Movsxbl, kIA32Movb},
986474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    {kMachUint8, kIA32Movzxbl, kIA32Movb},
996474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    {kMachInt16, kIA32Movsxwl, kIA32Movw},
1006474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    {kMachUint16, kIA32Movzxwl, kIA32Movw},
1016474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    {kMachInt32, kIA32Movl, kIA32Movl},
1026474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    {kMachUint32, kIA32Movl, kIA32Movl},
103fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    {kMachFloat32, kIA32Movss, kIA32Movss},
1046474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    {kMachFloat64, kIA32Movsd, kIA32Movsd}};
1056474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1066474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}  // namespace
1076474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1086474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1096474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgtypedef InstructionSelectorTestWithParam<MemoryAccess>
1106474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    InstructionSelectorMemoryAccessTest;
1116474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1126474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1136474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgTEST_P(InstructionSelectorMemoryAccessTest, LoadWithParameters) {
1146474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  const MemoryAccess memacc = GetParam();
1156474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  StreamBuilder m(this, memacc.type, kMachPtr, kMachInt32);
1166474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  m.Return(m.Load(memacc.type, m.Parameter(0), m.Parameter(1)));
1176474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  Stream s = m.Build();
1186474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  ASSERT_EQ(1U, s.size());
1196474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  EXPECT_EQ(memacc.load_opcode, s[0]->arch_opcode());
1206474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  EXPECT_EQ(2U, s[0]->InputCount());
1216474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  EXPECT_EQ(1U, s[0]->OutputCount());
1226474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}
1236474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1246474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1256474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgTEST_P(InstructionSelectorMemoryAccessTest, LoadWithImmediateBase) {
1266474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  const MemoryAccess memacc = GetParam();
1276474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  TRACED_FOREACH(int32_t, base, kImmediates) {
1286474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    StreamBuilder m(this, memacc.type, kMachPtr);
1296474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    m.Return(m.Load(memacc.type, m.Int32Constant(base), m.Parameter(0)));
1306474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    Stream s = m.Build();
1316474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(1U, s.size());
1326474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(memacc.load_opcode, s[0]->arch_opcode());
1336474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
1346474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind());
1356474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(base, s.ToInt32(s[0]->InputAt(1)));
1366474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
1376474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  }
1386474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}
1396474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1406474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1416474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgTEST_P(InstructionSelectorMemoryAccessTest, LoadWithImmediateIndex) {
1426474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  const MemoryAccess memacc = GetParam();
1436474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  TRACED_FOREACH(int32_t, index, kImmediates) {
1446474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    StreamBuilder m(this, memacc.type, kMachPtr);
1456474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    m.Return(m.Load(memacc.type, m.Parameter(0), m.Int32Constant(index)));
1466474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    Stream s = m.Build();
1476474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(1U, s.size());
1486474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(memacc.load_opcode, s[0]->arch_opcode());
1496474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(2U, s[0]->InputCount());
1506474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind());
1516474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1)));
1526474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(1U, s[0]->OutputCount());
1536474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  }
1546474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}
1556474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1566474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1576474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgTEST_P(InstructionSelectorMemoryAccessTest, StoreWithParameters) {
1586474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  const MemoryAccess memacc = GetParam();
1596474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  StreamBuilder m(this, kMachInt32, kMachPtr, kMachInt32, memacc.type);
1606474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  m.Store(memacc.type, m.Parameter(0), m.Parameter(1), m.Parameter(2));
1616474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  m.Return(m.Int32Constant(0));
1626474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  Stream s = m.Build();
1636474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  ASSERT_EQ(1U, s.size());
1646474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  EXPECT_EQ(memacc.store_opcode, s[0]->arch_opcode());
1656474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  EXPECT_EQ(3U, s[0]->InputCount());
1666474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  EXPECT_EQ(0U, s[0]->OutputCount());
1676474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}
1686474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1696474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1706474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgTEST_P(InstructionSelectorMemoryAccessTest, StoreWithImmediateBase) {
1716474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  const MemoryAccess memacc = GetParam();
1726474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  TRACED_FOREACH(int32_t, base, kImmediates) {
1736474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachInt32, memacc.type);
1746474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    m.Store(memacc.type, m.Int32Constant(base), m.Parameter(0), m.Parameter(1));
1756474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    m.Return(m.Int32Constant(0));
1766474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    Stream s = m.Build();
1776474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(1U, s.size());
1786474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(memacc.store_opcode, s[0]->arch_opcode());
1796474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(3U, s[0]->InputCount());
1806474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind());
1816474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(base, s.ToInt32(s[0]->InputAt(1)));
1826474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(0U, s[0]->OutputCount());
1836474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  }
1846474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}
1856474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1866474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
1876474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgTEST_P(InstructionSelectorMemoryAccessTest, StoreWithImmediateIndex) {
1886474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  const MemoryAccess memacc = GetParam();
1896474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  TRACED_FOREACH(int32_t, index, kImmediates) {
1906474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    StreamBuilder m(this, kMachInt32, kMachPtr, memacc.type);
1916474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    m.Store(memacc.type, m.Parameter(0), m.Int32Constant(index),
1926474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org            m.Parameter(1));
1936474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    m.Return(m.Int32Constant(0));
1946474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    Stream s = m.Build();
1956474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(1U, s.size());
1966474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(memacc.store_opcode, s[0]->arch_opcode());
1976474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(3U, s[0]->InputCount());
1986474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    ASSERT_EQ(InstructionOperand::IMMEDIATE, s[0]->InputAt(1)->kind());
1996474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1)));
2006474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org    EXPECT_EQ(0U, s[0]->OutputCount());
2016474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  }
2026474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org}
2036474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
2046474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
2056474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.orgINSTANTIATE_TEST_CASE_P(InstructionSelectorTest,
2066474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org                        InstructionSelectorMemoryAccessTest,
2076474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org                        ::testing::ValuesIn(kMemoryAccesses));
2086474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org
2095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}  // namespace compiler
2105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}  // namespace internal
2115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}  // namespace v8
212