5#ifndef V8_COMPILER_OPERATOR_H_
6#define V8_COMPILER_OPERATOR_H_
41 kCommutative = 1 << 0,
42 kAssociative = 1 << 1,
49 kFoldable = kNoRead | kNoWrite,
50 kEliminatable = kNoDeopt | kNoWrite | kNoThrow,
51 kKontrol = kNoDeopt | kFoldable | kNoThrow,
52 kPure = kKontrol | kIdempotent
56#define OPERATOR_PROPERTY_LIST(V) \
58 V(Associative) V(Idempotent) V(NoRead) V(NoWrite) V(NoThrow) V(NoDeopt)
64 Operator(
Opcode opcode, Properties properties,
const char* mnemonic,
65 size_t value_in,
size_t effect_in,
size_t control_in,
66 size_t value_out,
size_t effect_out,
size_t control_out);
79 const char*
mnemonic()
const {
return mnemonic_; }
85 return this->opcode() == that->opcode();
95 return (properties() & property) ==
property;
110 return (properties & kEliminatable) == kEliminatable ? 0 : 1;
114 return (properties & kNoThrow) == kNoThrow ? 0 : 2;
118 return (properties & kPure) == kPure ? 0 : 1;
129 return PrintToImpl(os, verbose);
132 void PrintPropsTo(std::ostream& os)
const;
135 virtual void PrintToImpl(std::ostream& os, PrintVerbosity verbose)
const;
166template <
typename T,
typename Pred = OpEqualTo<T>,
typename Hash = OpHash<T>>
170 size_t value_in,
size_t effect_in,
size_t control_in,
171 size_t value_out,
size_t effect_out,
size_t control_out,
174 value_out, effect_out, control_out),
182 if (
opcode() != other->opcode())
return false;
#define DEFINE_OPERATORS_FOR_FLAGS(Type)
virtual void PrintParameter(std::ostream &os, PrintVerbosity verbose) const
void PrintToImpl(std::ostream &os, PrintVerbosity verbose) const override
size_t HashCode() const final
Operator1(Opcode opcode, Properties properties, const char *mnemonic, size_t value_in, size_t effect_in, size_t control_in, size_t value_out, size_t effect_out, size_t control_out, T parameter, Pred const &pred=Pred(), Hash const &hash=Hash())
T const & parameter() const
bool Equals(const Operator *other) const final
const char * mnemonic() const
int ControlInputCount() const
int ValueInputCount() const
Properties properties() const
static size_t ZeroIfNoThrow(Properties properties)
int ValueOutputCount() const
int EffectOutputCount() const
Operator(const Operator &)=delete
bool HasProperty(Property property) const
void PrintTo(std::ostream &os, PrintVerbosity verbose=PrintVerbosity::kVerbose) const
static size_t ZeroIfEliminatable(Properties properties)
static size_t ZeroIfPure(Properties properties)
Operator & operator=(const Operator &)=delete
int ControlOutputCount() const
virtual size_t HashCode() const
int EffectInputCount() const
constexpr Opcode opcode() const
virtual bool Equals(const Operator *that) const
virtual ~Operator()=default
V8_INLINE size_t hash_combine(size_t seed, size_t hash)
T const & OpParameter(const Operator *op)
std::ostream & operator<<(std::ostream &os, AccessMode access_mode)
static uint32_t Hash(RegisteredExtension *extension)
#define NON_EXPORTED_BASE(code)
#define V8_EXPORT_PRIVATE