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