1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/machine-operator.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/operator-properties-inl.h"
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "testing/gtest-support.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if GTEST_HAS_COMBINE
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TODO(bmeurer): Find a new home for these.
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline std::ostream& operator<<(std::ostream& os, const MachineType& type) {
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OStringStream ost;
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ost << type;
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return os << ost.c_str();
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline std::ostream& operator<<(std::ostream& os,
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         const WriteBarrierKind& write_barrier_kind) {
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OStringStream ost;
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ost << write_barrier_kind;
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return os << ost.c_str();
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename T>
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass MachineOperatorTestWithParam
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : public ::testing::TestWithParam< ::testing::tuple<MachineType, T> > {
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineType type() const { return ::testing::get<0>(B::GetParam()); }
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const T& GetParam() const { return ::testing::get<1>(B::GetParam()); }
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  typedef ::testing::TestWithParam< ::testing::tuple<MachineType, T> > B;
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace {
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst MachineType kMachineReps[] = {kRepWord32, kRepWord64};
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst MachineType kMachineTypes[] = {
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kMachFloat32, kMachFloat64,   kMachInt8,   kMachUint8,  kMachInt16,
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kMachUint16,  kMachInt32,     kMachUint32, kMachInt64,  kMachUint64,
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kMachPtr,     kMachAnyTagged, kRepBit,     kRepWord8,   kRepWord16,
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kRepWord32,   kRepWord64,     kRepFloat32, kRepFloat64, kRepTagged};
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Load operator.
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef MachineOperatorTestWithParam<LoadRepresentation>
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    MachineLoadOperatorTest;
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineLoadOperatorTest, InstancesAreGloballyShared) {
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine1(type());
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine2(type());
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine1.Load(GetParam()), machine2.Load(GetParam()));
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineLoadOperatorTest, NumberOfInputsAndOutputs) {
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine(type());
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op = machine.Load(GetParam());
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(2, OperatorProperties::GetValueInputCount(op));
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(1, OperatorProperties::GetEffectInputCount(op));
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetControlInputCount(op));
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(3, OperatorProperties::GetTotalInputCount(op));
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(1, OperatorProperties::GetValueOutputCount(op));
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(1, OperatorProperties::GetEffectOutputCount(op));
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op));
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineLoadOperatorTest, OpcodeIsCorrect) {
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine(type());
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(IrOpcode::kLoad, machine.Load(GetParam())->opcode());
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineLoadOperatorTest, ParameterIsCorrect) {
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine(type());
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(GetParam(),
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            OpParameter<LoadRepresentation>(machine.Load(GetParam())));
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochINSTANTIATE_TEST_CASE_P(MachineOperatorTest, MachineLoadOperatorTest,
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ::testing::Combine(::testing::ValuesIn(kMachineReps),
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           ::testing::ValuesIn(kMachineTypes)));
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Store operator.
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass MachineStoreOperatorTest
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : public MachineOperatorTestWithParam<
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ::testing::tuple<MachineType, WriteBarrierKind> > {
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StoreRepresentation GetParam() const {
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return StoreRepresentation(
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ::testing::get<0>(MachineOperatorTestWithParam<
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            ::testing::tuple<MachineType, WriteBarrierKind> >::GetParam()),
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ::testing::get<1>(MachineOperatorTestWithParam<
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            ::testing::tuple<MachineType, WriteBarrierKind> >::GetParam()));
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineStoreOperatorTest, InstancesAreGloballyShared) {
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine1(type());
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine2(type());
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine1.Store(GetParam()), machine2.Store(GetParam()));
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineStoreOperatorTest, NumberOfInputsAndOutputs) {
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine(type());
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op = machine.Store(GetParam());
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(3, OperatorProperties::GetValueInputCount(op));
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(1, OperatorProperties::GetEffectInputCount(op));
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(1, OperatorProperties::GetControlInputCount(op));
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(5, OperatorProperties::GetTotalInputCount(op));
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetValueOutputCount(op));
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(1, OperatorProperties::GetEffectOutputCount(op));
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op));
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineStoreOperatorTest, OpcodeIsCorrect) {
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine(type());
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(IrOpcode::kStore, machine.Store(GetParam())->opcode());
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachineStoreOperatorTest, ParameterIsCorrect) {
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine(type());
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(GetParam(),
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            OpParameter<StoreRepresentation>(machine.Store(GetParam())));
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochINSTANTIATE_TEST_CASE_P(
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    MachineOperatorTest, MachineStoreOperatorTest,
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ::testing::Combine(
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ::testing::ValuesIn(kMachineReps),
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ::testing::Combine(::testing::ValuesIn(kMachineTypes),
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           ::testing::Values(kNoWriteBarrier,
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                             kFullWriteBarrier))));
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Pure operators.
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace {
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct PureOperator {
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* (MachineOperatorBuilder::*constructor)();
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  IrOpcode::Value opcode;
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value_input_count;
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value_output_count;
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstd::ostream& operator<<(std::ostream& os, const PureOperator& pop) {
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return os << IrOpcode::Mnemonic(pop.opcode);
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst PureOperator kPureOperators[] = {
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define PURE(Name, input_count, output_count)                      \
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {                                                                \
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    &MachineOperatorBuilder::Name, IrOpcode::k##Name, input_count, \
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        output_count                                               \
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Word32And, 2, 1),                PURE(Word32Or, 2, 1),
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Word32Xor, 2, 1),                PURE(Word32Shl, 2, 1),
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Word32Shr, 2, 1),                PURE(Word32Sar, 2, 1),
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Word32Ror, 2, 1),                PURE(Word32Equal, 2, 1),
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Word64And, 2, 1),                PURE(Word64Or, 2, 1),
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Word64Xor, 2, 1),                PURE(Word64Shl, 2, 1),
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Word64Shr, 2, 1),                PURE(Word64Sar, 2, 1),
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Word64Ror, 2, 1),                PURE(Word64Equal, 2, 1),
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Int32Add, 2, 1),                 PURE(Int32AddWithOverflow, 2, 2),
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Int32Sub, 2, 1),                 PURE(Int32SubWithOverflow, 2, 2),
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Int32Mul, 2, 1),                 PURE(Int32Div, 2, 1),
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Int32UDiv, 2, 1),                PURE(Int32Mod, 2, 1),
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Int32UMod, 2, 1),                PURE(Int32LessThan, 2, 1),
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Int32LessThanOrEqual, 2, 1),     PURE(Uint32LessThan, 2, 1),
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Uint32LessThanOrEqual, 2, 1),    PURE(Int64Add, 2, 1),
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Int64Sub, 2, 1),                 PURE(Int64Mul, 2, 1),
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Int64Div, 2, 1),                 PURE(Int64UDiv, 2, 1),
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Int64Mod, 2, 1),                 PURE(Int64UMod, 2, 1),
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Int64LessThan, 2, 1),            PURE(Int64LessThanOrEqual, 2, 1),
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(ChangeFloat32ToFloat64, 1, 1),   PURE(ChangeFloat64ToInt32, 1, 1),
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(ChangeFloat64ToUint32, 1, 1),    PURE(ChangeInt32ToInt64, 1, 1),
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(ChangeUint32ToFloat64, 1, 1),    PURE(ChangeUint32ToUint64, 1, 1),
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(TruncateFloat64ToFloat32, 1, 1), PURE(TruncateFloat64ToInt32, 1, 1),
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(TruncateInt64ToInt32, 1, 1),     PURE(Float64Add, 2, 1),
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Float64Sub, 2, 1),               PURE(Float64Mul, 2, 1),
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Float64Div, 2, 1),               PURE(Float64Mod, 2, 1),
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Float64Sqrt, 1, 1),              PURE(Float64Equal, 2, 1),
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(Float64LessThan, 2, 1),          PURE(Float64LessThanOrEqual, 2, 1)
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef PURE
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef MachineOperatorTestWithParam<PureOperator> MachinePureOperatorTest;
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachinePureOperatorTest, InstancesAreGloballyShared) {
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const PureOperator& pop = GetParam();
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine1(type());
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine2(type());
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ((machine1.*pop.constructor)(), (machine2.*pop.constructor)());
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachinePureOperatorTest, NumberOfInputsAndOutputs) {
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine(type());
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const PureOperator& pop = GetParam();
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op = (machine.*pop.constructor)();
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(pop.value_input_count, OperatorProperties::GetValueInputCount(op));
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetEffectInputCount(op));
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetControlInputCount(op));
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(pop.value_input_count, OperatorProperties::GetTotalInputCount(op));
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(pop.value_output_count,
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            OperatorProperties::GetValueOutputCount(op));
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetEffectOutputCount(op));
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op));
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachinePureOperatorTest, MarkedAsPure) {
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine(type());
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const PureOperator& pop = GetParam();
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op = (machine.*pop.constructor)();
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_TRUE(op->HasProperty(Operator::kPure));
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(MachinePureOperatorTest, OpcodeIsCorrect) {
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine(type());
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const PureOperator& pop = GetParam();
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op = (machine.*pop.constructor)();
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(pop.opcode, op->opcode());
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochINSTANTIATE_TEST_CASE_P(
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    MachineOperatorTest, MachinePureOperatorTest,
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ::testing::Combine(::testing::ValuesIn(kMachineReps),
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       ::testing::ValuesIn(kPureOperators)));
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // GTEST_HAS_COMBINE
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Pseudo operators.
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(MachineOperatorTest, PseudoOperatorsWhenWordSizeIs32Bit) {
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine(kRepWord32);
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word32And(), machine.WordAnd());
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word32Or(), machine.WordOr());
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word32Xor(), machine.WordXor());
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word32Shl(), machine.WordShl());
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word32Shr(), machine.WordShr());
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word32Sar(), machine.WordSar());
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word32Ror(), machine.WordRor());
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word32Equal(), machine.WordEqual());
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int32Add(), machine.IntAdd());
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int32Sub(), machine.IntSub());
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int32Mul(), machine.IntMul());
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int32Div(), machine.IntDiv());
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int32UDiv(), machine.IntUDiv());
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int32Mod(), machine.IntMod());
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int32UMod(), machine.IntUMod());
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int32LessThan(), machine.IntLessThan());
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int32LessThanOrEqual(), machine.IntLessThanOrEqual());
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(MachineOperatorTest, PseudoOperatorsWhenWordSizeIs64Bit) {
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MachineOperatorBuilder machine(kRepWord64);
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word64And(), machine.WordAnd());
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word64Or(), machine.WordOr());
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word64Xor(), machine.WordXor());
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word64Shl(), machine.WordShl());
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word64Shr(), machine.WordShr());
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word64Sar(), machine.WordSar());
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word64Ror(), machine.WordRor());
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Word64Equal(), machine.WordEqual());
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int64Add(), machine.IntAdd());
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int64Sub(), machine.IntSub());
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int64Mul(), machine.IntMul());
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int64Div(), machine.IntDiv());
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int64UDiv(), machine.IntUDiv());
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int64Mod(), machine.IntMod());
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int64UMod(), machine.IntUMod());
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int64LessThan(), machine.IntLessThan());
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(machine.Int64LessThanOrEqual(), machine.IntLessThanOrEqual());
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace compiler
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace internal
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
326