Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / v8 / src / compiler / x64 / instruction-selector-x64-unittest.cc
1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "src/compiler/instruction-selector-unittest.h"
6
7 namespace v8 {
8 namespace internal {
9 namespace compiler {
10
11 // -----------------------------------------------------------------------------
12 // Conversions.
13
14
15 TEST_F(InstructionSelectorTest, ChangeInt32ToInt64WithParameter) {
16   StreamBuilder m(this, kMachInt64, kMachInt32);
17   m.Return(m.ChangeInt32ToInt64(m.Parameter(0)));
18   Stream s = m.Build();
19   ASSERT_EQ(1U, s.size());
20   EXPECT_EQ(kX64Movsxlq, s[0]->arch_opcode());
21 }
22
23
24 TEST_F(InstructionSelectorTest, ChangeUint32ToUint64WithParameter) {
25   StreamBuilder m(this, kMachUint64, kMachUint32);
26   m.Return(m.ChangeUint32ToUint64(m.Parameter(0)));
27   Stream s = m.Build();
28   ASSERT_EQ(1U, s.size());
29   EXPECT_EQ(kX64Movl, s[0]->arch_opcode());
30 }
31
32
33 TEST_F(InstructionSelectorTest, TruncateInt64ToInt32WithParameter) {
34   StreamBuilder m(this, kMachInt32, kMachInt64);
35   m.Return(m.TruncateInt64ToInt32(m.Parameter(0)));
36   Stream s = m.Build();
37   ASSERT_EQ(1U, s.size());
38   EXPECT_EQ(kX64Movl, s[0]->arch_opcode());
39 }
40
41
42 // -----------------------------------------------------------------------------
43 // Loads and stores
44
45 namespace {
46
47 struct MemoryAccess {
48   MachineType type;
49   ArchOpcode load_opcode;
50   ArchOpcode store_opcode;
51 };
52
53
54 std::ostream& operator<<(std::ostream& os, const MemoryAccess& memacc) {
55   OStringStream ost;
56   ost << memacc.type;
57   return os << ost.c_str();
58 }
59
60
61 static const MemoryAccess kMemoryAccesses[] = {
62     {kMachInt8, kX64Movsxbl, kX64Movb},
63     {kMachUint8, kX64Movzxbl, kX64Movb},
64     {kMachInt16, kX64Movsxwl, kX64Movw},
65     {kMachUint16, kX64Movzxwl, kX64Movw},
66     {kMachInt32, kX64Movl, kX64Movl},
67     {kMachUint32, kX64Movl, kX64Movl},
68     {kMachInt64, kX64Movq, kX64Movq},
69     {kMachUint64, kX64Movq, kX64Movq},
70     {kMachFloat32, kX64Movss, kX64Movss},
71     {kMachFloat64, kX64Movsd, kX64Movsd}};
72
73 }  // namespace
74
75
76 typedef InstructionSelectorTestWithParam<MemoryAccess>
77     InstructionSelectorMemoryAccessTest;
78
79
80 TEST_P(InstructionSelectorMemoryAccessTest, LoadWithParameters) {
81   const MemoryAccess memacc = GetParam();
82   StreamBuilder m(this, memacc.type, kMachPtr, kMachInt32);
83   m.Return(m.Load(memacc.type, m.Parameter(0), m.Parameter(1)));
84   Stream s = m.Build();
85   ASSERT_EQ(1U, s.size());
86   EXPECT_EQ(memacc.load_opcode, s[0]->arch_opcode());
87   EXPECT_EQ(2U, s[0]->InputCount());
88   EXPECT_EQ(1U, s[0]->OutputCount());
89 }
90
91
92 TEST_P(InstructionSelectorMemoryAccessTest, StoreWithParameters) {
93   const MemoryAccess memacc = GetParam();
94   StreamBuilder m(this, kMachInt32, kMachPtr, kMachInt32, memacc.type);
95   m.Store(memacc.type, m.Parameter(0), m.Parameter(1), m.Parameter(2));
96   m.Return(m.Int32Constant(0));
97   Stream s = m.Build();
98   ASSERT_EQ(1U, s.size());
99   EXPECT_EQ(memacc.store_opcode, s[0]->arch_opcode());
100   EXPECT_EQ(3U, s[0]->InputCount());
101   EXPECT_EQ(0U, s[0]->OutputCount());
102 }
103
104
105 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest,
106                         InstructionSelectorMemoryAccessTest,
107                         ::testing::ValuesIn(kMemoryAccesses));
108
109 }  // namespace compiler
110 }  // namespace internal
111 }  // namespace v8