1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2012 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/simplified-operator.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/lazy-instance.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/opcodes.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/operator.h"
10f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compiler/types.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
16bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochsize_t hash_value(BaseTaggedness base_taggedness) {
17bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return static_cast<uint8_t>(base_taggedness);
18bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
19bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, BaseTaggedness base_taggedness) {
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (base_taggedness) {
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kUntaggedBase:
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return os << "untagged base";
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kTaggedBase:
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return os << "tagged base";
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UNREACHABLE();
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return os;
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierMachineType BufferAccess::machine_type() const {
33958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (external_array_type_) {
34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case kExternalUint8Array:
35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case kExternalUint8ClampedArray:
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MachineType::Uint8();
37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case kExternalInt8Array:
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MachineType::Int8();
39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case kExternalUint16Array:
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MachineType::Uint16();
41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case kExternalInt16Array:
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MachineType::Int16();
43958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case kExternalUint32Array:
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MachineType::Uint32();
45958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case kExternalInt32Array:
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MachineType::Int32();
47958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case kExternalFloat32Array:
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MachineType::Float32();
49958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case kExternalFloat64Array:
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return MachineType::Float64();
51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
52958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNREACHABLE();
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return MachineType::None();
54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
56958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
57958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool operator==(BufferAccess lhs, BufferAccess rhs) {
58958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return lhs.external_array_type() == rhs.external_array_type();
59958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
60958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool operator!=(BufferAccess lhs, BufferAccess rhs) { return !(lhs == rhs); }
63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
64958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniersize_t hash_value(BufferAccess access) {
66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return base::hash<ExternalArrayType>()(access.external_array_type());
67958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
68958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
69958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
70958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, BufferAccess access) {
71958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (access.external_array_type()) {
72958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
73958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  case kExternal##Type##Array:                          \
74958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return os << #Type;
75958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    TYPED_ARRAYS(TYPED_ARRAY_CASE)
76958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef TYPED_ARRAY_CASE
77958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNREACHABLE();
79958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return os;
80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
83958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierBufferAccess const BufferAccessOf(const Operator* op) {
84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(op->opcode() == IrOpcode::kLoadBuffer ||
85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier         op->opcode() == IrOpcode::kStoreBuffer);
86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return OpParameter<BufferAccess>(op);
87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool operator==(FieldAccess const& lhs, FieldAccess const& rhs) {
91bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // On purpose we don't include the write barrier kind here, as this method is
92bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // really only relevant for eliminating loads and they don't care about the
93bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // write barrier mode.
94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return lhs.base_is_tagged == rhs.base_is_tagged && lhs.offset == rhs.offset &&
95958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier         lhs.machine_type == rhs.machine_type;
96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
97958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
98958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
99958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool operator!=(FieldAccess const& lhs, FieldAccess const& rhs) {
100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return !(lhs == rhs);
101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniersize_t hash_value(FieldAccess const& access) {
105bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // On purpose we don't include the write barrier kind here, as this method is
106bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // really only relevant for eliminating loads and they don't care about the
107bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // write barrier mode.
108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return base::hash_combine(access.base_is_tagged, access.offset,
109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                            access.machine_type);
110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, FieldAccess const& access) {
114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << "[" << access.base_is_tagged << ", " << access.offset << ", ";
115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifdef OBJECT_PRINT
116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<Name> name;
117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (access.name.ToHandle(&name)) {
118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    name->Print(os);
119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    os << ", ";
120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  access.type->PrintTo(os);
123bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  os << ", " << access.machine_type << ", " << access.write_barrier_kind << "]";
124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return os;
125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
127f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <>
128f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Operator1<FieldAccess>::PrintParameter(std::ostream& os,
129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                            PrintVerbosity verbose) const {
130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (verbose == PrintVerbosity::kVerbose) {
131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    os << parameter();
132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  } else {
133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    os << "[+" << parameter().offset << "]";
134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool operator==(ElementAccess const& lhs, ElementAccess const& rhs) {
138bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // On purpose we don't include the write barrier kind here, as this method is
139bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // really only relevant for eliminating loads and they don't care about the
140bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // write barrier mode.
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return lhs.base_is_tagged == rhs.base_is_tagged &&
142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier         lhs.header_size == rhs.header_size &&
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         lhs.machine_type == rhs.machine_type;
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool operator!=(ElementAccess const& lhs, ElementAccess const& rhs) {
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return !(lhs == rhs);
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniersize_t hash_value(ElementAccess const& access) {
153bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // On purpose we don't include the write barrier kind here, as this method is
154bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // really only relevant for eliminating loads and they don't care about the
155bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // write barrier mode.
156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return base::hash_combine(access.base_is_tagged, access.header_size,
157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                            access.machine_type);
158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, ElementAccess const& access) {
162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << access.base_is_tagged << ", " << access.header_size << ", ";
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  access.type->PrintTo(os);
164bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  os << ", " << access.machine_type << ", " << access.write_barrier_kind;
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return os;
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst FieldAccess& FieldAccessOf(const Operator* op) {
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_NOT_NULL(op);
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(op->opcode() == IrOpcode::kLoadField ||
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         op->opcode() == IrOpcode::kStoreField);
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return OpParameter<FieldAccess>(op);
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst ElementAccess& ElementAccessOf(const Operator* op) {
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_NOT_NULL(op);
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(op->opcode() == IrOpcode::kLoadElement ||
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         op->opcode() == IrOpcode::kStoreElement);
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return OpParameter<ElementAccess>(op);
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
184f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochExternalArrayType ExternalArrayTypeOf(const Operator* op) {
185f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(op->opcode() == IrOpcode::kLoadTypedElement ||
186f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         op->opcode() == IrOpcode::kStoreTypedElement);
187f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return OpParameter<ExternalArrayType>(op);
188f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
189f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
19013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochsize_t hash_value(CheckFloat64HoleMode mode) {
19113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return static_cast<size_t>(mode);
19213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
19313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
19413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochstd::ostream& operator<<(std::ostream& os, CheckFloat64HoleMode mode) {
19513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  switch (mode) {
19613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case CheckFloat64HoleMode::kAllowReturnHole:
19713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return os << "allow-return-hole";
19813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case CheckFloat64HoleMode::kNeverReturnHole:
19913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return os << "never-return-hole";
20013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
20113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  UNREACHABLE();
20213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return os;
20313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
20413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
20513e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochCheckFloat64HoleMode CheckFloat64HoleModeOf(const Operator* op) {
20613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK_EQ(IrOpcode::kCheckFloat64Hole, op->opcode());
20713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return OpParameter<CheckFloat64HoleMode>(op);
20813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
20913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochCheckForMinusZeroMode CheckMinusZeroModeOf(const Operator* op) {
211f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK(op->opcode() == IrOpcode::kCheckedInt32Mul ||
212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         op->opcode() == IrOpcode::kCheckedFloat64ToInt32 ||
213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         op->opcode() == IrOpcode::kCheckedTaggedToInt32);
214f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return OpParameter<CheckForMinusZeroMode>(op);
215f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
217f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochsize_t hash_value(CheckForMinusZeroMode mode) {
21813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return static_cast<size_t>(mode);
21913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
22013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
221f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstd::ostream& operator<<(std::ostream& os, CheckForMinusZeroMode mode) {
22213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  switch (mode) {
223f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckForMinusZeroMode::kCheckForMinusZero:
224f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return os << "check-for-minus-zero";
225f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckForMinusZeroMode::kDontCheckForMinusZero:
226f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return os << "dont-check-for-minus-zero";
227f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
228f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  UNREACHABLE();
229f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return os;
230f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
231f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
232f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochsize_t hash_value(CheckTaggedInputMode mode) {
233f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return static_cast<size_t>(mode);
234f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
235f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
236f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstd::ostream& operator<<(std::ostream& os, CheckTaggedInputMode mode) {
237f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  switch (mode) {
238f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckTaggedInputMode::kNumber:
239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return os << "Number";
240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckTaggedInputMode::kNumberOrOddball:
241f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return os << "NumberOrOddball";
24213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
24313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  UNREACHABLE();
24413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return os;
24513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
24613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
247f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochCheckTaggedInputMode CheckTaggedInputModeOf(const Operator* op) {
248f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK_EQ(IrOpcode::kCheckedTaggedToFloat64, op->opcode());
249f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return OpParameter<CheckTaggedInputMode>(op);
250f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
251f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
252f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstd::ostream& operator<<(std::ostream& os, GrowFastElementsFlags flags) {
253f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  bool empty = true;
254f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (flags & GrowFastElementsFlag::kArrayObject) {
255f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    os << "ArrayObject";
256f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    empty = false;
257f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
258f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (flags & GrowFastElementsFlag::kDoubleElements) {
259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    if (!empty) os << "|";
260f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    os << "DoubleElements";
261f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    empty = false;
262f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
263f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (flags & GrowFastElementsFlag::kHoleyElements) {
264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    if (!empty) os << "|";
265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    os << "HoleyElements";
266f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    empty = false;
267f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
268f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (empty) os << "None";
269f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return os;
270f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
271f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
272f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochGrowFastElementsFlags GrowFastElementsFlagsOf(const Operator* op) {
273f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK_EQ(IrOpcode::kMaybeGrowFastElements, op->opcode());
274f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return OpParameter<GrowFastElementsFlags>(op);
27513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
27613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
277f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochsize_t hash_value(ElementsTransition transition) {
278f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return static_cast<uint8_t>(transition);
279bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
280bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
281f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstd::ostream& operator<<(std::ostream& os, ElementsTransition transition) {
282f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  switch (transition) {
283f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case ElementsTransition::kFastTransition:
284f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return os << "fast-transition";
285f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case ElementsTransition::kSlowTransition:
286f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return os << "slow-transition";
287f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
288f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  UNREACHABLE();
289f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return os;
290f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
291f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
292f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochElementsTransition ElementsTransitionOf(const Operator* op) {
293f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK_EQ(IrOpcode::kTransitionElementsKind, op->opcode());
294f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return OpParameter<ElementsTransition>(op);
295f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
296f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
297f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstd::ostream& operator<<(std::ostream& os, NumberOperationHint hint) {
298f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  switch (hint) {
299f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case NumberOperationHint::kSignedSmall:
300f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return os << "SignedSmall";
301f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case NumberOperationHint::kSigned32:
302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return os << "Signed32";
303f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case NumberOperationHint::kNumber:
304f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return os << "Number";
305f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case NumberOperationHint::kNumberOrOddball:
306f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return os << "NumberOrOddball";
307f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
308f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  UNREACHABLE();
309f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return os;
310f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
311f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
312f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochsize_t hash_value(NumberOperationHint hint) {
313f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return static_cast<uint8_t>(hint);
314f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
315f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
316f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochNumberOperationHint NumberOperationHintOf(const Operator* op) {
31713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(op->opcode() == IrOpcode::kSpeculativeNumberAdd ||
31813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch         op->opcode() == IrOpcode::kSpeculativeNumberSubtract ||
31913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch         op->opcode() == IrOpcode::kSpeculativeNumberMultiply ||
32013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch         op->opcode() == IrOpcode::kSpeculativeNumberDivide ||
321f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         op->opcode() == IrOpcode::kSpeculativeNumberModulus ||
322f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         op->opcode() == IrOpcode::kSpeculativeNumberShiftLeft ||
323f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         op->opcode() == IrOpcode::kSpeculativeNumberShiftRight ||
324f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         op->opcode() == IrOpcode::kSpeculativeNumberShiftRightLogical ||
325f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         op->opcode() == IrOpcode::kSpeculativeNumberBitwiseAnd ||
326f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         op->opcode() == IrOpcode::kSpeculativeNumberBitwiseOr ||
327f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         op->opcode() == IrOpcode::kSpeculativeNumberBitwiseXor ||
328f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch         op->opcode() == IrOpcode::kSpeculativeNumberEqual ||
32913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch         op->opcode() == IrOpcode::kSpeculativeNumberLessThan ||
33013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch         op->opcode() == IrOpcode::kSpeculativeNumberLessThanOrEqual);
331f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return OpParameter<NumberOperationHint>(op);
332f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
333f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
334f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochPretenureFlag PretenureFlagOf(const Operator* op) {
335f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_EQ(IrOpcode::kAllocate, op->opcode());
336f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return OpParameter<PretenureFlag>(op);
337f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
338f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
339f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochUnicodeEncoding UnicodeEncodingOf(const Operator* op) {
340f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK(op->opcode() == IrOpcode::kStringFromCodePoint);
341f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return OpParameter<UnicodeEncoding>(op);
342f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
343f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
344f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define PURE_OP_LIST(V)                                          \
345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(BooleanNot, Operator::kNoProperties, 1, 0)                   \
346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberEqual, Operator::kCommutative, 2, 0)                   \
347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberLessThan, Operator::kNoProperties, 2, 0)               \
348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberLessThanOrEqual, Operator::kNoProperties, 2, 0)        \
349f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberAdd, Operator::kCommutative, 2, 0)                     \
350f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberSubtract, Operator::kNoProperties, 2, 0)               \
351f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberMultiply, Operator::kCommutative, 2, 0)                \
352f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberDivide, Operator::kNoProperties, 2, 0)                 \
353f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberModulus, Operator::kNoProperties, 2, 0)                \
354f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberBitwiseOr, Operator::kCommutative, 2, 0)               \
355f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberBitwiseXor, Operator::kCommutative, 2, 0)              \
356f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberBitwiseAnd, Operator::kCommutative, 2, 0)              \
357f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberShiftLeft, Operator::kNoProperties, 2, 0)              \
358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberShiftRight, Operator::kNoProperties, 2, 0)             \
359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberShiftRightLogical, Operator::kNoProperties, 2, 0)      \
360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberImul, Operator::kCommutative, 2, 0)                    \
361f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberAbs, Operator::kNoProperties, 1, 0)                    \
362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberClz32, Operator::kNoProperties, 1, 0)                  \
363f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberCeil, Operator::kNoProperties, 1, 0)                   \
364f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberFloor, Operator::kNoProperties, 1, 0)                  \
365f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberFround, Operator::kNoProperties, 1, 0)                 \
366f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberAcos, Operator::kNoProperties, 1, 0)                   \
367f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberAcosh, Operator::kNoProperties, 1, 0)                  \
368f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberAsin, Operator::kNoProperties, 1, 0)                   \
369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberAsinh, Operator::kNoProperties, 1, 0)                  \
370f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberAtan, Operator::kNoProperties, 1, 0)                   \
371f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberAtan2, Operator::kNoProperties, 2, 0)                  \
372f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberAtanh, Operator::kNoProperties, 1, 0)                  \
373f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberCbrt, Operator::kNoProperties, 1, 0)                   \
374f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberCos, Operator::kNoProperties, 1, 0)                    \
375f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberCosh, Operator::kNoProperties, 1, 0)                   \
376f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberExp, Operator::kNoProperties, 1, 0)                    \
377f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberExpm1, Operator::kNoProperties, 1, 0)                  \
378f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberLog, Operator::kNoProperties, 1, 0)                    \
379f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberLog1p, Operator::kNoProperties, 1, 0)                  \
380f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberLog10, Operator::kNoProperties, 1, 0)                  \
381f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberLog2, Operator::kNoProperties, 1, 0)                   \
382f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberMax, Operator::kNoProperties, 2, 0)                    \
383f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberMin, Operator::kNoProperties, 2, 0)                    \
384f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberPow, Operator::kNoProperties, 2, 0)                    \
385f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberRound, Operator::kNoProperties, 1, 0)                  \
386f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberSign, Operator::kNoProperties, 1, 0)                   \
387f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberSin, Operator::kNoProperties, 1, 0)                    \
388f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberSinh, Operator::kNoProperties, 1, 0)                   \
389f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberSqrt, Operator::kNoProperties, 1, 0)                   \
390f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberTan, Operator::kNoProperties, 1, 0)                    \
391f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberTanh, Operator::kNoProperties, 1, 0)                   \
392f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberTrunc, Operator::kNoProperties, 1, 0)                  \
393f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V(NumberToBoolean, Operator::kNoProperties, 1, 0)              \
394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberToInt32, Operator::kNoProperties, 1, 0)                \
395f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberToUint32, Operator::kNoProperties, 1, 0)               \
396c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(NumberToUint8Clamped, Operator::kNoProperties, 1, 0)         \
397f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(NumberSilenceNaN, Operator::kNoProperties, 1, 0)             \
398f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(StringCharCodeAt, Operator::kNoProperties, 2, 1)             \
399f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(StringFromCharCode, Operator::kNoProperties, 1, 0)           \
400f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(PlainPrimitiveToNumber, Operator::kNoProperties, 1, 0)       \
401f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(PlainPrimitiveToWord32, Operator::kNoProperties, 1, 0)       \
402f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(PlainPrimitiveToFloat64, Operator::kNoProperties, 1, 0)      \
403f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ChangeTaggedSignedToInt32, Operator::kNoProperties, 1, 0)    \
404f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ChangeTaggedToInt32, Operator::kNoProperties, 1, 0)          \
405f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ChangeTaggedToUint32, Operator::kNoProperties, 1, 0)         \
406f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ChangeTaggedToFloat64, Operator::kNoProperties, 1, 0)        \
407f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V(ChangeFloat64ToTagged, Operator::kNoProperties, 1, 0)        \
408c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(ChangeFloat64ToTaggedPointer, Operator::kNoProperties, 1, 0) \
409f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ChangeInt31ToTaggedSigned, Operator::kNoProperties, 1, 0)    \
410f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ChangeInt32ToTagged, Operator::kNoProperties, 1, 0)          \
411f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ChangeUint32ToTagged, Operator::kNoProperties, 1, 0)         \
412f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ChangeTaggedToBit, Operator::kNoProperties, 1, 0)            \
413f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ChangeBitToTagged, Operator::kNoProperties, 1, 0)            \
414f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V(TruncateTaggedToBit, Operator::kNoProperties, 1, 0)          \
415f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(TruncateTaggedToWord32, Operator::kNoProperties, 1, 0)       \
416f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(TruncateTaggedToFloat64, Operator::kNoProperties, 1, 0)      \
417f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ObjectIsCallable, Operator::kNoProperties, 1, 0)             \
418f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ObjectIsNumber, Operator::kNoProperties, 1, 0)               \
419f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ObjectIsReceiver, Operator::kNoProperties, 1, 0)             \
420f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ObjectIsSmi, Operator::kNoProperties, 1, 0)                  \
421f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ObjectIsString, Operator::kNoProperties, 1, 0)               \
422f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ObjectIsUndetectable, Operator::kNoProperties, 1, 0)         \
423f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ConvertTaggedHoleToUndefined, Operator::kNoProperties, 1, 0) \
424f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(ReferenceEqual, Operator::kCommutative, 2, 0)                \
425f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(StringEqual, Operator::kCommutative, 2, 0)                   \
426f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(StringLessThan, Operator::kNoProperties, 2, 0)               \
427f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(StringLessThanOrEqual, Operator::kNoProperties, 2, 0)
428f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
429f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define SPECULATIVE_NUMBER_BINOP_LIST(V)      \
430f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(V) \
431f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(SpeculativeNumberEqual)                   \
432f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(SpeculativeNumberLessThan)                \
433f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(SpeculativeNumberLessThanOrEqual)
434f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
435c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#define CHECKED_OP_LIST(V)              \
436c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckBounds, 2, 1)                  \
437c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckHeapObject, 1, 1)              \
438c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckIf, 1, 0)                      \
439c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckNumber, 1, 1)                  \
440c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckSmi, 1, 1)                     \
441c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckString, 1, 1)                  \
442c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckTaggedHole, 1, 1)              \
443c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckedInt32Add, 2, 1)              \
444c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckedInt32Sub, 2, 1)              \
445c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckedInt32Div, 2, 1)              \
446c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckedInt32Mod, 2, 1)              \
447c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckedUint32Div, 2, 1)             \
448c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckedUint32Mod, 2, 1)             \
449c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckedUint32ToInt32, 1, 1)         \
450c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckedUint32ToTaggedSigned, 1, 1)  \
451c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckedInt32ToTaggedSigned, 1, 1)   \
452c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckedTaggedSignedToInt32, 1, 1)   \
453c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckedTaggedToTaggedSigned, 1, 1)  \
454c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(CheckedTaggedToTaggedPointer, 1, 1) \
455f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(CheckedTruncateTaggedToWord32, 1, 1)
45613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct SimplifiedOperatorGlobalCache final {
458f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define PURE(Name, properties, value_input_count, control_input_count)     \
459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct Name##Operator final : public Operator {                          \
460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Name##Operator()                                                       \
461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        : Operator(IrOpcode::k##Name, Operator::kPure | properties, #Name, \
462f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                   value_input_count, 0, control_input_count, 1, 0, 0) {}  \
463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  };                                                                       \
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Name##Operator k##Name;
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PURE_OP_LIST(PURE)
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef PURE
467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
468f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define CHECKED(Name, value_input_count, value_output_count)             \
469f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  struct Name##Operator final : public Operator {                        \
470f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Name##Operator()                                                     \
471f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        : Operator(IrOpcode::k##Name,                                    \
472f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                   Operator::kFoldable | Operator::kNoThrow, #Name,      \
473f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                   value_input_count, 1, 1, value_output_count, 1, 0) {} \
474f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };                                                                     \
47513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Name##Operator k##Name;
47613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECKED_OP_LIST(CHECKED)
47713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#undef CHECKED
47813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
479f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  template <UnicodeEncoding kEncoding>
480f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  struct StringFromCodePointOperator final : public Operator1<UnicodeEncoding> {
481f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    StringFromCodePointOperator()
482f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        : Operator1<UnicodeEncoding>(IrOpcode::kStringFromCodePoint,
483f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                     Operator::kPure, "StringFromCodePoint", 1,
484f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                     0, 0, 1, 0, 0, kEncoding) {}
485f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  };
486f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  StringFromCodePointOperator<UnicodeEncoding::UTF16>
487f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      kStringFromCodePointOperatorUTF16;
488f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  StringFromCodePointOperator<UnicodeEncoding::UTF32>
489f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      kStringFromCodePointOperatorUTF32;
490f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
491f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  struct ArrayBufferWasNeuteredOperator final : public Operator {
492f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    ArrayBufferWasNeuteredOperator()
493f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        : Operator(IrOpcode::kArrayBufferWasNeutered, Operator::kEliminatable,
494f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                   "ArrayBufferWasNeutered", 1, 1, 1, 1, 1, 0) {}
495f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
496f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  ArrayBufferWasNeuteredOperator kArrayBufferWasNeutered;
497f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
498f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  template <CheckForMinusZeroMode kMode>
499f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  struct CheckedInt32MulOperator final
500f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      : public Operator1<CheckForMinusZeroMode> {
501f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CheckedInt32MulOperator()
502f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        : Operator1<CheckForMinusZeroMode>(
503f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              IrOpcode::kCheckedInt32Mul,
504f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              Operator::kFoldable | Operator::kNoThrow, "CheckedInt32Mul", 2, 1,
505f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              1, 1, 1, 0, kMode) {}
506f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
507f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CheckedInt32MulOperator<CheckForMinusZeroMode::kCheckForMinusZero>
508f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kCheckedInt32MulCheckForMinusZeroOperator;
509f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CheckedInt32MulOperator<CheckForMinusZeroMode::kDontCheckForMinusZero>
510f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kCheckedInt32MulDontCheckForMinusZeroOperator;
511f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
512f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  template <CheckForMinusZeroMode kMode>
513f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  struct CheckedFloat64ToInt32Operator final
514f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      : public Operator1<CheckForMinusZeroMode> {
515f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CheckedFloat64ToInt32Operator()
516f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        : Operator1<CheckForMinusZeroMode>(
517f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              IrOpcode::kCheckedFloat64ToInt32,
518f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              Operator::kFoldable | Operator::kNoThrow, "CheckedFloat64ToInt32",
519f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              1, 1, 1, 1, 1, 0, kMode) {}
520f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
521f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CheckedFloat64ToInt32Operator<CheckForMinusZeroMode::kCheckForMinusZero>
522f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kCheckedFloat64ToInt32CheckForMinusZeroOperator;
523f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CheckedFloat64ToInt32Operator<CheckForMinusZeroMode::kDontCheckForMinusZero>
524f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kCheckedFloat64ToInt32DontCheckForMinusZeroOperator;
525f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
526f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  template <CheckForMinusZeroMode kMode>
527f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  struct CheckedTaggedToInt32Operator final
528f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      : public Operator1<CheckForMinusZeroMode> {
529f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CheckedTaggedToInt32Operator()
530f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        : Operator1<CheckForMinusZeroMode>(
531f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              IrOpcode::kCheckedTaggedToInt32,
532f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              Operator::kFoldable | Operator::kNoThrow, "CheckedTaggedToInt32",
533f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              1, 1, 1, 1, 1, 0, kMode) {}
534f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
535f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CheckedTaggedToInt32Operator<CheckForMinusZeroMode::kCheckForMinusZero>
536f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kCheckedTaggedToInt32CheckForMinusZeroOperator;
537f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CheckedTaggedToInt32Operator<CheckForMinusZeroMode::kDontCheckForMinusZero>
538f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kCheckedTaggedToInt32DontCheckForMinusZeroOperator;
539f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
540f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  template <CheckTaggedInputMode kMode>
541f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  struct CheckedTaggedToFloat64Operator final
542f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      : public Operator1<CheckTaggedInputMode> {
543f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CheckedTaggedToFloat64Operator()
544f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        : Operator1<CheckTaggedInputMode>(
545f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              IrOpcode::kCheckedTaggedToFloat64,
546f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              Operator::kFoldable | Operator::kNoThrow,
547f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              "CheckedTaggedToFloat64", 1, 1, 1, 1, 1, 0, kMode) {}
548f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
549f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CheckedTaggedToFloat64Operator<CheckTaggedInputMode::kNumber>
550f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kCheckedTaggedToFloat64NumberOperator;
551f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CheckedTaggedToFloat64Operator<CheckTaggedInputMode::kNumberOrOddball>
552f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kCheckedTaggedToFloat64NumberOrOddballOperator;
553f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
55413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  template <CheckFloat64HoleMode kMode>
55513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  struct CheckFloat64HoleNaNOperator final
55613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      : public Operator1<CheckFloat64HoleMode> {
55713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    CheckFloat64HoleNaNOperator()
55813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        : Operator1<CheckFloat64HoleMode>(
55913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              IrOpcode::kCheckFloat64Hole,
56013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              Operator::kFoldable | Operator::kNoThrow, "CheckFloat64Hole", 1,
56113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              1, 1, 1, 1, 0, kMode) {}
56213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  };
56313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CheckFloat64HoleNaNOperator<CheckFloat64HoleMode::kAllowReturnHole>
56413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      kCheckFloat64HoleAllowReturnHoleOperator;
56513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CheckFloat64HoleNaNOperator<CheckFloat64HoleMode::kNeverReturnHole>
56613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      kCheckFloat64HoleNeverReturnHoleOperator;
56713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
568bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  template <PretenureFlag kPretenure>
569bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  struct AllocateOperator final : public Operator1<PretenureFlag> {
570bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    AllocateOperator()
57113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        : Operator1<PretenureFlag>(
57213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              IrOpcode::kAllocate,
57313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              Operator::kNoDeopt | Operator::kNoThrow | Operator::kNoWrite,
57413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              "Allocate", 1, 1, 1, 1, 1, 0, kPretenure) {}
575bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  };
576bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  AllocateOperator<NOT_TENURED> kAllocateNotTenuredOperator;
577bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  AllocateOperator<TENURED> kAllocateTenuredOperator;
578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
579f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  struct EnsureWritableFastElementsOperator final : public Operator {
580f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    EnsureWritableFastElementsOperator()
581f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        : Operator(                                     // --
582f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              IrOpcode::kEnsureWritableFastElements,    // opcode
583f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              Operator::kNoDeopt | Operator::kNoThrow,  // flags
584f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              "EnsureWritableFastElements",             // name
585f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              2, 1, 1, 1, 1, 0) {}                      // counts
586f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
587f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EnsureWritableFastElementsOperator kEnsureWritableFastElements;
588f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
589f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define SPECULATIVE_NUMBER_BINOP(Name)                                      \
590f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  template <NumberOperationHint kHint>                                      \
591f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  struct Name##Operator final : public Operator1<NumberOperationHint> {     \
592f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Name##Operator()                                                        \
593f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        : Operator1<NumberOperationHint>(                                   \
594f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              IrOpcode::k##Name, Operator::kFoldable | Operator::kNoThrow,  \
595f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              #Name, 2, 1, 1, 1, 1, 0, kHint) {}                            \
596f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };                                                                        \
597f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Name##Operator<NumberOperationHint::kSignedSmall>                         \
598f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      k##Name##SignedSmallOperator;                                         \
599f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Name##Operator<NumberOperationHint::kSigned32> k##Name##Signed32Operator; \
600f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Name##Operator<NumberOperationHint::kNumber> k##Name##NumberOperator;     \
601f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Name##Operator<NumberOperationHint::kNumberOrOddball>                     \
602f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      k##Name##NumberOrOddballOperator;
603f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  SPECULATIVE_NUMBER_BINOP_LIST(SPECULATIVE_NUMBER_BINOP)
604f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#undef SPECULATIVE_NUMBER_BINOP
605f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define BUFFER_ACCESS(Type, type, TYPE, ctype, size)                          \
607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct LoadBuffer##Type##Operator final : public Operator1<BufferAccess> {  \
608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    LoadBuffer##Type##Operator()                                              \
60913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        : Operator1<BufferAccess>(                                            \
61013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              IrOpcode::kLoadBuffer,                                          \
61113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              Operator::kNoDeopt | Operator::kNoThrow | Operator::kNoWrite,   \
61213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              "LoadBuffer", 3, 1, 1, 1, 1, 0,                                 \
61313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              BufferAccess(kExternal##Type##Array)) {}                        \
614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  };                                                                          \
615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct StoreBuffer##Type##Operator final : public Operator1<BufferAccess> { \
616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    StoreBuffer##Type##Operator()                                             \
61713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        : Operator1<BufferAccess>(                                            \
61813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              IrOpcode::kStoreBuffer,                                         \
61913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              Operator::kNoDeopt | Operator::kNoRead | Operator::kNoThrow,    \
62013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              "StoreBuffer", 4, 1, 1, 0, 1, 0,                                \
62113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              BufferAccess(kExternal##Type##Array)) {}                        \
622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  };                                                                          \
623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LoadBuffer##Type##Operator kLoadBuffer##Type;                               \
624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  StoreBuffer##Type##Operator kStoreBuffer##Type;
625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TYPED_ARRAYS(BUFFER_ACCESS)
626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef BUFFER_ACCESS
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstatic base::LazyInstance<SimplifiedOperatorGlobalCache>::type kCache =
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LAZY_INSTANCE_INITIALIZER;
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSimplifiedOperatorBuilder::SimplifiedOperatorBuilder(Zone* zone)
635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    : cache_(kCache.Get()), zone_(zone) {}
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
637f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define GET_FROM_CACHE(Name, ...) \
638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const Operator* SimplifiedOperatorBuilder::Name() { return &cache_.k##Name; }
639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochPURE_OP_LIST(GET_FROM_CACHE)
64013e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochCHECKED_OP_LIST(GET_FROM_CACHE)
641f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochGET_FROM_CACHE(ArrayBufferWasNeutered)
64213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#undef GET_FROM_CACHE
64313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
644f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Operator* SimplifiedOperatorBuilder::CheckedInt32Mul(
645f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CheckForMinusZeroMode mode) {
646f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  switch (mode) {
647f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckForMinusZeroMode::kCheckForMinusZero:
648f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return &cache_.kCheckedInt32MulCheckForMinusZeroOperator;
649f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckForMinusZeroMode::kDontCheckForMinusZero:
650f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return &cache_.kCheckedInt32MulDontCheckForMinusZeroOperator;
651f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
652f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  UNREACHABLE();
653f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return nullptr;
654f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
655f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
656f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Operator* SimplifiedOperatorBuilder::CheckedFloat64ToInt32(
657f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CheckForMinusZeroMode mode) {
658f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  switch (mode) {
659f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckForMinusZeroMode::kCheckForMinusZero:
660f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return &cache_.kCheckedFloat64ToInt32CheckForMinusZeroOperator;
661f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckForMinusZeroMode::kDontCheckForMinusZero:
662f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return &cache_.kCheckedFloat64ToInt32DontCheckForMinusZeroOperator;
66313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
66413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  UNREACHABLE();
66513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return nullptr;
66613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
66713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
668f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Operator* SimplifiedOperatorBuilder::CheckedTaggedToInt32(
669f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CheckForMinusZeroMode mode) {
67013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  switch (mode) {
671f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckForMinusZeroMode::kCheckForMinusZero:
672f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return &cache_.kCheckedTaggedToInt32CheckForMinusZeroOperator;
673f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckForMinusZeroMode::kDontCheckForMinusZero:
674f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return &cache_.kCheckedTaggedToInt32DontCheckForMinusZeroOperator;
67513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
67613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  UNREACHABLE();
67713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return nullptr;
67813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
680f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Operator* SimplifiedOperatorBuilder::CheckedTaggedToFloat64(
681f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CheckTaggedInputMode mode) {
682f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  switch (mode) {
683f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckTaggedInputMode::kNumber:
684f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return &cache_.kCheckedTaggedToFloat64NumberOperator;
685f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckTaggedInputMode::kNumberOrOddball:
686f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return &cache_.kCheckedTaggedToFloat64NumberOrOddballOperator;
687f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
688f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  UNREACHABLE();
689f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return nullptr;
690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
692f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Operator* SimplifiedOperatorBuilder::CheckMaps(int map_input_count) {
693f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // TODO(bmeurer): Cache the most important versions of this operator.
694f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK_LT(0, map_input_count);
695f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  int const value_input_count = 1 + map_input_count;
696f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return new (zone()) Operator1<int>(           // --
697f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      IrOpcode::kCheckMaps,                     // opcode
698f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Operator::kNoThrow | Operator::kNoWrite,  // flags
699f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      "CheckMaps",                              // name
700f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      value_input_count, 1, 1, 0, 1, 0,         // counts
701f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      map_input_count);                         // parameter
70213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
70313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
704f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Operator* SimplifiedOperatorBuilder::CheckFloat64Hole(
705f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CheckFloat64HoleMode mode) {
706f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  switch (mode) {
707f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckFloat64HoleMode::kAllowReturnHole:
708f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return &cache_.kCheckFloat64HoleAllowReturnHoleOperator;
709f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CheckFloat64HoleMode::kNeverReturnHole:
710f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return &cache_.kCheckFloat64HoleNeverReturnHoleOperator;
711f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
712f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  UNREACHABLE();
713f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return nullptr;
714f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
715bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
716f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Operator* SimplifiedOperatorBuilder::EnsureWritableFastElements() {
717f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return &cache_.kEnsureWritableFastElements;
718f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
719f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
720f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Operator* SimplifiedOperatorBuilder::MaybeGrowFastElements(
721f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    GrowFastElementsFlags flags) {
722f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return new (zone()) Operator1<GrowFastElementsFlags>(  // --
723f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      IrOpcode::kMaybeGrowFastElements,                  // opcode
724f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Operator::kNoThrow,                                // flags
725f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      "MaybeGrowFastElements",                           // name
726f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      4, 1, 1, 1, 1, 0,                                  // counts
727f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      flags);                                            // parameter
728f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
729f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
730f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochconst Operator* SimplifiedOperatorBuilder::TransitionElementsKind(
731f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ElementsTransition transition) {
732f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return new (zone()) Operator1<ElementsTransition>(  // --
733f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      IrOpcode::kTransitionElementsKind,              // opcode
734f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Operator::kNoDeopt | Operator::kNoThrow,        // flags
735f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      "TransitionElementsKind",                       // name
736f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      3, 1, 1, 0, 1, 0,                               // counts
737f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      transition);                                    // parameter
738bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator* SimplifiedOperatorBuilder::Allocate(PretenureFlag pretenure) {
741bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  switch (pretenure) {
742bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    case NOT_TENURED:
743bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      return &cache_.kAllocateNotTenuredOperator;
744bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    case TENURED:
745bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      return &cache_.kAllocateTenuredOperator;
746bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
747bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  UNREACHABLE();
748bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return nullptr;
749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst Operator* SimplifiedOperatorBuilder::LoadBuffer(BufferAccess access) {
753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (access.external_array_type()) {
754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define LOAD_BUFFER(Type, type, TYPE, ctype, size) \
755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  case kExternal##Type##Array:                     \
756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return &cache_.kLoadBuffer##Type;
757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    TYPED_ARRAYS(LOAD_BUFFER)
758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef LOAD_BUFFER
759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNREACHABLE();
761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return nullptr;
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst Operator* SimplifiedOperatorBuilder::StoreBuffer(BufferAccess access) {
766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (access.external_array_type()) {
767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define STORE_BUFFER(Type, type, TYPE, ctype, size) \
768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  case kExternal##Type##Array:                      \
769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return &cache_.kStoreBuffer##Type;
770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    TYPED_ARRAYS(STORE_BUFFER)
771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef STORE_BUFFER
772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNREACHABLE();
774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return nullptr;
775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
777f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochconst Operator* SimplifiedOperatorBuilder::StringFromCodePoint(
778f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    UnicodeEncoding encoding) {
779f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  switch (encoding) {
780f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    case UnicodeEncoding::UTF16:
781f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      return &cache_.kStringFromCodePointOperatorUTF16;
782f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    case UnicodeEncoding::UTF32:
783f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      return &cache_.kStringFromCodePointOperatorUTF32;
784f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
785f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  UNREACHABLE();
786f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return nullptr;
787f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
788f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
789f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define SPECULATIVE_NUMBER_BINOP(Name)                                        \
790f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  const Operator* SimplifiedOperatorBuilder::Name(NumberOperationHint hint) { \
791f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    switch (hint) {                                                           \
792f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case NumberOperationHint::kSignedSmall:                                 \
793f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return &cache_.k##Name##SignedSmallOperator;                          \
794f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case NumberOperationHint::kSigned32:                                    \
795f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return &cache_.k##Name##Signed32Operator;                             \
796f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case NumberOperationHint::kNumber:                                      \
797f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return &cache_.k##Name##NumberOperator;                               \
798f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      case NumberOperationHint::kNumberOrOddball:                             \
799f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        return &cache_.k##Name##NumberOrOddballOperator;                      \
800f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }                                                                         \
801f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    UNREACHABLE();                                                            \
802f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    return nullptr;                                                           \
80313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
804f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochSPECULATIVE_NUMBER_BINOP_LIST(SPECULATIVE_NUMBER_BINOP)
805f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#undef SPECULATIVE_NUMBER_BINOP
806f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
807f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define ACCESS_OP_LIST(V)                                             \
808f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(LoadField, FieldAccess, Operator::kNoWrite, 1, 1, 1)              \
809f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(StoreField, FieldAccess, Operator::kNoRead, 2, 1, 0)              \
810f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(LoadElement, ElementAccess, Operator::kNoWrite, 2, 1, 1)          \
811f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(StoreElement, ElementAccess, Operator::kNoRead, 3, 1, 0)          \
812f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(LoadTypedElement, ExternalArrayType, Operator::kNoWrite, 4, 1, 1) \
813f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(StoreTypedElement, ExternalArrayType, Operator::kNoRead, 5, 1, 0)
814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define ACCESS(Name, Type, properties, value_input_count, control_input_count, \
816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier               output_count)                                                   \
817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const Operator* SimplifiedOperatorBuilder::Name(const Type& access) {        \
818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return new (zone())                                                        \
81913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        Operator1<Type>(IrOpcode::k##Name,                                     \
82013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                        Operator::kNoDeopt | Operator::kNoThrow | properties,  \
821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                        #Name, value_input_count, 1, control_input_count,      \
822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                        output_count, 1, 0, access);                           \
823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESS_OP_LIST(ACCESS)
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef ACCESS
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace compiler
828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace internal
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
830