common-operator.cc revision bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8
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/common-operator.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/assembler.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/lazy-instance.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/linkage.h"
10958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/opcodes.h"
11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/operator.h"
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/handles-inl.h"
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/zone.h"
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, BranchHint hint) {
20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (hint) {
21958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BranchHint::kNone:
22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return os << "None";
23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BranchHint::kTrue:
24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return os << "True";
25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BranchHint::kFalse:
26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return os << "False";
27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNREACHABLE();
29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return os;
30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierBranchHint BranchHintOf(const Operator* const op) {
34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK_EQ(IrOpcode::kBranch, op->opcode());
35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return OpParameter<BranchHint>(op);
36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t hash_value(DeoptimizeKind kind) { return static_cast<size_t>(kind); }
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, DeoptimizeKind kind) {
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (kind) {
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case DeoptimizeKind::kEager:
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return os << "Eager";
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case DeoptimizeKind::kSoft:
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return os << "Soft";
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNREACHABLE();
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return os;
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDeoptimizeKind DeoptimizeKindOf(const Operator* const op) {
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(IrOpcode::kDeoptimize, op->opcode());
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return OpParameter<DeoptimizeKind>(op);
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t hash_value(IfExceptionHint hint) { return static_cast<size_t>(hint); }
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, IfExceptionHint hint) {
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (hint) {
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IfExceptionHint::kLocallyCaught:
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return os << "Caught";
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IfExceptionHint::kLocallyUncaught:
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return os << "Uncaught";
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNREACHABLE();
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return os;
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
75958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool operator==(SelectParameters const& lhs, SelectParameters const& rhs) {
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return lhs.representation() == rhs.representation() &&
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         lhs.hint() == rhs.hint();
78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool operator!=(SelectParameters const& lhs, SelectParameters const& rhs) {
82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return !(lhs == rhs);
83958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniersize_t hash_value(SelectParameters const& p) {
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return base::hash_combine(p.representation(), p.hint());
88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, SelectParameters const& p) {
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return os << p.representation() << "|" << p.hint();
93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
95958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierSelectParameters const& SelectParametersOf(const Operator* const op) {
97958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK_EQ(IrOpcode::kSelect, op->opcode());
98958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return OpParameter<SelectParameters>(op);
99958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
101bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochCallDescriptor const* CallDescriptorOf(const Operator* const op) {
102bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DCHECK(op->opcode() == IrOpcode::kCall ||
103bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         op->opcode() == IrOpcode::kTailCall);
104bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return OpParameter<CallDescriptor const*>(op);
105bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t ProjectionIndexOf(const Operator* const op) {
108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(IrOpcode::kProjection, op->opcode());
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return OpParameter<size_t>(op);
110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMachineRepresentation PhiRepresentationOf(const Operator* const op) {
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(IrOpcode::kPhi, op->opcode());
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return OpParameter<MachineRepresentation>(op);
116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint ParameterIndexOf(const Operator* const op) {
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(IrOpcode::kParameter, op->opcode());
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return OpParameter<ParameterInfo>(op).index();
122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst ParameterInfo& ParameterInfoOf(const Operator* const op) {
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(IrOpcode::kParameter, op->opcode());
127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return OpParameter<ParameterInfo>(op);
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool operator==(ParameterInfo const& lhs, ParameterInfo const& rhs) {
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return lhs.index() == rhs.index();
133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool operator!=(ParameterInfo const& lhs, ParameterInfo const& rhs) {
137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return !(lhs == rhs);
138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t hash_value(ParameterInfo const& p) { return p.index(); }
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, ParameterInfo const& i) {
145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (i.debug_name()) os << i.debug_name() << '#';
146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  os << i.index();
147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return os;
148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
150bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochbool operator==(RelocatablePtrConstantInfo const& lhs,
151bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                RelocatablePtrConstantInfo const& rhs) {
152bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return lhs.rmode() == rhs.rmode() && lhs.value() == rhs.value() &&
153bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         lhs.type() == rhs.type();
154bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
155bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
156bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochbool operator!=(RelocatablePtrConstantInfo const& lhs,
157bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                RelocatablePtrConstantInfo const& rhs) {
158bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return !(lhs == rhs);
159bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
160bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
161bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochsize_t hash_value(RelocatablePtrConstantInfo const& p) {
162bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return base::hash_combine(p.value(), p.rmode(), p.type());
163bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
164bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
165bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochstd::ostream& operator<<(std::ostream& os,
166bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                         RelocatablePtrConstantInfo const& p) {
167bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return os << p.value() << "|" << p.rmode() << "|" << p.type();
168bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
169bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define CACHED_OP_LIST(V)                                    \
1713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  V(Dead, Operator::kFoldable, 0, 0, 0, 1, 1, 1)             \
1723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  V(DeoptimizeIf, Operator::kFoldable, 2, 1, 1, 0, 0, 1)     \
1733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  V(DeoptimizeUnless, Operator::kFoldable, 2, 1, 1, 0, 0, 1) \
1743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  V(IfTrue, Operator::kKontrol, 0, 0, 1, 0, 0, 1)            \
1753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  V(IfFalse, Operator::kKontrol, 0, 0, 1, 0, 0, 1)           \
1763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  V(IfSuccess, Operator::kKontrol, 0, 0, 1, 0, 0, 1)         \
1773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  V(IfDefault, Operator::kKontrol, 0, 0, 1, 0, 0, 1)         \
1783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  V(Throw, Operator::kKontrol, 1, 1, 1, 0, 0, 1)             \
1793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  V(Terminate, Operator::kKontrol, 0, 1, 1, 0, 0, 1)         \
1803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  V(OsrNormalEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1)   \
1813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  V(OsrLoopEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1)     \
182bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(CheckPoint, Operator::kKontrol, 1, 1, 1, 0, 1, 0)        \
1833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  V(BeginRegion, Operator::kNoThrow, 0, 1, 0, 0, 1, 0)       \
184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(FinishRegion, Operator::kNoThrow, 1, 1, 0, 1, 1, 0)
185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_RETURN_LIST(V) \
187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(1)                        \
188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(2)                        \
189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(3)
190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_END_LIST(V) \
193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(1)                     \
194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(2)                     \
195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(3)                     \
196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(4)                     \
197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(5)                     \
198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(6)                     \
199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(7)                     \
200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(8)
201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_EFFECT_PHI_LIST(V) \
204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(1)                            \
205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(2)                            \
206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(3)                            \
207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(4)                            \
208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(5)                            \
209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(6)
210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_LOOP_LIST(V) \
213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(1)                      \
214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(2)
215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_MERGE_LIST(V) \
218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(1)                       \
219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(2)                       \
220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(3)                       \
221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(4)                       \
222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(5)                       \
223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(6)                       \
224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(7)                       \
225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(8)
226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_PARAMETER_LIST(V) \
229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(0)                           \
230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(1)                           \
231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(2)                           \
232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(3)                           \
233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(4)                           \
234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(5)                           \
235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(6)
236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_PHI_LIST(V) \
239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kTagged, 1)            \
240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kTagged, 2)            \
241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kTagged, 3)            \
242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kTagged, 4)            \
243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kTagged, 5)            \
244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kTagged, 6)            \
245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kBit, 2)               \
246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kFloat64, 2)           \
247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kWord32, 2)
248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_PROJECTION_LIST(V) \
251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(0)                            \
252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(1)
253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_STATE_VALUES_LIST(V) \
256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(0)                              \
257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(1)                              \
258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(2)                              \
259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(3)                              \
260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(4)                              \
261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(5)                              \
262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(6)                              \
263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(7)                              \
264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(8)                              \
265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(10)                             \
266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(11)                             \
267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(12)                             \
268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(13)                             \
269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(14)
270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct CommonOperatorGlobalCache final {
273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED(Name, properties, value_input_count, effect_input_count,      \
274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               control_input_count, value_output_count, effect_output_count, \
275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               control_output_count)                                         \
276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct Name##Operator final : public Operator {                            \
277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Name##Operator()                                                         \
278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator(IrOpcode::k##Name, properties, #Name, value_input_count,  \
279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   effect_input_count, control_input_count,                  \
280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   value_output_count, effect_output_count,                  \
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   control_output_count) {}                                  \
282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };                                                                         \
283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Name##Operator k##Name##Operator;
284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CACHED_OP_LIST(CACHED)
285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED
286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  template <DeoptimizeKind kKind>
288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct DeoptimizeOperator final : public Operator1<DeoptimizeKind> {
289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DeoptimizeOperator()
290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator1<DeoptimizeKind>(                      // --
291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kDeoptimize, Operator::kNoThrow,  // opcode
292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "Deoptimize",                               // name
293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              1, 1, 1, 0, 0, 1,                           // counts
294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              kKind) {}                                   // parameter
295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DeoptimizeOperator<DeoptimizeKind::kEager> kDeoptimizeEagerOperator;
297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DeoptimizeOperator<DeoptimizeKind::kSoft> kDeoptimizeSoftOperator;
298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  template <IfExceptionHint kCaughtLocally>
300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct IfExceptionOperator final : public Operator1<IfExceptionHint> {
301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    IfExceptionOperator()
302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator1<IfExceptionHint>(                      // --
303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kIfException, Operator::kKontrol,  // opcode
304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "IfException",                               // name
305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              0, 1, 1, 1, 1, 1,                            // counts
306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              kCaughtLocally) {}                           // parameter
307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  IfExceptionOperator<IfExceptionHint::kLocallyCaught> kIfExceptionCOperator;
309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  IfExceptionOperator<IfExceptionHint::kLocallyUncaught> kIfExceptionUOperator;
310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  template <size_t kInputCount>
312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct EndOperator final : public Operator {
313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EndOperator()
314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator(                                // --
315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kEnd, Operator::kKontrol,  // opcode
316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "End",                               // name
317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              0, 0, kInputCount, 0, 0, 0) {}       // counts
318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_END(input_count) \
320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EndOperator<input_count> kEnd##input_count##Operator;
321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_END_LIST(CACHED_END)
322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_END
323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  template <size_t kInputCount>
325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct ReturnOperator final : public Operator {
326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    ReturnOperator()
327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator(                                   // --
328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kReturn, Operator::kNoThrow,  // opcode
329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "Return",                               // name
330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              kInputCount, 1, 1, 0, 0, 1) {}          // counts
331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_RETURN(input_count) \
333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ReturnOperator<input_count> kReturn##input_count##Operator;
334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_RETURN_LIST(CACHED_RETURN)
335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_RETURN
336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  template <BranchHint kBranchHint>
338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct BranchOperator final : public Operator1<BranchHint> {
339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    BranchOperator()
340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator1<BranchHint>(                      // --
341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kBranch, Operator::kKontrol,  // opcode
342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "Branch",                               // name
343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              1, 0, 1, 0, 0, 2,                       // counts
344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              kBranchHint) {}                         // parameter
345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  };
346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BranchOperator<BranchHint::kNone> kBranchNoneOperator;
347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BranchOperator<BranchHint::kTrue> kBranchTrueOperator;
348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BranchOperator<BranchHint::kFalse> kBranchFalseOperator;
349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  template <int kEffectInputCount>
351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct EffectPhiOperator final : public Operator {
352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EffectPhiOperator()
353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator(                                   // --
354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kEffectPhi, Operator::kPure,  // opcode
355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "EffectPhi",                            // name
356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              0, kEffectInputCount, 1, 0, 1, 0) {}    // counts
357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_EFFECT_PHI(input_count) \
359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EffectPhiOperator<input_count> kEffectPhi##input_count##Operator;
360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_EFFECT_PHI_LIST(CACHED_EFFECT_PHI)
361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_EFFECT_PHI
362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  template <size_t kInputCount>
364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct LoopOperator final : public Operator {
365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    LoopOperator()
366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator(                                 // --
367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kLoop, Operator::kKontrol,  // opcode
368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "Loop",                               // name
369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              0, 0, kInputCount, 0, 0, 1) {}        // counts
370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  };
371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_LOOP(input_count) \
372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LoopOperator<input_count> kLoop##input_count##Operator;
373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CACHED_LOOP_LIST(CACHED_LOOP)
374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED_LOOP
375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  template <size_t kInputCount>
377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct MergeOperator final : public Operator {
378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    MergeOperator()
379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator(                                  // --
380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kMerge, Operator::kKontrol,  // opcode
381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "Merge",                               // name
382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              0, 0, kInputCount, 0, 0, 1) {}         // counts
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_MERGE(input_count) \
385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MergeOperator<input_count> kMerge##input_count##Operator;
386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CACHED_MERGE_LIST(CACHED_MERGE)
387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED_MERGE
388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  template <MachineRepresentation kRep, int kInputCount>
390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct PhiOperator final : public Operator1<MachineRepresentation> {
391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PhiOperator()
392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator1<MachineRepresentation>(     //--
393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kPhi, Operator::kPure,  // opcode
394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "Phi",                            // name
395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              kInputCount, 0, 1, 1, 0, 0,       // counts
396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              kRep) {}                          // parameter
397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_PHI(rep, input_count)                   \
399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PhiOperator<MachineRepresentation::rep, input_count> \
400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      kPhi##rep##input_count##Operator;
401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_PHI_LIST(CACHED_PHI)
402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_PHI
403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  template <int kIndex>
405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct ParameterOperator final : public Operator1<ParameterInfo> {
406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    ParameterOperator()
407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator1<ParameterInfo>(                   // --
408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              IrOpcode::kParameter, Operator::kPure,  // opcode
409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              "Parameter",                            // name
410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              1, 0, 0, 1, 0, 0,                       // counts,
411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              ParameterInfo(kIndex, nullptr)) {}      // parameter and name
412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  };
413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_PARAMETER(index) \
414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ParameterOperator<index> kParameter##index##Operator;
415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CACHED_PARAMETER_LIST(CACHED_PARAMETER)
416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED_PARAMETER
417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  template <size_t kIndex>
419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct ProjectionOperator final : public Operator1<size_t> {
420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    ProjectionOperator()
421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator1<size_t>(          // --
422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kProjection,  // opcode
423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Operator::kPure,        // flags
424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "Projection",           // name
425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              1, 0, 0, 1, 0, 0,       // counts,
426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              kIndex) {}              // parameter
427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_PROJECTION(index) \
429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ProjectionOperator<index> kProjection##index##Operator;
430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_PROJECTION_LIST(CACHED_PROJECTION)
431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_PROJECTION
432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  template <int kInputCount>
434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct StateValuesOperator final : public Operator {
435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    StateValuesOperator()
436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator(                           // --
437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kStateValues,         // opcode
438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Operator::kPure,                // flags
439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "StateValues",                  // name
440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              kInputCount, 0, 0, 1, 0, 0) {}  // counts
441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_STATE_VALUES(input_count) \
443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  StateValuesOperator<input_count> kStateValues##input_count##Operator;
444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_STATE_VALUES_LIST(CACHED_STATE_VALUES)
445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_STATE_VALUES
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstatic base::LazyInstance<CommonOperatorGlobalCache>::type kCache =
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LAZY_INSTANCE_INITIALIZER;
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCommonOperatorBuilder::CommonOperatorBuilder(Zone* zone)
454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    : cache_(kCache.Get()), zone_(zone) {}
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED(Name, properties, value_input_count, effect_input_count,      \
458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               control_input_count, value_output_count, effect_output_count, \
459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               control_output_count)                                         \
460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const Operator* CommonOperatorBuilder::Name() {                            \
461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.k##Name##Operator;                                        \
462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierCACHED_OP_LIST(CACHED)
464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED
465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::End(size_t control_input_count) {
468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (control_input_count) {
469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_END(input_count) \
470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  case input_count:             \
471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.kEnd##input_count##Operator;
472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CACHED_END_LIST(CACHED_END)
473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_END
474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Uncached.
478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator(             //--
479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kEnd, Operator::kKontrol,   // opcode
480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "End",                                // name
481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, control_input_count, 0, 0, 0);  // counts
482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::Return(int value_input_count) {
486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (value_input_count) {
487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_RETURN(input_count) \
488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  case input_count:                \
489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.kReturn##input_count##Operator;
490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CACHED_RETURN_LIST(CACHED_RETURN)
491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_RETURN
492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Uncached.
496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator(               //--
497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kReturn, Operator::kNoThrow,  // opcode
498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Return",                               // name
499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      value_input_count, 1, 1, 0, 0, 1);      // counts
500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst Operator* CommonOperatorBuilder::Branch(BranchHint hint) {
504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (hint) {
505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BranchHint::kNone:
506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return &cache_.kBranchNoneOperator;
507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BranchHint::kTrue:
508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return &cache_.kBranchTrueOperator;
509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BranchHint::kFalse:
510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return &cache_.kBranchFalseOperator;
511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNREACHABLE();
513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return nullptr;
514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::Deoptimize(DeoptimizeKind kind) {
518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (kind) {
519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case DeoptimizeKind::kEager:
520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return &cache_.kDeoptimizeEagerOperator;
521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case DeoptimizeKind::kSoft:
522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return &cache_.kDeoptimizeSoftOperator;
523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNREACHABLE();
525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return nullptr;
526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::IfException(IfExceptionHint hint) {
530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (hint) {
531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IfExceptionHint::kLocallyCaught:
532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return &cache_.kIfExceptionCOperator;
533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case IfExceptionHint::kLocallyUncaught:
534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return &cache_.kIfExceptionUOperator;
535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNREACHABLE();
537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return nullptr;
538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::Switch(size_t control_output_count) {
542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator(               // --
543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kSwitch, Operator::kKontrol,  // opcode
544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Switch",                               // name
545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      1, 0, 1, 0, 0, control_output_count);   // counts
546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::IfValue(int32_t index) {
550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<int32_t>(      // --
551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kIfValue, Operator::kKontrol,  // opcode
552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "IfValue",                               // name
553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, 1, 0, 0, 1,                        // counts
554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      index);                                  // parameter
555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::Start(int value_output_count) {
559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return new (zone()) Operator(               // --
560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IrOpcode::kStart, Operator::kFoldable,  // opcode
561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      "Start",                                // name
562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      0, 0, 0, value_output_count, 1, 1);     // counts
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst Operator* CommonOperatorBuilder::Loop(int control_input_count) {
567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (control_input_count) {
568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_LOOP(input_count) \
569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  case input_count:              \
570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return &cache_.kLoop##input_count##Operator;
571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    CACHED_LOOP_LIST(CACHED_LOOP)
572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED_LOOP
573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    default:
574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Uncached.
577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator(             // --
578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kLoop, Operator::kKontrol,  // opcode
579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Loop",                               // name
580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, control_input_count, 0, 0, 1);  // counts
581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst Operator* CommonOperatorBuilder::Merge(int control_input_count) {
585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (control_input_count) {
586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_MERGE(input_count) \
587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  case input_count:               \
588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return &cache_.kMerge##input_count##Operator;
589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    CACHED_MERGE_LIST(CACHED_MERGE)
590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED_MERGE
591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    default:
592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Uncached.
595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator(              // --
596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kMerge, Operator::kKontrol,  // opcode
597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Merge",                               // name
598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, control_input_count, 0, 0, 1);   // counts
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::Parameter(int index,
603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                 const char* debug_name) {
604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!debug_name) {
605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    switch (index) {
606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_PARAMETER(index) \
607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  case index:                   \
608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return &cache_.kParameter##index##Operator;
609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CACHED_PARAMETER_LIST(CACHED_PARAMETER)
610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED_PARAMETER
611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      default:
612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        break;
613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Uncached.
616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<ParameterInfo>(  // --
617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kParameter, Operator::kPure,     // opcode
618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Parameter",                               // name
619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      1, 0, 0, 1, 0, 0,                          // counts
620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ParameterInfo(index, debug_name));         // parameter info
621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::OsrValue(int index) {
625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<int>(                // --
626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kOsrValue, Operator::kNoProperties,  // opcode
627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "OsrValue",                                    // name
628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, 1, 1, 0, 0,                              // counts
629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      index);                                        // parameter
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::Int32Constant(int32_t value) {
634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return new (zone()) Operator1<int32_t>(         // --
635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IrOpcode::kInt32Constant, Operator::kPure,  // opcode
636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      "Int32Constant",                            // name
637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      0, 0, 0, 1, 0, 0,                           // counts
638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      value);                                     // parameter
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::Int64Constant(int64_t value) {
643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return new (zone()) Operator1<int64_t>(         // --
644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IrOpcode::kInt64Constant, Operator::kPure,  // opcode
645958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      "Int64Constant",                            // name
646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      0, 0, 0, 1, 0, 0,                           // counts
647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      value);                                     // parameter
648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::Float32Constant(volatile float value) {
652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<float>(             // --
653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kFloat32Constant, Operator::kPure,  // opcode
654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Float32Constant",                            // name
655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, 0, 1, 0, 0,                             // counts
656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      value);                                       // parameter
657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::Float64Constant(volatile double value) {
661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<double>(            // --
662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kFloat64Constant, Operator::kPure,  // opcode
663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Float64Constant",                            // name
664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, 0, 1, 0, 0,                             // counts
665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      value);                                       // parameter
666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::ExternalConstant(
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const ExternalReference& value) {
671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return new (zone()) Operator1<ExternalReference>(  // --
672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IrOpcode::kExternalConstant, Operator::kPure,  // opcode
673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      "ExternalConstant",                            // name
674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      0, 0, 0, 1, 0, 0,                              // counts
675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      value);                                        // parameter
676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::NumberConstant(volatile double value) {
680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<double>(           // --
681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kNumberConstant, Operator::kPure,  // opcode
682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "NumberConstant",                            // name
683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, 0, 1, 0, 0,                            // counts
684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      value);                                      // parameter
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::HeapConstant(
689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const Handle<HeapObject>& value) {
690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<Handle<HeapObject>>(  // --
691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IrOpcode::kHeapConstant, Operator::kPure,       // opcode
692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      "HeapConstant",                                 // name
693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      0, 0, 0, 1, 0, 0,                               // counts
694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      value);                                         // parameter
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
697bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochconst Operator* CommonOperatorBuilder::RelocatableInt32Constant(
698bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    int32_t value, RelocInfo::Mode rmode) {
699bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return new (zone()) Operator1<RelocatablePtrConstantInfo>(  // --
700bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      IrOpcode::kRelocatableInt32Constant, Operator::kPure,   // opcode
701bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      "RelocatableInt32Constant",                             // name
702bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      0, 0, 0, 1, 0, 0,                                       // counts
703bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      RelocatablePtrConstantInfo(value, rmode));              // parameter
704bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
705bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
706bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochconst Operator* CommonOperatorBuilder::RelocatableInt64Constant(
707bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    int64_t value, RelocInfo::Mode rmode) {
708bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return new (zone()) Operator1<RelocatablePtrConstantInfo>(  // --
709bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      IrOpcode::kRelocatableInt64Constant, Operator::kPure,   // opcode
710bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      "RelocatableInt64Constant",                             // name
711bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      0, 0, 0, 1, 0, 0,                                       // counts
712bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      RelocatablePtrConstantInfo(value, rmode));              // parameter
713bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::Select(MachineRepresentation rep,
716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                              BranchHint hint) {
717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return new (zone()) Operator1<SelectParameters>(  // --
718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IrOpcode::kSelect, Operator::kPure,           // opcode
719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      "Select",                                     // name
720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      3, 0, 0, 1, 0, 0,                             // counts
721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      SelectParameters(rep, hint));                 // parameter
722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::Phi(MachineRepresentation rep,
726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           int value_input_count) {
727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(value_input_count > 0);  // Disallow empty phis.
728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_PHI(kRep, kValueInputCount)                 \
729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (MachineRepresentation::kRep == rep &&                \
730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      kValueInputCount == value_input_count) {             \
731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.kPhi##kRep##kValueInputCount##Operator; \
732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_PHI_LIST(CACHED_PHI)
734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_PHI
735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Uncached.
736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<MachineRepresentation>(  // --
737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kPhi, Operator::kPure,                   // opcode
738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Phi",                                             // name
739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      value_input_count, 0, 1, 1, 0, 0,                  // counts
740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      rep);                                              // parameter
741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::EffectPhi(int effect_input_count) {
745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(effect_input_count > 0);  // Disallow empty effect phis.
746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (effect_input_count) {
747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_EFFECT_PHI(input_count) \
748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  case input_count:                    \
749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.kEffectPhi##input_count##Operator;
750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CACHED_EFFECT_PHI_LIST(CACHED_EFFECT_PHI)
751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_EFFECT_PHI
752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Uncached.
756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return new (zone()) Operator(               // --
757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IrOpcode::kEffectPhi, Operator::kPure,  // opcode
758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      "EffectPhi",                            // name
759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, effect_input_count, 1, 0, 1, 0);     // counts
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::StateValues(int arguments) {
764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (arguments) {
765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_STATE_VALUES(arguments) \
766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  case arguments:                      \
767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.kStateValues##arguments##Operator;
768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CACHED_STATE_VALUES_LIST(CACHED_STATE_VALUES)
769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_STATE_VALUES
770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Uncached.
774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return new (zone()) Operator(                 // --
775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IrOpcode::kStateValues, Operator::kPure,  // opcode
776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      "StateValues",                            // name
777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      arguments, 0, 0, 1, 0, 0);                // counts
778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::ObjectState(int pointer_slots, int id) {
782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<int>(           // --
783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kObjectState, Operator::kPure,  // opcode
784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "ObjectState",                            // name
785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      pointer_slots, 0, 0, 1, 0, 0, id);        // counts
786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::TypedStateValues(
790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const ZoneVector<MachineType>* types) {
791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<const ZoneVector<MachineType>*>(  // --
792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kTypedStateValues, Operator::kPure,               // opcode
793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "TypedStateValues",                                         // name
794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      static_cast<int>(types->size()), 0, 0, 1, 0, 0, types);     // counts
795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::FrameState(
799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    BailoutId bailout_id, OutputFrameStateCombine state_combine,
800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const FrameStateFunctionInfo* function_info) {
801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FrameStateInfo state_info(bailout_id, state_combine, function_info);
802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<FrameStateInfo>(  // --
803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kFrameState, Operator::kPure,     // opcode
804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "FrameState",                               // name
805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      5, 0, 0, 1, 0, 0,                           // counts
806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      state_info);                                // parameter
807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::Call(const CallDescriptor* descriptor) {
811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class CallOperator final : public Operator1<const CallDescriptor*> {
812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   public:
813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    explicit CallOperator(const CallDescriptor* descriptor)
814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : Operator1<const CallDescriptor*>(
815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kCall, descriptor->properties(), "Call",
816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              descriptor->InputCount() + descriptor->FrameStateCount(),
817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              Operator::ZeroIfPure(descriptor->properties()),
818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Operator::ZeroIfEliminatable(descriptor->properties()),
819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              descriptor->ReturnCount(),
820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Operator::ZeroIfPure(descriptor->properties()),
821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Operator::ZeroIfNoThrow(descriptor->properties()), descriptor) {}
822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    void PrintParameter(std::ostream& os) const override {
824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      os << "[" << *parameter() << "]";
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) CallOperator(descriptor);
828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::TailCall(
832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const CallDescriptor* descriptor) {
833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class TailCallOperator final : public Operator1<const CallDescriptor*> {
834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   public:
835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    explicit TailCallOperator(const CallDescriptor* descriptor)
836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator1<const CallDescriptor*>(
837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kTailCall, descriptor->properties(), "TailCall",
838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              descriptor->InputCount() + descriptor->FrameStateCount(), 1, 1, 0,
839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              0, 1, descriptor) {}
840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    void PrintParameter(std::ostream& os) const override {
842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      os << "[" << *parameter() << "]";
843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) TailCallOperator(descriptor);
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::Projection(size_t index) {
850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (index) {
851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_PROJECTION(index) \
852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  case index:                    \
853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.kProjection##index##Operator;
854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CACHED_PROJECTION_LIST(CACHED_PROJECTION)
855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_PROJECTION
856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Uncached.
860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<size_t>(         // --
861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kProjection,                     // opcode
862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Operator::kFoldable | Operator::kNoThrow,  // flags
863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Projection",                              // name
864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      1, 0, 0, 1, 0, 0,                          // counts
865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      index);                                    // parameter
866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::ResizeMergeOrPhi(const Operator* op,
870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                        int size) {
871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (op->opcode() == IrOpcode::kPhi) {
872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Phi(PhiRepresentationOf(op), size);
873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (op->opcode() == IrOpcode::kEffectPhi) {
874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return EffectPhi(size);
875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (op->opcode() == IrOpcode::kMerge) {
876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Merge(size);
877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (op->opcode() == IrOpcode::kLoop) {
878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Loop(size);
879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UNREACHABLE();
881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return nullptr;
882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst FrameStateFunctionInfo*
887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochCommonOperatorBuilder::CreateFrameStateFunctionInfo(
888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FrameStateType type, int parameter_count, int local_count,
889109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<SharedFunctionInfo> shared_info) {
890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()->New(sizeof(FrameStateFunctionInfo)))
891109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      FrameStateFunctionInfo(type, parameter_count, local_count, shared_info);
892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace compiler
895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace internal
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
897