simplified-operator.cc revision c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7a
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