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"
1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/compiler/node.h"
11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/opcodes.h"
12958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compiler/operator.h"
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/handles-inl.h"
1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects-inl.h"
15f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/zone.h"
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
21958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, BranchHint hint) {
22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (hint) {
23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BranchHint::kNone:
24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return os << "None";
25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BranchHint::kTrue:
26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return os << "True";
27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BranchHint::kFalse:
28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return os << "False";
29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNREACHABLE();
31958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return os;
32958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierBranchHint BranchHintOf(const Operator* const op) {
36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK_EQ(IrOpcode::kBranch, op->opcode());
37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return OpParameter<BranchHint>(op);
38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochint ValueInputCountOfReturn(Operator const* const op) {
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(op->opcode() == IrOpcode::kReturn);
4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Return nodes have a hidden input at index 0 which we ignore in the value
4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // input count.
4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return op->ValueInputCount() - 1;
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool operator==(DeoptimizeParameters lhs, DeoptimizeParameters rhs) {
48f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return lhs.kind() == rhs.kind() && lhs.reason() == rhs.reason();
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
51f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool operator!=(DeoptimizeParameters lhs, DeoptimizeParameters rhs) {
52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return !(lhs == rhs);
53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
55f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochsize_t hash_value(DeoptimizeParameters p) {
56f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return base::hash_combine(p.kind(), p.reason());
57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
59f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstd::ostream& operator<<(std::ostream& os, DeoptimizeParameters p) {
60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return os << p.kind() << ":" << p.reason();
61f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
63f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochDeoptimizeParameters const& DeoptimizeParametersOf(Operator const* const op) {
6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(op->opcode() == IrOpcode::kDeoptimize ||
6562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         op->opcode() == IrOpcode::kDeoptimizeIf ||
6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         op->opcode() == IrOpcode::kDeoptimizeUnless);
67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return OpParameter<DeoptimizeParameters>(op);
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
71958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool operator==(SelectParameters const& lhs, SelectParameters const& rhs) {
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return lhs.representation() == rhs.representation() &&
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         lhs.hint() == rhs.hint();
74958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
76958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
77958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool operator!=(SelectParameters const& lhs, SelectParameters const& rhs) {
78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return !(lhs == rhs);
79958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniersize_t hash_value(SelectParameters const& p) {
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return base::hash_combine(p.representation(), p.hint());
84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, SelectParameters const& p) {
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return os << p.representation() << "|" << p.hint();
89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierSelectParameters const& SelectParametersOf(const Operator* const op) {
93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK_EQ(IrOpcode::kSelect, op->opcode());
94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return OpParameter<SelectParameters>(op);
95958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
97bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochCallDescriptor const* CallDescriptorOf(const Operator* const op) {
98bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DCHECK(op->opcode() == IrOpcode::kCall ||
99bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         op->opcode() == IrOpcode::kTailCall);
100bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return OpParameter<CallDescriptor const*>(op);
101bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t ProjectionIndexOf(const Operator* const op) {
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(IrOpcode::kProjection, op->opcode());
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return OpParameter<size_t>(op);
106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMachineRepresentation PhiRepresentationOf(const Operator* const op) {
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(IrOpcode::kPhi, op->opcode());
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return OpParameter<MachineRepresentation>(op);
112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint ParameterIndexOf(const Operator* const op) {
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(IrOpcode::kParameter, op->opcode());
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return OpParameter<ParameterInfo>(op).index();
118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst ParameterInfo& ParameterInfoOf(const Operator* const op) {
122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(IrOpcode::kParameter, op->opcode());
123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return OpParameter<ParameterInfo>(op);
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool operator==(ParameterInfo const& lhs, ParameterInfo const& rhs) {
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return lhs.index() == rhs.index();
129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool operator!=(ParameterInfo const& lhs, ParameterInfo const& rhs) {
133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return !(lhs == rhs);
134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t hash_value(ParameterInfo const& p) { return p.index(); }
138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, ParameterInfo const& i) {
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (i.debug_name()) os << i.debug_name() << '#';
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  os << i.index();
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return os;
144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
146bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochbool operator==(RelocatablePtrConstantInfo const& lhs,
147bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                RelocatablePtrConstantInfo const& rhs) {
148bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return lhs.rmode() == rhs.rmode() && lhs.value() == rhs.value() &&
149bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         lhs.type() == rhs.type();
150bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
151bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
152bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochbool operator!=(RelocatablePtrConstantInfo const& lhs,
153bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                RelocatablePtrConstantInfo const& rhs) {
154bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return !(lhs == rhs);
155bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
156bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
157bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochsize_t hash_value(RelocatablePtrConstantInfo const& p) {
158bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return base::hash_combine(p.value(), p.rmode(), p.type());
159bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
160bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
161bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochstd::ostream& operator<<(std::ostream& os,
162bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                         RelocatablePtrConstantInfo const& p) {
163bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return os << p.value() << "|" << p.rmode() << "|" << p.type();
164bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
165bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
16662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSparseInputMask::InputIterator::InputIterator(
16762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    SparseInputMask::BitMaskType bit_mask, Node* parent)
16862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    : bit_mask_(bit_mask), parent_(parent), real_index_(0) {
16962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#if DEBUG
17062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (bit_mask_ != SparseInputMask::kDenseBitMask) {
17162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK_EQ(base::bits::CountPopulation(bit_mask_) -
17262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                  base::bits::CountPopulation(kEndMarker),
17362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              parent->InputCount());
17462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
17562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif
17662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
17762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
17862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid SparseInputMask::InputIterator::Advance() {
17962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(!IsEnd());
18062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
18162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (IsReal()) {
18262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    ++real_index_;
18362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
18462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bit_mask_ >>= 1;
18562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
18662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
18762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochNode* SparseInputMask::InputIterator::GetReal() const {
18862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(IsReal());
18962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return parent_->InputAt(real_index_);
19062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
19162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
19262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool SparseInputMask::InputIterator::IsReal() const {
19362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return bit_mask_ == SparseInputMask::kDenseBitMask ||
19462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         (bit_mask_ & kEntryMask);
19562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
19662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
19762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool SparseInputMask::InputIterator::IsEnd() const {
19862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (bit_mask_ == kEndMarker) ||
19962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         (bit_mask_ == SparseInputMask::kDenseBitMask &&
20062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          real_index_ >= parent_->InputCount());
20162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
20262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
20362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochint SparseInputMask::CountReal() const {
20462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(!IsDense());
20562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return base::bits::CountPopulation(bit_mask_) -
20662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         base::bits::CountPopulation(kEndMarker);
20762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
20862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
20962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSparseInputMask::InputIterator SparseInputMask::IterateOverInputs(Node* node) {
21062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(IsDense() || CountReal() == node->InputCount());
21162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return InputIterator(bit_mask_, node);
21262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
21362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
21462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool operator==(SparseInputMask const& lhs, SparseInputMask const& rhs) {
21562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return lhs.mask() == rhs.mask();
21662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
21762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
21862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool operator!=(SparseInputMask const& lhs, SparseInputMask const& rhs) {
21962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return !(lhs == rhs);
22062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
22162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
22262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochsize_t hash_value(SparseInputMask const& p) {
22362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return base::hash_value(p.mask());
22462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
22562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
22662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstd::ostream& operator<<(std::ostream& os, SparseInputMask const& p) {
22762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (p.IsDense()) {
22862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return os << "dense";
22962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else {
23062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    SparseInputMask::BitMaskType mask = p.mask();
23162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK_NE(mask, SparseInputMask::kDenseBitMask);
23262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
23362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    os << "sparse:";
23462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
23562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    while (mask != SparseInputMask::kEndMarker) {
23662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      if (mask & SparseInputMask::kEntryMask) {
23762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        os << "^";
23862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      } else {
23962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        os << ".";
24062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      }
24162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      mask >>= 1;
24262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
24362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return os;
24462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
24562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
24662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
24762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool operator==(TypedStateValueInfo const& lhs,
24862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                TypedStateValueInfo const& rhs) {
24962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return lhs.machine_types() == rhs.machine_types() &&
25062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         lhs.sparse_input_mask() == rhs.sparse_input_mask();
25162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
25262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
25362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool operator!=(TypedStateValueInfo const& lhs,
25462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                TypedStateValueInfo const& rhs) {
25562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return !(lhs == rhs);
25662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
25762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
25862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochsize_t hash_value(TypedStateValueInfo const& p) {
25962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return base::hash_combine(p.machine_types(), p.sparse_input_mask());
26062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
26162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
26262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstd::ostream& operator<<(std::ostream& os, TypedStateValueInfo const& p) {
26362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return os << p.machine_types() << "|" << p.sparse_input_mask();
26462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
26562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
26613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochsize_t hash_value(RegionObservability observability) {
26713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return static_cast<size_t>(observability);
26813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
26913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
27013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochstd::ostream& operator<<(std::ostream& os, RegionObservability observability) {
27113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  switch (observability) {
27213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case RegionObservability::kObservable:
27313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return os << "observable";
27413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case RegionObservability::kNotObservable:
27513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return os << "not-observable";
27613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
27713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  UNREACHABLE();
27813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return os;
27913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
28013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
28113e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochRegionObservability RegionObservabilityOf(Operator const* op) {
28213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK_EQ(IrOpcode::kBeginRegion, op->opcode());
28313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return OpParameter<RegionObservability>(op);
28413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
28513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
286f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochType* TypeGuardTypeOf(Operator const* op) {
287f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK_EQ(IrOpcode::kTypeGuard, op->opcode());
288f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return OpParameter<Type*>(op);
289f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
290f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
29113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochstd::ostream& operator<<(std::ostream& os,
29213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                         const ZoneVector<MachineType>* types) {
29313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  // Print all the MachineTypes, separated by commas.
29413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  bool first = true;
29513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  for (MachineType elem : *types) {
29613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    if (!first) {
29713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      os << ", ";
29813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    }
29913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    first = false;
30013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    os << elem;
30113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
30213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return os;
30313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
30413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
305c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochint OsrValueIndexOf(Operator const* op) {
306c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_EQ(IrOpcode::kOsrValue, op->opcode());
307c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return OpParameter<int>(op);
308c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
309c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
310c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochsize_t hash_value(OsrGuardType type) { return static_cast<size_t>(type); }
311c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
312c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstd::ostream& operator<<(std::ostream& os, OsrGuardType type) {
313c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  switch (type) {
314c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    case OsrGuardType::kUninitialized:
315c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      return os << "Uninitialized";
316c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    case OsrGuardType::kSignedSmall:
317c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      return os << "SignedSmall";
318c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    case OsrGuardType::kAny:
319c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      return os << "Any";
320c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
321c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  UNREACHABLE();
322c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return os;
323c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
324c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
325c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochOsrGuardType OsrGuardTypeOf(Operator const* op) {
326c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_EQ(IrOpcode::kOsrGuard, op->opcode());
327c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return OpParameter<OsrGuardType>(op);
328c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
329c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
33062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSparseInputMask SparseInputMaskOf(Operator const* op) {
33162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(op->opcode() == IrOpcode::kStateValues ||
33262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         op->opcode() == IrOpcode::kTypedStateValues);
33362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
33462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (op->opcode() == IrOpcode::kTypedStateValues) {
33562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return OpParameter<TypedStateValueInfo>(op).sparse_input_mask();
33662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
33762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return OpParameter<SparseInputMask>(op);
33862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
33962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
340c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochZoneVector<MachineType> const* MachineTypesOf(Operator const* op) {
341c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK(op->opcode() == IrOpcode::kTypedObjectState ||
342c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch         op->opcode() == IrOpcode::kTypedStateValues);
34362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
34462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (op->opcode() == IrOpcode::kTypedStateValues) {
34562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return OpParameter<TypedStateValueInfo>(op).machine_types();
34662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
347c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return OpParameter<const ZoneVector<MachineType>*>(op);
348c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
349c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
350f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define CACHED_OP_LIST(V)                                                     \
351f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(Dead, Operator::kFoldable, 0, 0, 0, 1, 1, 1)                              \
352f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(IfTrue, Operator::kKontrol, 0, 0, 1, 0, 0, 1)                             \
353f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(IfFalse, Operator::kKontrol, 0, 0, 1, 0, 0, 1)                            \
354f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(IfSuccess, Operator::kKontrol, 0, 0, 1, 0, 0, 1)                          \
355f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(IfException, Operator::kKontrol, 0, 1, 1, 1, 1, 1)                        \
356f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(IfDefault, Operator::kKontrol, 0, 0, 1, 0, 0, 1)                          \
357f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(Throw, Operator::kKontrol, 1, 1, 1, 0, 0, 1)                              \
358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(Terminate, Operator::kKontrol, 0, 1, 1, 0, 0, 1)                          \
359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(OsrNormalEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1)                    \
360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(OsrLoopEntry, Operator::kFoldable | Operator::kNoThrow, 0, 1, 1, 0, 1, 1) \
361f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(LoopExit, Operator::kKontrol, 0, 0, 2, 0, 0, 1)                           \
362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(LoopExitValue, Operator::kPure, 1, 0, 1, 1, 0, 0)                         \
363f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(LoopExitEffect, Operator::kNoThrow, 0, 1, 1, 0, 1, 0)                     \
364f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(Checkpoint, Operator::kKontrol, 0, 1, 1, 0, 1, 0)                         \
365f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(FinishRegion, Operator::kKontrol, 1, 1, 0, 1, 1, 0)                       \
366f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(Retain, Operator::kKontrol, 1, 1, 0, 0, 1, 0)
367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_RETURN_LIST(V) \
369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(1)                        \
370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(2)                        \
371c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(3)                        \
372c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(4)
373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_END_LIST(V) \
375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(1)                     \
376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(2)                     \
377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(3)                     \
378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(4)                     \
379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(5)                     \
380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(6)                     \
381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(7)                     \
382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(8)
383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_EFFECT_PHI_LIST(V) \
386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(1)                            \
387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(2)                            \
388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(3)                            \
389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(4)                            \
390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(5)                            \
391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(6)
392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
393f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define CACHED_INDUCTION_VARIABLE_PHI_LIST(V) \
394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(4)                                        \
395f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(5)                                        \
396f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(6)                                        \
397f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(7)
398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_LOOP_LIST(V) \
400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(1)                      \
401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(2)
402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_MERGE_LIST(V) \
405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(1)                       \
406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(2)                       \
407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(3)                       \
408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(4)                       \
409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(5)                       \
410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(6)                       \
411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(7)                       \
412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(8)
413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
414f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define CACHED_DEOPTIMIZE_LIST(V)                        \
415f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(Eager, MinusZero)                                    \
416f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(Eager, NoReason)                                     \
417f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(Eager, WrongMap)                                     \
418f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(Soft, InsufficientTypeFeedbackForGenericKeyedAccess) \
419f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(Soft, InsufficientTypeFeedbackForGenericNamedAccess)
420f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
421f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define CACHED_DEOPTIMIZE_IF_LIST(V) \
42262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, DivisionByZero)           \
42362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, Hole)                     \
42462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, MinusZero)                \
42562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, Overflow)                 \
42662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, Smi)
427f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
428f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define CACHED_DEOPTIMIZE_UNLESS_LIST(V) \
42962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, LostPrecision)                \
43062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, LostPrecisionOrNaN)           \
43162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, NoReason)                     \
43262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, NotAHeapNumber)               \
43362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, NotANumberOrOddball)          \
43462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, NotASmi)                      \
43562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, OutOfBounds)                  \
43662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, WrongInstanceType)            \
43762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(Eager, WrongMap)
43862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
43962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define CACHED_TRAP_IF_LIST(V) \
44062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(TrapDivUnrepresentable)    \
44162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(TrapFloatUnrepresentable)
44262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
44362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// The reason for a trap.
44462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define CACHED_TRAP_UNLESS_LIST(V) \
44562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(TrapUnreachable)               \
44662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(TrapMemOutOfBounds)            \
44762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(TrapDivByZero)                 \
44862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(TrapDivUnrepresentable)        \
44962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(TrapRemByZero)                 \
45062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(TrapFloatUnrepresentable)      \
45162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(TrapFuncInvalid)               \
45262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(TrapFuncSigMismatch)
453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_PARAMETER_LIST(V) \
455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(0)                           \
456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(1)                           \
457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(2)                           \
458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(3)                           \
459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(4)                           \
460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(5)                           \
461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(6)
462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_PHI_LIST(V) \
465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kTagged, 1)            \
466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kTagged, 2)            \
467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kTagged, 3)            \
468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kTagged, 4)            \
469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kTagged, 5)            \
470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kTagged, 6)            \
471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kBit, 2)               \
472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kFloat64, 2)           \
473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(kWord32, 2)
474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_PROJECTION_LIST(V) \
477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(0)                            \
478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(1)
479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_STATE_VALUES_LIST(V) \
482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(0)                              \
483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(1)                              \
484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(2)                              \
485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(3)                              \
486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(4)                              \
487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(5)                              \
488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(6)                              \
489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(7)                              \
490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(8)                              \
491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(10)                             \
492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(11)                             \
493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(12)                             \
494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(13)                             \
495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(14)
496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct CommonOperatorGlobalCache final {
499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED(Name, properties, value_input_count, effect_input_count,      \
500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               control_input_count, value_output_count, effect_output_count, \
501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               control_output_count)                                         \
502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct Name##Operator final : public Operator {                            \
503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Name##Operator()                                                         \
504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator(IrOpcode::k##Name, properties, #Name, value_input_count,  \
505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   effect_input_count, control_input_count,                  \
506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   value_output_count, effect_output_count,                  \
507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   control_output_count) {}                                  \
508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };                                                                         \
509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Name##Operator k##Name##Operator;
510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CACHED_OP_LIST(CACHED)
511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED
512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  template <size_t kInputCount>
514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct EndOperator final : public Operator {
515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EndOperator()
516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator(                                // --
517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kEnd, Operator::kKontrol,  // opcode
518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "End",                               // name
519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              0, 0, kInputCount, 0, 0, 0) {}       // counts
520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_END(input_count) \
522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EndOperator<input_count> kEnd##input_count##Operator;
523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_END_LIST(CACHED_END)
524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_END
525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
526c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  template <size_t kValueInputCount>
527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct ReturnOperator final : public Operator {
528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    ReturnOperator()
529c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        : Operator(                                    // --
530c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch              IrOpcode::kReturn, Operator::kNoThrow,   // opcode
531c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch              "Return",                                // name
532c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch              kValueInputCount + 1, 1, 1, 0, 0, 1) {}  // counts
533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
534c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#define CACHED_RETURN(value_input_count) \
535c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ReturnOperator<value_input_count> kReturn##value_input_count##Operator;
536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_RETURN_LIST(CACHED_RETURN)
537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_RETURN
538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  template <BranchHint kBranchHint>
540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct BranchOperator final : public Operator1<BranchHint> {
541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    BranchOperator()
542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator1<BranchHint>(                      // --
543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kBranch, Operator::kKontrol,  // opcode
544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "Branch",                               // name
545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              1, 0, 1, 0, 0, 2,                       // counts
546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              kBranchHint) {}                         // parameter
547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  };
548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BranchOperator<BranchHint::kNone> kBranchNoneOperator;
549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BranchOperator<BranchHint::kTrue> kBranchTrueOperator;
550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BranchOperator<BranchHint::kFalse> kBranchFalseOperator;
551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  template <int kEffectInputCount>
553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct EffectPhiOperator final : public Operator {
554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EffectPhiOperator()
555f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        : Operator(                                      // --
556f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              IrOpcode::kEffectPhi, Operator::kKontrol,  // opcode
557f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              "EffectPhi",                               // name
558f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              0, kEffectInputCount, 1, 0, 1, 0) {}       // counts
559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_EFFECT_PHI(input_count) \
561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EffectPhiOperator<input_count> kEffectPhi##input_count##Operator;
562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_EFFECT_PHI_LIST(CACHED_EFFECT_PHI)
563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_EFFECT_PHI
564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
56513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  template <RegionObservability kRegionObservability>
56613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  struct BeginRegionOperator final : public Operator1<RegionObservability> {
56713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    BeginRegionOperator()
56813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        : Operator1<RegionObservability>(                  // --
56913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              IrOpcode::kBeginRegion, Operator::kKontrol,  // opcode
57013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              "BeginRegion",                               // name
57113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              0, 1, 0, 0, 1, 0,                            // counts
57213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              kRegionObservability) {}                     // parameter
57313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  };
57413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  BeginRegionOperator<RegionObservability::kObservable>
57513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      kBeginRegionObservableOperator;
57613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  BeginRegionOperator<RegionObservability::kNotObservable>
57713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      kBeginRegionNotObservableOperator;
57813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  template <size_t kInputCount>
580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct LoopOperator final : public Operator {
581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    LoopOperator()
582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator(                                 // --
583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kLoop, Operator::kKontrol,  // opcode
584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "Loop",                               // name
585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              0, 0, kInputCount, 0, 0, 1) {}        // counts
586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  };
587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_LOOP(input_count) \
588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LoopOperator<input_count> kLoop##input_count##Operator;
589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CACHED_LOOP_LIST(CACHED_LOOP)
590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED_LOOP
591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  template <size_t kInputCount>
593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct MergeOperator final : public Operator {
594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    MergeOperator()
595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator(                                  // --
596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kMerge, Operator::kKontrol,  // opcode
597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "Merge",                               // name
598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              0, 0, kInputCount, 0, 0, 1) {}         // counts
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_MERGE(input_count) \
601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MergeOperator<input_count> kMerge##input_count##Operator;
602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CACHED_MERGE_LIST(CACHED_MERGE)
603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED_MERGE
604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
605f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  template <DeoptimizeKind kKind, DeoptimizeReason kReason>
606f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  struct DeoptimizeOperator final : public Operator1<DeoptimizeParameters> {
607f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    DeoptimizeOperator()
608f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        : Operator1<DeoptimizeParameters>(               // --
609f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              IrOpcode::kDeoptimize,                     // opcode
610f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              Operator::kFoldable | Operator::kNoThrow,  // properties
611f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              "Deoptimize",                              // name
612f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              1, 1, 1, 0, 0, 1,                          // counts
613f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              DeoptimizeParameters(kKind, kReason)) {}   // parameter
614f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
615f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define CACHED_DEOPTIMIZE(Kind, Reason)                                    \
616f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DeoptimizeOperator<DeoptimizeKind::k##Kind, DeoptimizeReason::k##Reason> \
617f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kDeoptimize##Kind##Reason##Operator;
618f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CACHED_DEOPTIMIZE_LIST(CACHED_DEOPTIMIZE)
619f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#undef CACHED_DEOPTIMIZE
620f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
62162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  template <DeoptimizeKind kKind, DeoptimizeReason kReason>
62262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  struct DeoptimizeIfOperator final : public Operator1<DeoptimizeParameters> {
623f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    DeoptimizeIfOperator()
62462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        : Operator1<DeoptimizeParameters>(               // --
625f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              IrOpcode::kDeoptimizeIf,                   // opcode
626f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              Operator::kFoldable | Operator::kNoThrow,  // properties
627f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              "DeoptimizeIf",                            // name
628f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              2, 1, 1, 0, 1, 1,                          // counts
62962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              DeoptimizeParameters(kKind, kReason)) {}   // parameter
630f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
63162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define CACHED_DEOPTIMIZE_IF(Kind, Reason)                                   \
63262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DeoptimizeIfOperator<DeoptimizeKind::k##Kind, DeoptimizeReason::k##Reason> \
63362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      kDeoptimizeIf##Kind##Reason##Operator;
634f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CACHED_DEOPTIMIZE_IF_LIST(CACHED_DEOPTIMIZE_IF)
635f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#undef CACHED_DEOPTIMIZE_IF
636f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
63762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  template <DeoptimizeKind kKind, DeoptimizeReason kReason>
63862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  struct DeoptimizeUnlessOperator final
63962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      : public Operator1<DeoptimizeParameters> {
640f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    DeoptimizeUnlessOperator()
64162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        : Operator1<DeoptimizeParameters>(               // --
642f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              IrOpcode::kDeoptimizeUnless,               // opcode
643f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              Operator::kFoldable | Operator::kNoThrow,  // properties
644f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              "DeoptimizeUnless",                        // name
645f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              2, 1, 1, 0, 1, 1,                          // counts
64662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              DeoptimizeParameters(kKind, kReason)) {}   // parameter
647f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
64862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define CACHED_DEOPTIMIZE_UNLESS(Kind, Reason)          \
64962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DeoptimizeUnlessOperator<DeoptimizeKind::k##Kind,     \
65062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                           DeoptimizeReason::k##Reason> \
65162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      kDeoptimizeUnless##Kind##Reason##Operator;
652f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CACHED_DEOPTIMIZE_UNLESS_LIST(CACHED_DEOPTIMIZE_UNLESS)
653f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#undef CACHED_DEOPTIMIZE_UNLESS
654f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
65562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  template <int32_t trap_id>
65662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  struct TrapIfOperator final : public Operator1<int32_t> {
65762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    TrapIfOperator()
65862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        : Operator1<int32_t>(                            // --
65962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              IrOpcode::kTrapIf,                         // opcode
66062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              Operator::kFoldable | Operator::kNoThrow,  // properties
66162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              "TrapIf",                                  // name
66262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              1, 1, 1, 0, 0, 1,                          // counts
66362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              trap_id) {}                                // parameter
66462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  };
66562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define CACHED_TRAP_IF(Trap)                                       \
66662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  TrapIfOperator<static_cast<int32_t>(Builtins::kThrowWasm##Trap)> \
66762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      kTrapIf##Trap##Operator;
66862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CACHED_TRAP_IF_LIST(CACHED_TRAP_IF)
66962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef CACHED_TRAP_IF
67062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
67162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  template <int32_t trap_id>
67262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  struct TrapUnlessOperator final : public Operator1<int32_t> {
67362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    TrapUnlessOperator()
67462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        : Operator1<int32_t>(                            // --
67562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              IrOpcode::kTrapUnless,                     // opcode
67662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              Operator::kFoldable | Operator::kNoThrow,  // properties
67762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              "TrapUnless",                              // name
67862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              1, 1, 1, 0, 0, 1,                          // counts
67962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              trap_id) {}                                // parameter
68062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  };
68162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define CACHED_TRAP_UNLESS(Trap)                                       \
68262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  TrapUnlessOperator<static_cast<int32_t>(Builtins::kThrowWasm##Trap)> \
68362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      kTrapUnless##Trap##Operator;
68462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CACHED_TRAP_UNLESS_LIST(CACHED_TRAP_UNLESS)
68562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef CACHED_TRAP_UNLESS
68662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  template <MachineRepresentation kRep, int kInputCount>
688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct PhiOperator final : public Operator1<MachineRepresentation> {
689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PhiOperator()
690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator1<MachineRepresentation>(     //--
691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kPhi, Operator::kPure,  // opcode
692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "Phi",                            // name
693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              kInputCount, 0, 1, 1, 0, 0,       // counts
694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              kRep) {}                          // parameter
695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_PHI(rep, input_count)                   \
697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PhiOperator<MachineRepresentation::rep, input_count> \
698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      kPhi##rep##input_count##Operator;
699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_PHI_LIST(CACHED_PHI)
700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_PHI
701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
702f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  template <int kInputCount>
703f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  struct InductionVariablePhiOperator final : public Operator {
704f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    InductionVariablePhiOperator()
705f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        : Operator(                                              //--
706f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              IrOpcode::kInductionVariablePhi, Operator::kPure,  // opcode
707f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              "InductionVariablePhi",                            // name
708f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              kInputCount, 0, 1, 1, 0, 0) {}                     // counts
709f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
710f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define CACHED_INDUCTION_VARIABLE_PHI(input_count) \
711f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  InductionVariablePhiOperator<input_count>        \
712f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kInductionVariablePhi##input_count##Operator;
713f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CACHED_INDUCTION_VARIABLE_PHI_LIST(CACHED_INDUCTION_VARIABLE_PHI)
714f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#undef CACHED_INDUCTION_VARIABLE_PHI
715f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  template <int kIndex>
717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct ParameterOperator final : public Operator1<ParameterInfo> {
718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    ParameterOperator()
719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator1<ParameterInfo>(                   // --
720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              IrOpcode::kParameter, Operator::kPure,  // opcode
721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              "Parameter",                            // name
722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              1, 0, 0, 1, 0, 0,                       // counts,
723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              ParameterInfo(kIndex, nullptr)) {}      // parameter and name
724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  };
725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_PARAMETER(index) \
726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ParameterOperator<index> kParameter##index##Operator;
727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CACHED_PARAMETER_LIST(CACHED_PARAMETER)
728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED_PARAMETER
729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  template <size_t kIndex>
731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct ProjectionOperator final : public Operator1<size_t> {
732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    ProjectionOperator()
733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator1<size_t>(          // --
734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kProjection,  // opcode
735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Operator::kPure,        // flags
736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "Projection",           // name
73713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              1, 0, 1, 1, 0, 0,       // counts,
738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              kIndex) {}              // parameter
739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_PROJECTION(index) \
741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ProjectionOperator<index> kProjection##index##Operator;
742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_PROJECTION_LIST(CACHED_PROJECTION)
743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_PROJECTION
744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  template <int kInputCount>
74662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  struct StateValuesOperator final : public Operator1<SparseInputMask> {
747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    StateValuesOperator()
74862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        : Operator1<SparseInputMask>(       // --
74962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              IrOpcode::kStateValues,       // opcode
75062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              Operator::kPure,              // flags
75162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              "StateValues",                // name
75262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              kInputCount, 0, 0, 1, 0, 0,   // counts
75362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              SparseInputMask::Dense()) {}  // parameter
754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_STATE_VALUES(input_count) \
756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  StateValuesOperator<input_count> kStateValues##input_count##Operator;
757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_STATE_VALUES_LIST(CACHED_STATE_VALUES)
758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_STATE_VALUES
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstatic base::LazyInstance<CommonOperatorGlobalCache>::type kCache =
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LAZY_INSTANCE_INITIALIZER;
764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCommonOperatorBuilder::CommonOperatorBuilder(Zone* zone)
767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    : cache_(kCache.Get()), zone_(zone) {}
768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED(Name, properties, value_input_count, effect_input_count,      \
771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               control_input_count, value_output_count, effect_output_count, \
772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               control_output_count)                                         \
773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const Operator* CommonOperatorBuilder::Name() {                            \
774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.k##Name##Operator;                                        \
775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierCACHED_OP_LIST(CACHED)
777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED
778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::End(size_t control_input_count) {
781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (control_input_count) {
782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_END(input_count) \
783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  case input_count:             \
784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.kEnd##input_count##Operator;
785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CACHED_END_LIST(CACHED_END)
786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_END
787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Uncached.
791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator(             //--
792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kEnd, Operator::kKontrol,   // opcode
793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "End",                                // name
794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, control_input_count, 0, 0, 0);  // counts
795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::Return(int value_input_count) {
798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (value_input_count) {
799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_RETURN(input_count) \
800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  case input_count:                \
801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.kReturn##input_count##Operator;
802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CACHED_RETURN_LIST(CACHED_RETURN)
803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_RETURN
804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Uncached.
808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator(               //--
809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kReturn, Operator::kNoThrow,  // opcode
810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Return",                               // name
811c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      value_input_count + 1, 1, 1, 0, 0, 1);  // counts
812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst Operator* CommonOperatorBuilder::Branch(BranchHint hint) {
816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (hint) {
817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BranchHint::kNone:
818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return &cache_.kBranchNoneOperator;
819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BranchHint::kTrue:
820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return &cache_.kBranchTrueOperator;
821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BranchHint::kFalse:
822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return &cache_.kBranchFalseOperator;
823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNREACHABLE();
825958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return nullptr;
826958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
828f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Operator* CommonOperatorBuilder::Deoptimize(DeoptimizeKind kind,
829f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                                  DeoptimizeReason reason) {
830f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define CACHED_DEOPTIMIZE(Kind, Reason)                 \
831f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (kind == DeoptimizeKind::k##Kind &&                \
832f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      reason == DeoptimizeReason::k##Reason) {          \
833f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    return &cache_.kDeoptimize##Kind##Reason##Operator; \
834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
835f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CACHED_DEOPTIMIZE_LIST(CACHED_DEOPTIMIZE)
836f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#undef CACHED_DEOPTIMIZE
837f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Uncached
838f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DeoptimizeParameters parameter(kind, reason);
839f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return new (zone()) Operator1<DeoptimizeParameters>(  // --
840f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      IrOpcode::kDeoptimize,                            // opcodes
841f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Operator::kFoldable | Operator::kNoThrow,         // properties
842f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      "Deoptimize",                                     // name
843f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      1, 1, 1, 0, 0, 1,                                 // counts
844f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      parameter);                                       // parameter
845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
84762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochconst Operator* CommonOperatorBuilder::DeoptimizeIf(DeoptimizeKind kind,
84862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                    DeoptimizeReason reason) {
84962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define CACHED_DEOPTIMIZE_IF(Kind, Reason)                \
85062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (kind == DeoptimizeKind::k##Kind &&                  \
85162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      reason == DeoptimizeReason::k##Reason) {            \
85262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return &cache_.kDeoptimizeIf##Kind##Reason##Operator; \
853f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
85462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CACHED_DEOPTIMIZE_IF_LIST(CACHED_DEOPTIMIZE_IF)
85562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef CACHED_DEOPTIMIZE_IF
856f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Uncached
85762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DeoptimizeParameters parameter(kind, reason);
85862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return new (zone()) Operator1<DeoptimizeParameters>(  // --
85962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      IrOpcode::kDeoptimizeIf,                          // opcode
86062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Operator::kFoldable | Operator::kNoThrow,         // properties
86162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      "DeoptimizeIf",                                   // name
86262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      2, 1, 1, 0, 1, 1,                                 // counts
86362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      parameter);                                       // parameter
864f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
866f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Operator* CommonOperatorBuilder::DeoptimizeUnless(
86762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DeoptimizeKind kind, DeoptimizeReason reason) {
86862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define CACHED_DEOPTIMIZE_UNLESS(Kind, Reason)                \
86962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (kind == DeoptimizeKind::k##Kind &&                      \
87062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      reason == DeoptimizeReason::k##Reason) {                \
87162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return &cache_.kDeoptimizeUnless##Kind##Reason##Operator; \
87262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
87362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CACHED_DEOPTIMIZE_UNLESS_LIST(CACHED_DEOPTIMIZE_UNLESS)
874f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#undef CACHED_DEOPTIMIZE_UNLESS
87562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Uncached
87662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DeoptimizeParameters parameter(kind, reason);
87762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return new (zone()) Operator1<DeoptimizeParameters>(  // --
87862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      IrOpcode::kDeoptimizeUnless,                      // opcode
87962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Operator::kFoldable | Operator::kNoThrow,         // properties
88062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      "DeoptimizeUnless",                               // name
88162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      2, 1, 1, 0, 1, 1,                                 // counts
88262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      parameter);                                       // parameter
88362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
88462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
88562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochconst Operator* CommonOperatorBuilder::TrapIf(int32_t trap_id) {
88662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (trap_id) {
88762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define CACHED_TRAP_IF(Trap)       \
88862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  case Builtins::kThrowWasm##Trap: \
88962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return &cache_.kTrapIf##Trap##Operator;
89062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    CACHED_TRAP_IF_LIST(CACHED_TRAP_IF)
89162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef CACHED_TRAP_IF
892f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    default:
893f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
895f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Uncached
89662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return new (zone()) Operator1<int>(            // --
89762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      IrOpcode::kTrapIf,                         // opcode
89862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Operator::kFoldable | Operator::kNoThrow,  // properties
89962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      "TrapIf",                                  // name
90062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      1, 1, 1, 0, 0, 1,                          // counts
90162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      trap_id);                                  // parameter
90262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
90362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
90462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochconst Operator* CommonOperatorBuilder::TrapUnless(int32_t trap_id) {
90562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (trap_id) {
90662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define CACHED_TRAP_UNLESS(Trap)   \
90762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  case Builtins::kThrowWasm##Trap: \
90862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return &cache_.kTrapUnless##Trap##Operator;
90962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    CACHED_TRAP_UNLESS_LIST(CACHED_TRAP_UNLESS)
91062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef CACHED_TRAP_UNLESS
91162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    default:
91262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
91362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
91462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Uncached
91562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return new (zone()) Operator1<int>(            // --
91662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      IrOpcode::kTrapUnless,                     // opcode
91762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Operator::kFoldable | Operator::kNoThrow,  // properties
91862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      "TrapUnless",                              // name
91962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      1, 1, 1, 0, 0, 1,                          // counts
92062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      trap_id);                                  // parameter
921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::Switch(size_t control_output_count) {
924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator(               // --
925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kSwitch, Operator::kKontrol,  // opcode
926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Switch",                               // name
927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      1, 0, 1, 0, 0, control_output_count);   // counts
928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::IfValue(int32_t index) {
932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<int32_t>(      // --
933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kIfValue, Operator::kKontrol,  // opcode
934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "IfValue",                               // name
935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, 1, 0, 0, 1,                        // counts
936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      index);                                  // parameter
937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::Start(int value_output_count) {
941f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return new (zone()) Operator(                                    // --
942f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      IrOpcode::kStart, Operator::kFoldable | Operator::kNoThrow,  // opcode
943f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      "Start",                                                     // name
944f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      0, 0, 0, value_output_count, 1, 1);                          // counts
945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst Operator* CommonOperatorBuilder::Loop(int control_input_count) {
949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (control_input_count) {
950958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_LOOP(input_count) \
951958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  case input_count:              \
952958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return &cache_.kLoop##input_count##Operator;
953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    CACHED_LOOP_LIST(CACHED_LOOP)
954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED_LOOP
955958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    default:
956958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
957958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
958958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Uncached.
959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator(             // --
960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kLoop, Operator::kKontrol,  // opcode
961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Loop",                               // name
962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, control_input_count, 0, 0, 1);  // counts
963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
966958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst Operator* CommonOperatorBuilder::Merge(int control_input_count) {
967958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (control_input_count) {
968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_MERGE(input_count) \
969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  case input_count:               \
970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return &cache_.kMerge##input_count##Operator;
971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    CACHED_MERGE_LIST(CACHED_MERGE)
972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED_MERGE
973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    default:
974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Uncached.
977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator(              // --
978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kMerge, Operator::kKontrol,  // opcode
979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Merge",                               // name
980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, control_input_count, 0, 0, 1);   // counts
981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::Parameter(int index,
985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                 const char* debug_name) {
986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!debug_name) {
987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    switch (index) {
988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define CACHED_PARAMETER(index) \
989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  case index:                   \
990958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return &cache_.kParameter##index##Operator;
991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CACHED_PARAMETER_LIST(CACHED_PARAMETER)
992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef CACHED_PARAMETER
993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      default:
994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        break;
995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Uncached.
998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<ParameterInfo>(  // --
999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kParameter, Operator::kPure,     // opcode
1000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Parameter",                               // name
1001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      1, 0, 0, 1, 0, 0,                          // counts
1002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ParameterInfo(index, debug_name));         // parameter info
1003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::OsrValue(int index) {
1006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<int>(                // --
1007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kOsrValue, Operator::kNoProperties,  // opcode
1008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "OsrValue",                                    // name
1009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, 1, 1, 0, 0,                              // counts
1010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      index);                                        // parameter
1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1013c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochconst Operator* CommonOperatorBuilder::OsrGuard(OsrGuardType type) {
1014c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return new (zone()) Operator1<OsrGuardType>(  // --
1015c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      IrOpcode::kOsrGuard, Operator::kNoThrow,  // opcode
1016c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      "OsrGuard",                               // name
1017c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      1, 1, 1, 1, 1, 0,                         // counts
1018c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      type);                                    // parameter
1019c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::Int32Constant(int32_t value) {
1022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return new (zone()) Operator1<int32_t>(         // --
1023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IrOpcode::kInt32Constant, Operator::kPure,  // opcode
1024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      "Int32Constant",                            // name
1025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      0, 0, 0, 1, 0, 0,                           // counts
1026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      value);                                     // parameter
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::Int64Constant(int64_t value) {
1031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return new (zone()) Operator1<int64_t>(         // --
1032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IrOpcode::kInt64Constant, Operator::kPure,  // opcode
1033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      "Int64Constant",                            // name
1034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      0, 0, 0, 1, 0, 0,                           // counts
1035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      value);                                     // parameter
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::Float32Constant(volatile float value) {
1040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<float>(             // --
1041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kFloat32Constant, Operator::kPure,  // opcode
1042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Float32Constant",                            // name
1043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, 0, 1, 0, 0,                             // counts
1044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      value);                                       // parameter
1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::Float64Constant(volatile double value) {
1049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<double>(            // --
1050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kFloat64Constant, Operator::kPure,  // opcode
1051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Float64Constant",                            // name
1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, 0, 1, 0, 0,                             // counts
1053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      value);                                       // parameter
1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::ExternalConstant(
1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const ExternalReference& value) {
1059958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return new (zone()) Operator1<ExternalReference>(  // --
1060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IrOpcode::kExternalConstant, Operator::kPure,  // opcode
1061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      "ExternalConstant",                            // name
1062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      0, 0, 0, 1, 0, 0,                              // counts
1063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      value);                                        // parameter
1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::NumberConstant(volatile double value) {
1068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<double>(           // --
1069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kNumberConstant, Operator::kPure,  // opcode
1070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "NumberConstant",                            // name
1071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      0, 0, 0, 1, 0, 0,                            // counts
1072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      value);                                      // parameter
1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1075c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochconst Operator* CommonOperatorBuilder::PointerConstant(intptr_t value) {
1076c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return new (zone()) Operator1<intptr_t>(          // --
1077c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      IrOpcode::kPointerConstant, Operator::kPure,  // opcode
1078c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      "PointerConstant",                            // name
1079c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      0, 0, 0, 1, 0, 0,                             // counts
1080c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      value);                                       // parameter
1081c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::HeapConstant(
1084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const Handle<HeapObject>& value) {
1085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<Handle<HeapObject>>(  // --
1086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IrOpcode::kHeapConstant, Operator::kPure,       // opcode
1087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      "HeapConstant",                                 // name
1088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      0, 0, 0, 1, 0, 0,                               // counts
1089958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      value);                                         // parameter
1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1092bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochconst Operator* CommonOperatorBuilder::RelocatableInt32Constant(
1093bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    int32_t value, RelocInfo::Mode rmode) {
1094bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return new (zone()) Operator1<RelocatablePtrConstantInfo>(  // --
1095bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      IrOpcode::kRelocatableInt32Constant, Operator::kPure,   // opcode
1096bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      "RelocatableInt32Constant",                             // name
1097bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      0, 0, 0, 1, 0, 0,                                       // counts
1098bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      RelocatablePtrConstantInfo(value, rmode));              // parameter
1099bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
1100bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1101bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochconst Operator* CommonOperatorBuilder::RelocatableInt64Constant(
1102bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    int64_t value, RelocInfo::Mode rmode) {
1103bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return new (zone()) Operator1<RelocatablePtrConstantInfo>(  // --
1104bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      IrOpcode::kRelocatableInt64Constant, Operator::kPure,   // opcode
1105bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      "RelocatableInt64Constant",                             // name
1106bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      0, 0, 0, 1, 0, 0,                                       // counts
1107bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      RelocatablePtrConstantInfo(value, rmode));              // parameter
1108bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::Select(MachineRepresentation rep,
1111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                              BranchHint hint) {
1112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return new (zone()) Operator1<SelectParameters>(  // --
1113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IrOpcode::kSelect, Operator::kPure,           // opcode
1114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      "Select",                                     // name
1115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      3, 0, 0, 1, 0, 0,                             // counts
1116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      SelectParameters(rep, hint));                 // parameter
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::Phi(MachineRepresentation rep,
1121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                           int value_input_count) {
1122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(value_input_count > 0);  // Disallow empty phis.
1123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_PHI(kRep, kValueInputCount)                 \
1124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (MachineRepresentation::kRep == rep &&                \
1125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      kValueInputCount == value_input_count) {             \
1126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.kPhi##kRep##kValueInputCount##Operator; \
1127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CACHED_PHI_LIST(CACHED_PHI)
1129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_PHI
1130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Uncached.
1131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<MachineRepresentation>(  // --
1132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kPhi, Operator::kPure,                   // opcode
1133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "Phi",                                             // name
1134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      value_input_count, 0, 1, 1, 0, 0,                  // counts
1135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      rep);                                              // parameter
1136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Operator* CommonOperatorBuilder::TypeGuard(Type* type) {
1139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return new (zone()) Operator1<Type*>(       // --
1140f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      IrOpcode::kTypeGuard, Operator::kPure,  // opcode
1141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      "TypeGuard",                            // name
1142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      1, 0, 1, 1, 0, 0,                       // counts
1143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      type);                                  // parameter
1144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
1145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::EffectPhi(int effect_input_count) {
1147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(effect_input_count > 0);  // Disallow empty effect phis.
1148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (effect_input_count) {
1149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_EFFECT_PHI(input_count) \
1150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  case input_count:                    \
1151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.kEffectPhi##input_count##Operator;
1152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CACHED_EFFECT_PHI_LIST(CACHED_EFFECT_PHI)
1153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_EFFECT_PHI
1154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
1155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
1156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Uncached.
1158f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return new (zone()) Operator(                  // --
1159f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      IrOpcode::kEffectPhi, Operator::kKontrol,  // opcode
1160f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      "EffectPhi",                               // name
1161f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      0, effect_input_count, 1, 0, 1, 0);        // counts
1162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
1163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Operator* CommonOperatorBuilder::InductionVariablePhi(int input_count) {
1165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(input_count >= 4);  // There must be always the entry, backedge,
1166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                             // increment and at least one bound.
1167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  switch (input_count) {
1168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define CACHED_INDUCTION_VARIABLE_PHI(input_count) \
1169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  case input_count:                                \
1170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    return &cache_.kInductionVariablePhi##input_count##Operator;
1171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CACHED_INDUCTION_VARIABLE_PHI_LIST(CACHED_INDUCTION_VARIABLE_PHI)
1172f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#undef CACHED_INDUCTION_VARIABLE_PHI
1173f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    default:
1174f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
1175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
1176f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Uncached.
1177f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return new (zone()) Operator(                          // --
1178f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      IrOpcode::kInductionVariablePhi, Operator::kPure,  // opcode
1179f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      "InductionVariablePhi",                            // name
1180f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      input_count, 0, 1, 1, 0, 0);                       // counts
1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
118313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochconst Operator* CommonOperatorBuilder::BeginRegion(
118413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    RegionObservability region_observability) {
118513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  switch (region_observability) {
118613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case RegionObservability::kObservable:
118713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return &cache_.kBeginRegionObservableOperator;
118813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case RegionObservability::kNotObservable:
118913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return &cache_.kBeginRegionNotObservableOperator;
119013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
119113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  UNREACHABLE();
119213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return nullptr;
119313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
119562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochconst Operator* CommonOperatorBuilder::StateValues(int arguments,
119662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                   SparseInputMask bitmask) {
119762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (bitmask.IsDense()) {
119862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    switch (arguments) {
1199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_STATE_VALUES(arguments) \
1200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  case arguments:                      \
1201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.kStateValues##arguments##Operator;
120262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      CACHED_STATE_VALUES_LIST(CACHED_STATE_VALUES)
1203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_STATE_VALUES
120462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      default:
120562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        break;
120662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
1207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
120862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
120962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#if DEBUG
121062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(bitmask.IsDense() || bitmask.CountReal() == arguments);
121162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif
121262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Uncached.
121462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return new (zone()) Operator1<SparseInputMask>(  // --
121562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      IrOpcode::kStateValues, Operator::kPure,     // opcode
121662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      "StateValues",                               // name
121762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      arguments, 0, 0, 1, 0, 0,                    // counts
121862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      bitmask);                                    // parameter
1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1221c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochconst Operator* CommonOperatorBuilder::TypedStateValues(
122262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    const ZoneVector<MachineType>* types, SparseInputMask bitmask) {
122362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#if DEBUG
122462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(bitmask.IsDense() ||
122562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         bitmask.CountReal() == static_cast<int>(types->size()));
122662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif
122762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
122862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return new (zone()) Operator1<TypedStateValueInfo>(  // --
122962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      IrOpcode::kTypedStateValues, Operator::kPure,    // opcode
123062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      "TypedStateValues",                              // name
123162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      static_cast<int>(types->size()), 0, 0, 1, 0, 0,  // counts
123262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      TypedStateValueInfo(types, bitmask));            // parameters
123362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
123462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
123562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochconst Operator* CommonOperatorBuilder::ArgumentsObjectState() {
123662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return new (zone()) Operator(                          // --
123762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      IrOpcode::kArgumentsObjectState, Operator::kPure,  // opcode
123862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      "ArgumentsObjectState",                            // name
123962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      0, 0, 0, 1, 0, 0);                                 // counts
1240c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1242c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochconst Operator* CommonOperatorBuilder::ObjectState(int pointer_slots) {
1243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<int>(           // --
1244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kObjectState, Operator::kPure,  // opcode
1245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "ObjectState",                            // name
1246c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      pointer_slots, 0, 0, 1, 0, 0,             // counts
1247c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      pointer_slots);                           // parameter
1248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1250c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochconst Operator* CommonOperatorBuilder::TypedObjectState(
1251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const ZoneVector<MachineType>* types) {
1252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<const ZoneVector<MachineType>*>(  // --
1253c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      IrOpcode::kTypedObjectState, Operator::kPure,               // opcode
1254c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      "TypedObjectState",                                         // name
1255c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      static_cast<int>(types->size()), 0, 0, 1, 0, 0,             // counts
1256c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      types);                                                     // parameter
1257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::FrameState(
1260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    BailoutId bailout_id, OutputFrameStateCombine state_combine,
1261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const FrameStateFunctionInfo* function_info) {
1262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FrameStateInfo state_info(bailout_id, state_combine, function_info);
1263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) Operator1<FrameStateInfo>(  // --
1264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      IrOpcode::kFrameState, Operator::kPure,     // opcode
1265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "FrameState",                               // name
1266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      5, 0, 0, 1, 0, 0,                           // counts
1267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      state_info);                                // parameter
1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::Call(const CallDescriptor* descriptor) {
1272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class CallOperator final : public Operator1<const CallDescriptor*> {
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   public:
1274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    explicit CallOperator(const CallDescriptor* descriptor)
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : Operator1<const CallDescriptor*>(
1276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              IrOpcode::kCall, descriptor->properties(), "Call",
1277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              descriptor->InputCount() + descriptor->FrameStateCount(),
1278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              Operator::ZeroIfPure(descriptor->properties()),
1279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Operator::ZeroIfEliminatable(descriptor->properties()),
1280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              descriptor->ReturnCount(),
1281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Operator::ZeroIfPure(descriptor->properties()),
1282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Operator::ZeroIfNoThrow(descriptor->properties()), descriptor) {}
1283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1284f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    void PrintParameter(std::ostream& os, PrintVerbosity verbose) const {
1285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      os << "[" << *parameter() << "]";
1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) CallOperator(descriptor);
1289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::TailCall(
1293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    const CallDescriptor* descriptor) {
1294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  class TailCallOperator final : public Operator1<const CallDescriptor*> {
1295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   public:
1296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    explicit TailCallOperator(const CallDescriptor* descriptor)
1297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : Operator1<const CallDescriptor*>(
1298f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              IrOpcode::kTailCall,
1299f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              descriptor->properties() | Operator::kNoThrow, "TailCall",
1300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              descriptor->InputCount() + descriptor->FrameStateCount(), 1, 1, 0,
1301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              0, 1, descriptor) {}
1302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1303f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    void PrintParameter(std::ostream& os, PrintVerbosity verbose) const {
1304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      os << "[" << *parameter() << "]";
1305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
1307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) TailCallOperator(descriptor);
1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst Operator* CommonOperatorBuilder::Projection(size_t index) {
1312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (index) {
1313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CACHED_PROJECTION(index) \
1314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  case index:                    \
1315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &cache_.kProjection##index##Operator;
1316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CACHED_PROJECTION_LIST(CACHED_PROJECTION)
1317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef CACHED_PROJECTION
1318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default:
1319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
1320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Uncached.
132213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return new (zone()) Operator1<size_t>(  // --
132313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      IrOpcode::kProjection,              // opcode
132413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      Operator::kPure,                    // flags
132513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      "Projection",                       // name
132613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      1, 0, 1, 1, 0, 0,                   // counts
132713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      index);                             // parameter
1328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* CommonOperatorBuilder::ResizeMergeOrPhi(const Operator* op,
1332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                        int size) {
1333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (op->opcode() == IrOpcode::kPhi) {
1334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Phi(PhiRepresentationOf(op), size);
1335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (op->opcode() == IrOpcode::kEffectPhi) {
1336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return EffectPhi(size);
1337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (op->opcode() == IrOpcode::kMerge) {
1338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Merge(size);
1339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (op->opcode() == IrOpcode::kLoop) {
1340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Loop(size);
1341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
1342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UNREACHABLE();
1343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return nullptr;
1344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst FrameStateFunctionInfo*
1348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochCommonOperatorBuilder::CreateFrameStateFunctionInfo(
1349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FrameStateType type, int parameter_count, int local_count,
1350109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    Handle<SharedFunctionInfo> shared_info) {
1351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()->New(sizeof(FrameStateFunctionInfo)))
1352109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      FrameStateFunctionInfo(type, parameter_count, local_count, shared_info);
1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace compiler
1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace internal
1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
1358