11cb0ef41Sopenharmony_ci// Copyright 2014 the V8 project authors. All rights reserved.
21cb0ef41Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be
31cb0ef41Sopenharmony_ci// found in the LICENSE file.
41cb0ef41Sopenharmony_ci
51cb0ef41Sopenharmony_ci#include "src/compiler/js-operator.h"
61cb0ef41Sopenharmony_ci
71cb0ef41Sopenharmony_ci#include <limits>
81cb0ef41Sopenharmony_ci
91cb0ef41Sopenharmony_ci#include "src/base/lazy-instance.h"
101cb0ef41Sopenharmony_ci#include "src/compiler/js-graph.h"
111cb0ef41Sopenharmony_ci#include "src/compiler/js-heap-broker.h"
121cb0ef41Sopenharmony_ci#include "src/compiler/node-matchers.h"
131cb0ef41Sopenharmony_ci#include "src/compiler/operator.h"
141cb0ef41Sopenharmony_ci#include "src/handles/handles-inl.h"
151cb0ef41Sopenharmony_ci#include "src/objects/objects-inl.h"
161cb0ef41Sopenharmony_ci#include "src/objects/template-objects.h"
171cb0ef41Sopenharmony_ci
181cb0ef41Sopenharmony_cinamespace v8 {
191cb0ef41Sopenharmony_cinamespace internal {
201cb0ef41Sopenharmony_cinamespace compiler {
211cb0ef41Sopenharmony_ci
221cb0ef41Sopenharmony_cinamespace {
231cb0ef41Sopenharmony_ci
241cb0ef41Sopenharmony_ci// Returns properties for the given binary op.
251cb0ef41Sopenharmony_ciconstexpr Operator::Properties BinopProperties(Operator::Opcode opcode) {
261cb0ef41Sopenharmony_ci  DCHECK(JSOperator::IsBinaryWithFeedback(opcode));
271cb0ef41Sopenharmony_ci  return opcode == IrOpcode::kJSStrictEqual ? Operator::kPure
281cb0ef41Sopenharmony_ci                                            : Operator::kNoProperties;
291cb0ef41Sopenharmony_ci}
301cb0ef41Sopenharmony_ci
311cb0ef41Sopenharmony_citemplate <class T>
321cb0ef41Sopenharmony_ciAddress AddressOrNull(base::Optional<T> ref) {
331cb0ef41Sopenharmony_ci  if (!ref.has_value()) return kNullAddress;
341cb0ef41Sopenharmony_ci  return ref->object().address();
351cb0ef41Sopenharmony_ci}
361cb0ef41Sopenharmony_ci
371cb0ef41Sopenharmony_ci}  // namespace
381cb0ef41Sopenharmony_ci
391cb0ef41Sopenharmony_cinamespace js_node_wrapper_utils {
401cb0ef41Sopenharmony_ci
411cb0ef41Sopenharmony_ciTNode<Oddball> UndefinedConstant(JSGraph* jsgraph) {
421cb0ef41Sopenharmony_ci  return TNode<Oddball>::UncheckedCast(jsgraph->UndefinedConstant());
431cb0ef41Sopenharmony_ci}
441cb0ef41Sopenharmony_ci
451cb0ef41Sopenharmony_ci}  // namespace js_node_wrapper_utils
461cb0ef41Sopenharmony_ci
471cb0ef41Sopenharmony_ciFeedbackCellRef JSCreateClosureNode::GetFeedbackCellRefChecked(
481cb0ef41Sopenharmony_ci    JSHeapBroker* broker) const {
491cb0ef41Sopenharmony_ci  HeapObjectMatcher m(feedback_cell());
501cb0ef41Sopenharmony_ci  CHECK(m.HasResolvedValue());
511cb0ef41Sopenharmony_ci  return MakeRef(broker, Handle<FeedbackCell>::cast(m.ResolvedValue()));
521cb0ef41Sopenharmony_ci}
531cb0ef41Sopenharmony_ci
541cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CallFrequency const& f) {
551cb0ef41Sopenharmony_ci  if (f.IsUnknown()) return os << "unknown";
561cb0ef41Sopenharmony_ci  return os << f.value();
571cb0ef41Sopenharmony_ci}
581cb0ef41Sopenharmony_ci
591cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os,
601cb0ef41Sopenharmony_ci                         ConstructForwardVarargsParameters const& p) {
611cb0ef41Sopenharmony_ci  return os << p.arity() << ", " << p.start_index();
621cb0ef41Sopenharmony_ci}
631cb0ef41Sopenharmony_ci
641cb0ef41Sopenharmony_ciConstructForwardVarargsParameters const& ConstructForwardVarargsParametersOf(
651cb0ef41Sopenharmony_ci    Operator const* op) {
661cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSConstructForwardVarargs, op->opcode());
671cb0ef41Sopenharmony_ci  return OpParameter<ConstructForwardVarargsParameters>(op);
681cb0ef41Sopenharmony_ci}
691cb0ef41Sopenharmony_ci
701cb0ef41Sopenharmony_cibool operator==(ConstructParameters const& lhs,
711cb0ef41Sopenharmony_ci                ConstructParameters const& rhs) {
721cb0ef41Sopenharmony_ci  return lhs.arity() == rhs.arity() && lhs.frequency() == rhs.frequency() &&
731cb0ef41Sopenharmony_ci         lhs.feedback() == rhs.feedback();
741cb0ef41Sopenharmony_ci}
751cb0ef41Sopenharmony_ci
761cb0ef41Sopenharmony_cibool operator!=(ConstructParameters const& lhs,
771cb0ef41Sopenharmony_ci                ConstructParameters const& rhs) {
781cb0ef41Sopenharmony_ci  return !(lhs == rhs);
791cb0ef41Sopenharmony_ci}
801cb0ef41Sopenharmony_ci
811cb0ef41Sopenharmony_cisize_t hash_value(ConstructParameters const& p) {
821cb0ef41Sopenharmony_ci  return base::hash_combine(p.arity(), p.frequency(),
831cb0ef41Sopenharmony_ci                            FeedbackSource::Hash()(p.feedback()));
841cb0ef41Sopenharmony_ci}
851cb0ef41Sopenharmony_ci
861cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, ConstructParameters const& p) {
871cb0ef41Sopenharmony_ci  return os << p.arity() << ", " << p.frequency();
881cb0ef41Sopenharmony_ci}
891cb0ef41Sopenharmony_ci
901cb0ef41Sopenharmony_ciConstructParameters const& ConstructParametersOf(Operator const* op) {
911cb0ef41Sopenharmony_ci  DCHECK(op->opcode() == IrOpcode::kJSConstruct ||
921cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSConstructWithArrayLike ||
931cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSConstructWithSpread);
941cb0ef41Sopenharmony_ci  return OpParameter<ConstructParameters>(op);
951cb0ef41Sopenharmony_ci}
961cb0ef41Sopenharmony_ci
971cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CallParameters const& p) {
981cb0ef41Sopenharmony_ci  return os << p.arity() << ", " << p.frequency() << ", " << p.convert_mode()
991cb0ef41Sopenharmony_ci            << ", " << p.speculation_mode() << ", " << p.feedback_relation();
1001cb0ef41Sopenharmony_ci}
1011cb0ef41Sopenharmony_ci
1021cb0ef41Sopenharmony_ciconst CallParameters& CallParametersOf(const Operator* op) {
1031cb0ef41Sopenharmony_ci  DCHECK(op->opcode() == IrOpcode::kJSCall ||
1041cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSCallWithArrayLike ||
1051cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSCallWithSpread);
1061cb0ef41Sopenharmony_ci  return OpParameter<CallParameters>(op);
1071cb0ef41Sopenharmony_ci}
1081cb0ef41Sopenharmony_ci
1091cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os,
1101cb0ef41Sopenharmony_ci                         CallForwardVarargsParameters const& p) {
1111cb0ef41Sopenharmony_ci  return os << p.arity() << ", " << p.start_index();
1121cb0ef41Sopenharmony_ci}
1131cb0ef41Sopenharmony_ci
1141cb0ef41Sopenharmony_ciCallForwardVarargsParameters const& CallForwardVarargsParametersOf(
1151cb0ef41Sopenharmony_ci    Operator const* op) {
1161cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSCallForwardVarargs, op->opcode());
1171cb0ef41Sopenharmony_ci  return OpParameter<CallForwardVarargsParameters>(op);
1181cb0ef41Sopenharmony_ci}
1191cb0ef41Sopenharmony_ci
1201cb0ef41Sopenharmony_ci
1211cb0ef41Sopenharmony_cibool operator==(CallRuntimeParameters const& lhs,
1221cb0ef41Sopenharmony_ci                CallRuntimeParameters const& rhs) {
1231cb0ef41Sopenharmony_ci  return lhs.id() == rhs.id() && lhs.arity() == rhs.arity();
1241cb0ef41Sopenharmony_ci}
1251cb0ef41Sopenharmony_ci
1261cb0ef41Sopenharmony_ci
1271cb0ef41Sopenharmony_cibool operator!=(CallRuntimeParameters const& lhs,
1281cb0ef41Sopenharmony_ci                CallRuntimeParameters const& rhs) {
1291cb0ef41Sopenharmony_ci  return !(lhs == rhs);
1301cb0ef41Sopenharmony_ci}
1311cb0ef41Sopenharmony_ci
1321cb0ef41Sopenharmony_ci
1331cb0ef41Sopenharmony_cisize_t hash_value(CallRuntimeParameters const& p) {
1341cb0ef41Sopenharmony_ci  return base::hash_combine(p.id(), p.arity());
1351cb0ef41Sopenharmony_ci}
1361cb0ef41Sopenharmony_ci
1371cb0ef41Sopenharmony_ci
1381cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CallRuntimeParameters const& p) {
1391cb0ef41Sopenharmony_ci  return os << p.id() << ", " << p.arity();
1401cb0ef41Sopenharmony_ci}
1411cb0ef41Sopenharmony_ci
1421cb0ef41Sopenharmony_ci
1431cb0ef41Sopenharmony_ciconst CallRuntimeParameters& CallRuntimeParametersOf(const Operator* op) {
1441cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSCallRuntime, op->opcode());
1451cb0ef41Sopenharmony_ci  return OpParameter<CallRuntimeParameters>(op);
1461cb0ef41Sopenharmony_ci}
1471cb0ef41Sopenharmony_ci
1481cb0ef41Sopenharmony_ci
1491cb0ef41Sopenharmony_ciContextAccess::ContextAccess(size_t depth, size_t index, bool immutable)
1501cb0ef41Sopenharmony_ci    : immutable_(immutable),
1511cb0ef41Sopenharmony_ci      depth_(static_cast<uint16_t>(depth)),
1521cb0ef41Sopenharmony_ci      index_(static_cast<uint32_t>(index)) {
1531cb0ef41Sopenharmony_ci  DCHECK(depth <= std::numeric_limits<uint16_t>::max());
1541cb0ef41Sopenharmony_ci  DCHECK(index <= std::numeric_limits<uint32_t>::max());
1551cb0ef41Sopenharmony_ci}
1561cb0ef41Sopenharmony_ci
1571cb0ef41Sopenharmony_ci
1581cb0ef41Sopenharmony_cibool operator==(ContextAccess const& lhs, ContextAccess const& rhs) {
1591cb0ef41Sopenharmony_ci  return lhs.depth() == rhs.depth() && lhs.index() == rhs.index() &&
1601cb0ef41Sopenharmony_ci         lhs.immutable() == rhs.immutable();
1611cb0ef41Sopenharmony_ci}
1621cb0ef41Sopenharmony_ci
1631cb0ef41Sopenharmony_ci
1641cb0ef41Sopenharmony_cibool operator!=(ContextAccess const& lhs, ContextAccess const& rhs) {
1651cb0ef41Sopenharmony_ci  return !(lhs == rhs);
1661cb0ef41Sopenharmony_ci}
1671cb0ef41Sopenharmony_ci
1681cb0ef41Sopenharmony_ci
1691cb0ef41Sopenharmony_cisize_t hash_value(ContextAccess const& access) {
1701cb0ef41Sopenharmony_ci  return base::hash_combine(access.depth(), access.index(), access.immutable());
1711cb0ef41Sopenharmony_ci}
1721cb0ef41Sopenharmony_ci
1731cb0ef41Sopenharmony_ci
1741cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, ContextAccess const& access) {
1751cb0ef41Sopenharmony_ci  return os << access.depth() << ", " << access.index() << ", "
1761cb0ef41Sopenharmony_ci            << access.immutable();
1771cb0ef41Sopenharmony_ci}
1781cb0ef41Sopenharmony_ci
1791cb0ef41Sopenharmony_ci
1801cb0ef41Sopenharmony_ciContextAccess const& ContextAccessOf(Operator const* op) {
1811cb0ef41Sopenharmony_ci  DCHECK(op->opcode() == IrOpcode::kJSLoadContext ||
1821cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSStoreContext);
1831cb0ef41Sopenharmony_ci  return OpParameter<ContextAccess>(op);
1841cb0ef41Sopenharmony_ci}
1851cb0ef41Sopenharmony_ci
1861cb0ef41Sopenharmony_cibool operator==(CreateFunctionContextParameters const& lhs,
1871cb0ef41Sopenharmony_ci                CreateFunctionContextParameters const& rhs) {
1881cb0ef41Sopenharmony_ci  return lhs.scope_info_.object().location() ==
1891cb0ef41Sopenharmony_ci             rhs.scope_info_.object().location() &&
1901cb0ef41Sopenharmony_ci         lhs.slot_count() == rhs.slot_count() &&
1911cb0ef41Sopenharmony_ci         lhs.scope_type() == rhs.scope_type();
1921cb0ef41Sopenharmony_ci}
1931cb0ef41Sopenharmony_ci
1941cb0ef41Sopenharmony_cibool operator!=(CreateFunctionContextParameters const& lhs,
1951cb0ef41Sopenharmony_ci                CreateFunctionContextParameters const& rhs) {
1961cb0ef41Sopenharmony_ci  return !(lhs == rhs);
1971cb0ef41Sopenharmony_ci}
1981cb0ef41Sopenharmony_ci
1991cb0ef41Sopenharmony_cisize_t hash_value(CreateFunctionContextParameters const& parameters) {
2001cb0ef41Sopenharmony_ci  return base::hash_combine(parameters.scope_info_.object().location(),
2011cb0ef41Sopenharmony_ci                            parameters.slot_count(),
2021cb0ef41Sopenharmony_ci                            static_cast<int>(parameters.scope_type()));
2031cb0ef41Sopenharmony_ci}
2041cb0ef41Sopenharmony_ci
2051cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os,
2061cb0ef41Sopenharmony_ci                         CreateFunctionContextParameters const& parameters) {
2071cb0ef41Sopenharmony_ci  return os << parameters.slot_count() << ", " << parameters.scope_type();
2081cb0ef41Sopenharmony_ci}
2091cb0ef41Sopenharmony_ci
2101cb0ef41Sopenharmony_ciCreateFunctionContextParameters const& CreateFunctionContextParametersOf(
2111cb0ef41Sopenharmony_ci    Operator const* op) {
2121cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSCreateFunctionContext, op->opcode());
2131cb0ef41Sopenharmony_ci  return OpParameter<CreateFunctionContextParameters>(op);
2141cb0ef41Sopenharmony_ci}
2151cb0ef41Sopenharmony_ci
2161cb0ef41Sopenharmony_cibool operator==(DefineNamedOwnPropertyParameters const& lhs,
2171cb0ef41Sopenharmony_ci                DefineNamedOwnPropertyParameters const& rhs) {
2181cb0ef41Sopenharmony_ci  return lhs.name_.object().location() == rhs.name_.object().location() &&
2191cb0ef41Sopenharmony_ci         lhs.feedback() == rhs.feedback();
2201cb0ef41Sopenharmony_ci}
2211cb0ef41Sopenharmony_ci
2221cb0ef41Sopenharmony_cibool operator!=(DefineNamedOwnPropertyParameters const& lhs,
2231cb0ef41Sopenharmony_ci                DefineNamedOwnPropertyParameters const& rhs) {
2241cb0ef41Sopenharmony_ci  return !(lhs == rhs);
2251cb0ef41Sopenharmony_ci}
2261cb0ef41Sopenharmony_ci
2271cb0ef41Sopenharmony_cisize_t hash_value(DefineNamedOwnPropertyParameters const& p) {
2281cb0ef41Sopenharmony_ci  return base::hash_combine(p.name_.object().location(),
2291cb0ef41Sopenharmony_ci                            FeedbackSource::Hash()(p.feedback()));
2301cb0ef41Sopenharmony_ci}
2311cb0ef41Sopenharmony_ci
2321cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os,
2331cb0ef41Sopenharmony_ci                         DefineNamedOwnPropertyParameters const& p) {
2341cb0ef41Sopenharmony_ci  return os << Brief(*p.name_.object());
2351cb0ef41Sopenharmony_ci}
2361cb0ef41Sopenharmony_ci
2371cb0ef41Sopenharmony_ciDefineNamedOwnPropertyParameters const& DefineNamedOwnPropertyParametersOf(
2381cb0ef41Sopenharmony_ci    const Operator* op) {
2391cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSDefineNamedOwnProperty, op->opcode());
2401cb0ef41Sopenharmony_ci  return OpParameter<DefineNamedOwnPropertyParameters>(op);
2411cb0ef41Sopenharmony_ci}
2421cb0ef41Sopenharmony_ci
2431cb0ef41Sopenharmony_cibool operator==(FeedbackParameter const& lhs, FeedbackParameter const& rhs) {
2441cb0ef41Sopenharmony_ci  return lhs.feedback() == rhs.feedback();
2451cb0ef41Sopenharmony_ci}
2461cb0ef41Sopenharmony_ci
2471cb0ef41Sopenharmony_cibool operator!=(FeedbackParameter const& lhs, FeedbackParameter const& rhs) {
2481cb0ef41Sopenharmony_ci  return !(lhs == rhs);
2491cb0ef41Sopenharmony_ci}
2501cb0ef41Sopenharmony_ci
2511cb0ef41Sopenharmony_cisize_t hash_value(FeedbackParameter const& p) {
2521cb0ef41Sopenharmony_ci  return FeedbackSource::Hash()(p.feedback());
2531cb0ef41Sopenharmony_ci}
2541cb0ef41Sopenharmony_ci
2551cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, FeedbackParameter const& p) {
2561cb0ef41Sopenharmony_ci  return os << p.feedback();
2571cb0ef41Sopenharmony_ci}
2581cb0ef41Sopenharmony_ci
2591cb0ef41Sopenharmony_ciFeedbackParameter const& FeedbackParameterOf(const Operator* op) {
2601cb0ef41Sopenharmony_ci  DCHECK(JSOperator::IsUnaryWithFeedback(op->opcode()) ||
2611cb0ef41Sopenharmony_ci         JSOperator::IsBinaryWithFeedback(op->opcode()) ||
2621cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSCreateEmptyLiteralArray ||
2631cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSInstanceOf ||
2641cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSDefineKeyedOwnPropertyInLiteral ||
2651cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSStoreInArrayLiteral);
2661cb0ef41Sopenharmony_ci  return OpParameter<FeedbackParameter>(op);
2671cb0ef41Sopenharmony_ci}
2681cb0ef41Sopenharmony_ci
2691cb0ef41Sopenharmony_cibool operator==(NamedAccess const& lhs, NamedAccess const& rhs) {
2701cb0ef41Sopenharmony_ci  return lhs.name_.object().location() == rhs.name_.object().location() &&
2711cb0ef41Sopenharmony_ci         lhs.language_mode() == rhs.language_mode() &&
2721cb0ef41Sopenharmony_ci         lhs.feedback() == rhs.feedback();
2731cb0ef41Sopenharmony_ci}
2741cb0ef41Sopenharmony_ci
2751cb0ef41Sopenharmony_ci
2761cb0ef41Sopenharmony_cibool operator!=(NamedAccess const& lhs, NamedAccess const& rhs) {
2771cb0ef41Sopenharmony_ci  return !(lhs == rhs);
2781cb0ef41Sopenharmony_ci}
2791cb0ef41Sopenharmony_ci
2801cb0ef41Sopenharmony_ci
2811cb0ef41Sopenharmony_cisize_t hash_value(NamedAccess const& p) {
2821cb0ef41Sopenharmony_ci  return base::hash_combine(p.name_.object().location(), p.language_mode(),
2831cb0ef41Sopenharmony_ci                            FeedbackSource::Hash()(p.feedback()));
2841cb0ef41Sopenharmony_ci}
2851cb0ef41Sopenharmony_ci
2861cb0ef41Sopenharmony_ci
2871cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, NamedAccess const& p) {
2881cb0ef41Sopenharmony_ci  return os << Brief(*p.name_.object()) << ", " << p.language_mode();
2891cb0ef41Sopenharmony_ci}
2901cb0ef41Sopenharmony_ci
2911cb0ef41Sopenharmony_ci
2921cb0ef41Sopenharmony_ciNamedAccess const& NamedAccessOf(const Operator* op) {
2931cb0ef41Sopenharmony_ci  DCHECK(op->opcode() == IrOpcode::kJSLoadNamed ||
2941cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSLoadNamedFromSuper ||
2951cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSSetNamedProperty);
2961cb0ef41Sopenharmony_ci  return OpParameter<NamedAccess>(op);
2971cb0ef41Sopenharmony_ci}
2981cb0ef41Sopenharmony_ci
2991cb0ef41Sopenharmony_ci
3001cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, PropertyAccess const& p) {
3011cb0ef41Sopenharmony_ci  return os << p.language_mode() << ", " << p.feedback();
3021cb0ef41Sopenharmony_ci}
3031cb0ef41Sopenharmony_ci
3041cb0ef41Sopenharmony_ci
3051cb0ef41Sopenharmony_cibool operator==(PropertyAccess const& lhs, PropertyAccess const& rhs) {
3061cb0ef41Sopenharmony_ci  return lhs.language_mode() == rhs.language_mode() &&
3071cb0ef41Sopenharmony_ci         lhs.feedback() == rhs.feedback();
3081cb0ef41Sopenharmony_ci}
3091cb0ef41Sopenharmony_ci
3101cb0ef41Sopenharmony_ci
3111cb0ef41Sopenharmony_cibool operator!=(PropertyAccess const& lhs, PropertyAccess const& rhs) {
3121cb0ef41Sopenharmony_ci  return !(lhs == rhs);
3131cb0ef41Sopenharmony_ci}
3141cb0ef41Sopenharmony_ci
3151cb0ef41Sopenharmony_ci
3161cb0ef41Sopenharmony_ciPropertyAccess const& PropertyAccessOf(const Operator* op) {
3171cb0ef41Sopenharmony_ci  DCHECK(op->opcode() == IrOpcode::kJSHasProperty ||
3181cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSLoadProperty ||
3191cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSSetKeyedProperty ||
3201cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSDefineKeyedOwnProperty);
3211cb0ef41Sopenharmony_ci  return OpParameter<PropertyAccess>(op);
3221cb0ef41Sopenharmony_ci}
3231cb0ef41Sopenharmony_ci
3241cb0ef41Sopenharmony_ci
3251cb0ef41Sopenharmony_cisize_t hash_value(PropertyAccess const& p) {
3261cb0ef41Sopenharmony_ci  return base::hash_combine(p.language_mode(),
3271cb0ef41Sopenharmony_ci                            FeedbackSource::Hash()(p.feedback()));
3281cb0ef41Sopenharmony_ci}
3291cb0ef41Sopenharmony_ci
3301cb0ef41Sopenharmony_ci
3311cb0ef41Sopenharmony_cibool operator==(LoadGlobalParameters const& lhs,
3321cb0ef41Sopenharmony_ci                LoadGlobalParameters const& rhs) {
3331cb0ef41Sopenharmony_ci  return lhs.name_.object().location() == rhs.name_.object().location() &&
3341cb0ef41Sopenharmony_ci         lhs.feedback() == rhs.feedback() &&
3351cb0ef41Sopenharmony_ci         lhs.typeof_mode() == rhs.typeof_mode();
3361cb0ef41Sopenharmony_ci}
3371cb0ef41Sopenharmony_ci
3381cb0ef41Sopenharmony_ci
3391cb0ef41Sopenharmony_cibool operator!=(LoadGlobalParameters const& lhs,
3401cb0ef41Sopenharmony_ci                LoadGlobalParameters const& rhs) {
3411cb0ef41Sopenharmony_ci  return !(lhs == rhs);
3421cb0ef41Sopenharmony_ci}
3431cb0ef41Sopenharmony_ci
3441cb0ef41Sopenharmony_ci
3451cb0ef41Sopenharmony_cisize_t hash_value(LoadGlobalParameters const& p) {
3461cb0ef41Sopenharmony_ci  return base::hash_combine(p.name_.object().location(),
3471cb0ef41Sopenharmony_ci                            static_cast<int>(p.typeof_mode()));
3481cb0ef41Sopenharmony_ci}
3491cb0ef41Sopenharmony_ci
3501cb0ef41Sopenharmony_ci
3511cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, LoadGlobalParameters const& p) {
3521cb0ef41Sopenharmony_ci  return os << Brief(*p.name_.object()) << ", "
3531cb0ef41Sopenharmony_ci            << static_cast<int>(p.typeof_mode());
3541cb0ef41Sopenharmony_ci}
3551cb0ef41Sopenharmony_ci
3561cb0ef41Sopenharmony_ci
3571cb0ef41Sopenharmony_ciconst LoadGlobalParameters& LoadGlobalParametersOf(const Operator* op) {
3581cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSLoadGlobal, op->opcode());
3591cb0ef41Sopenharmony_ci  return OpParameter<LoadGlobalParameters>(op);
3601cb0ef41Sopenharmony_ci}
3611cb0ef41Sopenharmony_ci
3621cb0ef41Sopenharmony_ci
3631cb0ef41Sopenharmony_cibool operator==(StoreGlobalParameters const& lhs,
3641cb0ef41Sopenharmony_ci                StoreGlobalParameters const& rhs) {
3651cb0ef41Sopenharmony_ci  return lhs.language_mode() == rhs.language_mode() &&
3661cb0ef41Sopenharmony_ci         lhs.name_.object().location() == rhs.name_.object().location() &&
3671cb0ef41Sopenharmony_ci         lhs.feedback() == rhs.feedback();
3681cb0ef41Sopenharmony_ci}
3691cb0ef41Sopenharmony_ci
3701cb0ef41Sopenharmony_ci
3711cb0ef41Sopenharmony_cibool operator!=(StoreGlobalParameters const& lhs,
3721cb0ef41Sopenharmony_ci                StoreGlobalParameters const& rhs) {
3731cb0ef41Sopenharmony_ci  return !(lhs == rhs);
3741cb0ef41Sopenharmony_ci}
3751cb0ef41Sopenharmony_ci
3761cb0ef41Sopenharmony_ci
3771cb0ef41Sopenharmony_cisize_t hash_value(StoreGlobalParameters const& p) {
3781cb0ef41Sopenharmony_ci  return base::hash_combine(p.language_mode(), p.name_.object().location(),
3791cb0ef41Sopenharmony_ci                            FeedbackSource::Hash()(p.feedback()));
3801cb0ef41Sopenharmony_ci}
3811cb0ef41Sopenharmony_ci
3821cb0ef41Sopenharmony_ci
3831cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, StoreGlobalParameters const& p) {
3841cb0ef41Sopenharmony_ci  return os << p.language_mode() << ", " << Brief(*p.name_.object());
3851cb0ef41Sopenharmony_ci}
3861cb0ef41Sopenharmony_ci
3871cb0ef41Sopenharmony_ci
3881cb0ef41Sopenharmony_ciconst StoreGlobalParameters& StoreGlobalParametersOf(const Operator* op) {
3891cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSStoreGlobal, op->opcode());
3901cb0ef41Sopenharmony_ci  return OpParameter<StoreGlobalParameters>(op);
3911cb0ef41Sopenharmony_ci}
3921cb0ef41Sopenharmony_ci
3931cb0ef41Sopenharmony_ci
3941cb0ef41Sopenharmony_ciCreateArgumentsType const& CreateArgumentsTypeOf(const Operator* op) {
3951cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSCreateArguments, op->opcode());
3961cb0ef41Sopenharmony_ci  return OpParameter<CreateArgumentsType>(op);
3971cb0ef41Sopenharmony_ci}
3981cb0ef41Sopenharmony_ci
3991cb0ef41Sopenharmony_cibool operator==(CreateArrayParameters const& lhs,
4001cb0ef41Sopenharmony_ci                CreateArrayParameters const& rhs) {
4011cb0ef41Sopenharmony_ci  return lhs.arity() == rhs.arity() &&
4021cb0ef41Sopenharmony_ci         AddressOrNull(lhs.site_) == AddressOrNull(rhs.site_);
4031cb0ef41Sopenharmony_ci}
4041cb0ef41Sopenharmony_ci
4051cb0ef41Sopenharmony_ci
4061cb0ef41Sopenharmony_cibool operator!=(CreateArrayParameters const& lhs,
4071cb0ef41Sopenharmony_ci                CreateArrayParameters const& rhs) {
4081cb0ef41Sopenharmony_ci  return !(lhs == rhs);
4091cb0ef41Sopenharmony_ci}
4101cb0ef41Sopenharmony_ci
4111cb0ef41Sopenharmony_ci
4121cb0ef41Sopenharmony_cisize_t hash_value(CreateArrayParameters const& p) {
4131cb0ef41Sopenharmony_ci  return base::hash_combine(p.arity(), AddressOrNull(p.site_));
4141cb0ef41Sopenharmony_ci}
4151cb0ef41Sopenharmony_ci
4161cb0ef41Sopenharmony_ci
4171cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CreateArrayParameters const& p) {
4181cb0ef41Sopenharmony_ci  os << p.arity();
4191cb0ef41Sopenharmony_ci  if (p.site_.has_value()) {
4201cb0ef41Sopenharmony_ci    os << ", " << Brief(*p.site_->object());
4211cb0ef41Sopenharmony_ci  }
4221cb0ef41Sopenharmony_ci  return os;
4231cb0ef41Sopenharmony_ci}
4241cb0ef41Sopenharmony_ci
4251cb0ef41Sopenharmony_ciconst CreateArrayParameters& CreateArrayParametersOf(const Operator* op) {
4261cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSCreateArray, op->opcode());
4271cb0ef41Sopenharmony_ci  return OpParameter<CreateArrayParameters>(op);
4281cb0ef41Sopenharmony_ci}
4291cb0ef41Sopenharmony_ci
4301cb0ef41Sopenharmony_cibool operator==(CreateArrayIteratorParameters const& lhs,
4311cb0ef41Sopenharmony_ci                CreateArrayIteratorParameters const& rhs) {
4321cb0ef41Sopenharmony_ci  return lhs.kind() == rhs.kind();
4331cb0ef41Sopenharmony_ci}
4341cb0ef41Sopenharmony_ci
4351cb0ef41Sopenharmony_cibool operator!=(CreateArrayIteratorParameters const& lhs,
4361cb0ef41Sopenharmony_ci                CreateArrayIteratorParameters const& rhs) {
4371cb0ef41Sopenharmony_ci  return !(lhs == rhs);
4381cb0ef41Sopenharmony_ci}
4391cb0ef41Sopenharmony_ci
4401cb0ef41Sopenharmony_cisize_t hash_value(CreateArrayIteratorParameters const& p) {
4411cb0ef41Sopenharmony_ci  return static_cast<size_t>(p.kind());
4421cb0ef41Sopenharmony_ci}
4431cb0ef41Sopenharmony_ci
4441cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os,
4451cb0ef41Sopenharmony_ci                         CreateArrayIteratorParameters const& p) {
4461cb0ef41Sopenharmony_ci  return os << p.kind();
4471cb0ef41Sopenharmony_ci}
4481cb0ef41Sopenharmony_ci
4491cb0ef41Sopenharmony_ciconst CreateArrayIteratorParameters& CreateArrayIteratorParametersOf(
4501cb0ef41Sopenharmony_ci    const Operator* op) {
4511cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSCreateArrayIterator, op->opcode());
4521cb0ef41Sopenharmony_ci  return OpParameter<CreateArrayIteratorParameters>(op);
4531cb0ef41Sopenharmony_ci}
4541cb0ef41Sopenharmony_ci
4551cb0ef41Sopenharmony_cibool operator==(CreateCollectionIteratorParameters const& lhs,
4561cb0ef41Sopenharmony_ci                CreateCollectionIteratorParameters const& rhs) {
4571cb0ef41Sopenharmony_ci  return lhs.collection_kind() == rhs.collection_kind() &&
4581cb0ef41Sopenharmony_ci         lhs.iteration_kind() == rhs.iteration_kind();
4591cb0ef41Sopenharmony_ci}
4601cb0ef41Sopenharmony_ci
4611cb0ef41Sopenharmony_cibool operator!=(CreateCollectionIteratorParameters const& lhs,
4621cb0ef41Sopenharmony_ci                CreateCollectionIteratorParameters const& rhs) {
4631cb0ef41Sopenharmony_ci  return !(lhs == rhs);
4641cb0ef41Sopenharmony_ci}
4651cb0ef41Sopenharmony_ci
4661cb0ef41Sopenharmony_cisize_t hash_value(CreateCollectionIteratorParameters const& p) {
4671cb0ef41Sopenharmony_ci  return base::hash_combine(static_cast<size_t>(p.collection_kind()),
4681cb0ef41Sopenharmony_ci                            static_cast<size_t>(p.iteration_kind()));
4691cb0ef41Sopenharmony_ci}
4701cb0ef41Sopenharmony_ci
4711cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os,
4721cb0ef41Sopenharmony_ci                         CreateCollectionIteratorParameters const& p) {
4731cb0ef41Sopenharmony_ci  return os << p.collection_kind() << ", " << p.iteration_kind();
4741cb0ef41Sopenharmony_ci}
4751cb0ef41Sopenharmony_ci
4761cb0ef41Sopenharmony_ciconst CreateCollectionIteratorParameters& CreateCollectionIteratorParametersOf(
4771cb0ef41Sopenharmony_ci    const Operator* op) {
4781cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSCreateCollectionIterator, op->opcode());
4791cb0ef41Sopenharmony_ci  return OpParameter<CreateCollectionIteratorParameters>(op);
4801cb0ef41Sopenharmony_ci}
4811cb0ef41Sopenharmony_ci
4821cb0ef41Sopenharmony_cibool operator==(CreateBoundFunctionParameters const& lhs,
4831cb0ef41Sopenharmony_ci                CreateBoundFunctionParameters const& rhs) {
4841cb0ef41Sopenharmony_ci  return lhs.arity() == rhs.arity() &&
4851cb0ef41Sopenharmony_ci         lhs.map_.object().location() == rhs.map_.object().location();
4861cb0ef41Sopenharmony_ci}
4871cb0ef41Sopenharmony_ci
4881cb0ef41Sopenharmony_cibool operator!=(CreateBoundFunctionParameters const& lhs,
4891cb0ef41Sopenharmony_ci                CreateBoundFunctionParameters const& rhs) {
4901cb0ef41Sopenharmony_ci  return !(lhs == rhs);
4911cb0ef41Sopenharmony_ci}
4921cb0ef41Sopenharmony_ci
4931cb0ef41Sopenharmony_cisize_t hash_value(CreateBoundFunctionParameters const& p) {
4941cb0ef41Sopenharmony_ci  return base::hash_combine(p.arity(), p.map_.object().location());
4951cb0ef41Sopenharmony_ci}
4961cb0ef41Sopenharmony_ci
4971cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os,
4981cb0ef41Sopenharmony_ci                         CreateBoundFunctionParameters const& p) {
4991cb0ef41Sopenharmony_ci  os << p.arity();
5001cb0ef41Sopenharmony_ci  if (!p.map_.object().is_null()) os << ", " << Brief(*p.map_.object());
5011cb0ef41Sopenharmony_ci  return os;
5021cb0ef41Sopenharmony_ci}
5031cb0ef41Sopenharmony_ci
5041cb0ef41Sopenharmony_ciconst CreateBoundFunctionParameters& CreateBoundFunctionParametersOf(
5051cb0ef41Sopenharmony_ci    const Operator* op) {
5061cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSCreateBoundFunction, op->opcode());
5071cb0ef41Sopenharmony_ci  return OpParameter<CreateBoundFunctionParameters>(op);
5081cb0ef41Sopenharmony_ci}
5091cb0ef41Sopenharmony_ci
5101cb0ef41Sopenharmony_cibool operator==(GetTemplateObjectParameters const& lhs,
5111cb0ef41Sopenharmony_ci                GetTemplateObjectParameters const& rhs) {
5121cb0ef41Sopenharmony_ci  return lhs.description_.object().location() ==
5131cb0ef41Sopenharmony_ci             rhs.description_.object().location() &&
5141cb0ef41Sopenharmony_ci         lhs.shared_.object().location() == rhs.shared_.object().location() &&
5151cb0ef41Sopenharmony_ci         lhs.feedback() == rhs.feedback();
5161cb0ef41Sopenharmony_ci}
5171cb0ef41Sopenharmony_ci
5181cb0ef41Sopenharmony_cibool operator!=(GetTemplateObjectParameters const& lhs,
5191cb0ef41Sopenharmony_ci                GetTemplateObjectParameters const& rhs) {
5201cb0ef41Sopenharmony_ci  return !(lhs == rhs);
5211cb0ef41Sopenharmony_ci}
5221cb0ef41Sopenharmony_ci
5231cb0ef41Sopenharmony_cisize_t hash_value(GetTemplateObjectParameters const& p) {
5241cb0ef41Sopenharmony_ci  return base::hash_combine(p.description_.object().location(),
5251cb0ef41Sopenharmony_ci                            p.shared_.object().location(),
5261cb0ef41Sopenharmony_ci                            FeedbackSource::Hash()(p.feedback()));
5271cb0ef41Sopenharmony_ci}
5281cb0ef41Sopenharmony_ci
5291cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os,
5301cb0ef41Sopenharmony_ci                         GetTemplateObjectParameters const& p) {
5311cb0ef41Sopenharmony_ci  return os << Brief(*p.description_.object()) << ", "
5321cb0ef41Sopenharmony_ci            << Brief(*p.shared_.object());
5331cb0ef41Sopenharmony_ci}
5341cb0ef41Sopenharmony_ci
5351cb0ef41Sopenharmony_ciconst GetTemplateObjectParameters& GetTemplateObjectParametersOf(
5361cb0ef41Sopenharmony_ci    const Operator* op) {
5371cb0ef41Sopenharmony_ci  DCHECK(op->opcode() == IrOpcode::kJSGetTemplateObject);
5381cb0ef41Sopenharmony_ci  return OpParameter<GetTemplateObjectParameters>(op);
5391cb0ef41Sopenharmony_ci}
5401cb0ef41Sopenharmony_ci
5411cb0ef41Sopenharmony_cibool operator==(CreateClosureParameters const& lhs,
5421cb0ef41Sopenharmony_ci                CreateClosureParameters const& rhs) {
5431cb0ef41Sopenharmony_ci  return lhs.allocation() == rhs.allocation() &&
5441cb0ef41Sopenharmony_ci         lhs.code_.object().location() == rhs.code_.object().location() &&
5451cb0ef41Sopenharmony_ci         lhs.shared_info_.object().location() ==
5461cb0ef41Sopenharmony_ci             rhs.shared_info_.object().location();
5471cb0ef41Sopenharmony_ci}
5481cb0ef41Sopenharmony_ci
5491cb0ef41Sopenharmony_ci
5501cb0ef41Sopenharmony_cibool operator!=(CreateClosureParameters const& lhs,
5511cb0ef41Sopenharmony_ci                CreateClosureParameters const& rhs) {
5521cb0ef41Sopenharmony_ci  return !(lhs == rhs);
5531cb0ef41Sopenharmony_ci}
5541cb0ef41Sopenharmony_ci
5551cb0ef41Sopenharmony_ci
5561cb0ef41Sopenharmony_cisize_t hash_value(CreateClosureParameters const& p) {
5571cb0ef41Sopenharmony_ci  return base::hash_combine(p.allocation(), p.code_.object().location(),
5581cb0ef41Sopenharmony_ci                            p.shared_info_.object().location());
5591cb0ef41Sopenharmony_ci}
5601cb0ef41Sopenharmony_ci
5611cb0ef41Sopenharmony_ci
5621cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CreateClosureParameters const& p) {
5631cb0ef41Sopenharmony_ci  return os << p.allocation() << ", " << Brief(*p.shared_info_.object()) << ", "
5641cb0ef41Sopenharmony_ci            << Brief(*p.code_.object());
5651cb0ef41Sopenharmony_ci}
5661cb0ef41Sopenharmony_ci
5671cb0ef41Sopenharmony_ci
5681cb0ef41Sopenharmony_ciconst CreateClosureParameters& CreateClosureParametersOf(const Operator* op) {
5691cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSCreateClosure, op->opcode());
5701cb0ef41Sopenharmony_ci  return OpParameter<CreateClosureParameters>(op);
5711cb0ef41Sopenharmony_ci}
5721cb0ef41Sopenharmony_ci
5731cb0ef41Sopenharmony_ci
5741cb0ef41Sopenharmony_cibool operator==(CreateLiteralParameters const& lhs,
5751cb0ef41Sopenharmony_ci                CreateLiteralParameters const& rhs) {
5761cb0ef41Sopenharmony_ci  return lhs.constant_.object().location() ==
5771cb0ef41Sopenharmony_ci             rhs.constant_.object().location() &&
5781cb0ef41Sopenharmony_ci         lhs.feedback() == rhs.feedback() && lhs.length() == rhs.length() &&
5791cb0ef41Sopenharmony_ci         lhs.flags() == rhs.flags();
5801cb0ef41Sopenharmony_ci}
5811cb0ef41Sopenharmony_ci
5821cb0ef41Sopenharmony_ci
5831cb0ef41Sopenharmony_cibool operator!=(CreateLiteralParameters const& lhs,
5841cb0ef41Sopenharmony_ci                CreateLiteralParameters const& rhs) {
5851cb0ef41Sopenharmony_ci  return !(lhs == rhs);
5861cb0ef41Sopenharmony_ci}
5871cb0ef41Sopenharmony_ci
5881cb0ef41Sopenharmony_ci
5891cb0ef41Sopenharmony_cisize_t hash_value(CreateLiteralParameters const& p) {
5901cb0ef41Sopenharmony_ci  return base::hash_combine(p.constant_.object().location(),
5911cb0ef41Sopenharmony_ci                            FeedbackSource::Hash()(p.feedback()), p.length(),
5921cb0ef41Sopenharmony_ci                            p.flags());
5931cb0ef41Sopenharmony_ci}
5941cb0ef41Sopenharmony_ci
5951cb0ef41Sopenharmony_ci
5961cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CreateLiteralParameters const& p) {
5971cb0ef41Sopenharmony_ci  return os << Brief(*p.constant_.object()) << ", " << p.length() << ", "
5981cb0ef41Sopenharmony_ci            << p.flags();
5991cb0ef41Sopenharmony_ci}
6001cb0ef41Sopenharmony_ci
6011cb0ef41Sopenharmony_ci
6021cb0ef41Sopenharmony_ciconst CreateLiteralParameters& CreateLiteralParametersOf(const Operator* op) {
6031cb0ef41Sopenharmony_ci  DCHECK(op->opcode() == IrOpcode::kJSCreateLiteralArray ||
6041cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSCreateLiteralObject ||
6051cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSCreateLiteralRegExp);
6061cb0ef41Sopenharmony_ci  return OpParameter<CreateLiteralParameters>(op);
6071cb0ef41Sopenharmony_ci}
6081cb0ef41Sopenharmony_ci
6091cb0ef41Sopenharmony_cibool operator==(CloneObjectParameters const& lhs,
6101cb0ef41Sopenharmony_ci                CloneObjectParameters const& rhs) {
6111cb0ef41Sopenharmony_ci  return lhs.feedback() == rhs.feedback() && lhs.flags() == rhs.flags();
6121cb0ef41Sopenharmony_ci}
6131cb0ef41Sopenharmony_ci
6141cb0ef41Sopenharmony_cibool operator!=(CloneObjectParameters const& lhs,
6151cb0ef41Sopenharmony_ci                CloneObjectParameters const& rhs) {
6161cb0ef41Sopenharmony_ci  return !(lhs == rhs);
6171cb0ef41Sopenharmony_ci}
6181cb0ef41Sopenharmony_ci
6191cb0ef41Sopenharmony_cisize_t hash_value(CloneObjectParameters const& p) {
6201cb0ef41Sopenharmony_ci  return base::hash_combine(FeedbackSource::Hash()(p.feedback()), p.flags());
6211cb0ef41Sopenharmony_ci}
6221cb0ef41Sopenharmony_ci
6231cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, CloneObjectParameters const& p) {
6241cb0ef41Sopenharmony_ci  return os << p.flags();
6251cb0ef41Sopenharmony_ci}
6261cb0ef41Sopenharmony_ci
6271cb0ef41Sopenharmony_ciconst CloneObjectParameters& CloneObjectParametersOf(const Operator* op) {
6281cb0ef41Sopenharmony_ci  DCHECK(op->opcode() == IrOpcode::kJSCloneObject);
6291cb0ef41Sopenharmony_ci  return OpParameter<CloneObjectParameters>(op);
6301cb0ef41Sopenharmony_ci}
6311cb0ef41Sopenharmony_ci
6321cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, GetIteratorParameters const& p) {
6331cb0ef41Sopenharmony_ci  return os << p.loadFeedback() << ", " << p.callFeedback();
6341cb0ef41Sopenharmony_ci}
6351cb0ef41Sopenharmony_ci
6361cb0ef41Sopenharmony_cibool operator==(GetIteratorParameters const& lhs,
6371cb0ef41Sopenharmony_ci                GetIteratorParameters const& rhs) {
6381cb0ef41Sopenharmony_ci  return lhs.loadFeedback() == rhs.loadFeedback() &&
6391cb0ef41Sopenharmony_ci         lhs.callFeedback() == rhs.callFeedback();
6401cb0ef41Sopenharmony_ci}
6411cb0ef41Sopenharmony_ci
6421cb0ef41Sopenharmony_cibool operator!=(GetIteratorParameters const& lhs,
6431cb0ef41Sopenharmony_ci                GetIteratorParameters const& rhs) {
6441cb0ef41Sopenharmony_ci  return !(lhs == rhs);
6451cb0ef41Sopenharmony_ci}
6461cb0ef41Sopenharmony_ci
6471cb0ef41Sopenharmony_ciGetIteratorParameters const& GetIteratorParametersOf(const Operator* op) {
6481cb0ef41Sopenharmony_ci  DCHECK(op->opcode() == IrOpcode::kJSGetIterator);
6491cb0ef41Sopenharmony_ci  return OpParameter<GetIteratorParameters>(op);
6501cb0ef41Sopenharmony_ci}
6511cb0ef41Sopenharmony_ci
6521cb0ef41Sopenharmony_cisize_t hash_value(GetIteratorParameters const& p) {
6531cb0ef41Sopenharmony_ci  return base::hash_combine(FeedbackSource::Hash()(p.loadFeedback()),
6541cb0ef41Sopenharmony_ci                            FeedbackSource::Hash()(p.callFeedback()));
6551cb0ef41Sopenharmony_ci}
6561cb0ef41Sopenharmony_ci
6571cb0ef41Sopenharmony_cisize_t hash_value(ForInMode const& mode) { return static_cast<uint8_t>(mode); }
6581cb0ef41Sopenharmony_ci
6591cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, ForInMode const& mode) {
6601cb0ef41Sopenharmony_ci  switch (mode) {
6611cb0ef41Sopenharmony_ci    case ForInMode::kUseEnumCacheKeysAndIndices:
6621cb0ef41Sopenharmony_ci      return os << "UseEnumCacheKeysAndIndices";
6631cb0ef41Sopenharmony_ci    case ForInMode::kUseEnumCacheKeys:
6641cb0ef41Sopenharmony_ci      return os << "UseEnumCacheKeys";
6651cb0ef41Sopenharmony_ci    case ForInMode::kGeneric:
6661cb0ef41Sopenharmony_ci      return os << "Generic";
6671cb0ef41Sopenharmony_ci  }
6681cb0ef41Sopenharmony_ci  UNREACHABLE();
6691cb0ef41Sopenharmony_ci}
6701cb0ef41Sopenharmony_ci
6711cb0ef41Sopenharmony_cibool operator==(ForInParameters const& lhs, ForInParameters const& rhs) {
6721cb0ef41Sopenharmony_ci  return lhs.feedback() == rhs.feedback() && lhs.mode() == rhs.mode();
6731cb0ef41Sopenharmony_ci}
6741cb0ef41Sopenharmony_ci
6751cb0ef41Sopenharmony_cibool operator!=(ForInParameters const& lhs, ForInParameters const& rhs) {
6761cb0ef41Sopenharmony_ci  return !(lhs == rhs);
6771cb0ef41Sopenharmony_ci}
6781cb0ef41Sopenharmony_ci
6791cb0ef41Sopenharmony_cisize_t hash_value(ForInParameters const& p) {
6801cb0ef41Sopenharmony_ci  return base::hash_combine(FeedbackSource::Hash()(p.feedback()), p.mode());
6811cb0ef41Sopenharmony_ci}
6821cb0ef41Sopenharmony_ci
6831cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, ForInParameters const& p) {
6841cb0ef41Sopenharmony_ci  return os << p.feedback() << ", " << p.mode();
6851cb0ef41Sopenharmony_ci}
6861cb0ef41Sopenharmony_ci
6871cb0ef41Sopenharmony_ciForInParameters const& ForInParametersOf(const Operator* op) {
6881cb0ef41Sopenharmony_ci  DCHECK(op->opcode() == IrOpcode::kJSForInNext ||
6891cb0ef41Sopenharmony_ci         op->opcode() == IrOpcode::kJSForInPrepare);
6901cb0ef41Sopenharmony_ci  return OpParameter<ForInParameters>(op);
6911cb0ef41Sopenharmony_ci}
6921cb0ef41Sopenharmony_ci
6931cb0ef41Sopenharmony_ci#if V8_ENABLE_WEBASSEMBLY
6941cb0ef41Sopenharmony_ciJSWasmCallParameters const& JSWasmCallParametersOf(const Operator* op) {
6951cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSWasmCall, op->opcode());
6961cb0ef41Sopenharmony_ci  return OpParameter<JSWasmCallParameters>(op);
6971cb0ef41Sopenharmony_ci}
6981cb0ef41Sopenharmony_ci
6991cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, JSWasmCallParameters const& p) {
7001cb0ef41Sopenharmony_ci  return os << p.module() << ", " << p.signature() << ", " << p.feedback();
7011cb0ef41Sopenharmony_ci}
7021cb0ef41Sopenharmony_ci
7031cb0ef41Sopenharmony_cisize_t hash_value(JSWasmCallParameters const& p) {
7041cb0ef41Sopenharmony_ci  return base::hash_combine(p.module(), p.signature(),
7051cb0ef41Sopenharmony_ci                            FeedbackSource::Hash()(p.feedback()));
7061cb0ef41Sopenharmony_ci}
7071cb0ef41Sopenharmony_ci
7081cb0ef41Sopenharmony_cibool operator==(JSWasmCallParameters const& lhs,
7091cb0ef41Sopenharmony_ci                JSWasmCallParameters const& rhs) {
7101cb0ef41Sopenharmony_ci  return lhs.module() == rhs.module() && lhs.signature() == rhs.signature() &&
7111cb0ef41Sopenharmony_ci         lhs.feedback() == rhs.feedback();
7121cb0ef41Sopenharmony_ci}
7131cb0ef41Sopenharmony_ci
7141cb0ef41Sopenharmony_ciint JSWasmCallParameters::arity_without_implicit_args() const {
7151cb0ef41Sopenharmony_ci  return static_cast<int>(signature_->parameter_count());
7161cb0ef41Sopenharmony_ci}
7171cb0ef41Sopenharmony_ci
7181cb0ef41Sopenharmony_ciint JSWasmCallParameters::input_count() const {
7191cb0ef41Sopenharmony_ci  return static_cast<int>(signature_->parameter_count()) +
7201cb0ef41Sopenharmony_ci         JSWasmCallNode::kExtraInputCount;
7211cb0ef41Sopenharmony_ci}
7221cb0ef41Sopenharmony_ci
7231cb0ef41Sopenharmony_ci// static
7241cb0ef41Sopenharmony_ciType JSWasmCallNode::TypeForWasmReturnType(const wasm::ValueType& type) {
7251cb0ef41Sopenharmony_ci  switch (type.kind()) {
7261cb0ef41Sopenharmony_ci    case wasm::kI32:
7271cb0ef41Sopenharmony_ci      return Type::Signed32();
7281cb0ef41Sopenharmony_ci    case wasm::kI64:
7291cb0ef41Sopenharmony_ci      return Type::BigInt();
7301cb0ef41Sopenharmony_ci    case wasm::kF32:
7311cb0ef41Sopenharmony_ci    case wasm::kF64:
7321cb0ef41Sopenharmony_ci      return Type::Number();
7331cb0ef41Sopenharmony_ci    default:
7341cb0ef41Sopenharmony_ci      UNREACHABLE();
7351cb0ef41Sopenharmony_ci  }
7361cb0ef41Sopenharmony_ci}
7371cb0ef41Sopenharmony_ci#endif  // V8_ENABLE_WEBASSEMBLY
7381cb0ef41Sopenharmony_ci
7391cb0ef41Sopenharmony_ci#define CACHED_OP_LIST(V)                                                \
7401cb0ef41Sopenharmony_ci  V(ToLength, Operator::kNoProperties, 1, 1)                             \
7411cb0ef41Sopenharmony_ci  V(ToName, Operator::kNoProperties, 1, 1)                               \
7421cb0ef41Sopenharmony_ci  V(ToNumber, Operator::kNoProperties, 1, 1)                             \
7431cb0ef41Sopenharmony_ci  V(ToNumberConvertBigInt, Operator::kNoProperties, 1, 1)                \
7441cb0ef41Sopenharmony_ci  V(ToNumeric, Operator::kNoProperties, 1, 1)                            \
7451cb0ef41Sopenharmony_ci  V(ToObject, Operator::kFoldable, 1, 1)                                 \
7461cb0ef41Sopenharmony_ci  V(ToString, Operator::kNoProperties, 1, 1)                             \
7471cb0ef41Sopenharmony_ci  V(Create, Operator::kNoProperties, 2, 1)                               \
7481cb0ef41Sopenharmony_ci  V(CreateIterResultObject, Operator::kEliminatable, 2, 1)               \
7491cb0ef41Sopenharmony_ci  V(CreateStringIterator, Operator::kEliminatable, 1, 1)                 \
7501cb0ef41Sopenharmony_ci  V(CreateKeyValueArray, Operator::kEliminatable, 2, 1)                  \
7511cb0ef41Sopenharmony_ci  V(CreatePromise, Operator::kEliminatable, 0, 1)                        \
7521cb0ef41Sopenharmony_ci  V(CreateTypedArray, Operator::kNoProperties, 5, 1)                     \
7531cb0ef41Sopenharmony_ci  V(CreateObject, Operator::kNoProperties, 1, 1)                         \
7541cb0ef41Sopenharmony_ci  V(ObjectIsArray, Operator::kNoProperties, 1, 1)                        \
7551cb0ef41Sopenharmony_ci  V(HasInPrototypeChain, Operator::kNoProperties, 2, 1)                  \
7561cb0ef41Sopenharmony_ci  V(OrdinaryHasInstance, Operator::kNoProperties, 2, 1)                  \
7571cb0ef41Sopenharmony_ci  V(ForInEnumerate, Operator::kNoProperties, 1, 1)                       \
7581cb0ef41Sopenharmony_ci  V(AsyncFunctionEnter, Operator::kNoProperties, 2, 1)                   \
7591cb0ef41Sopenharmony_ci  V(AsyncFunctionReject, Operator::kNoDeopt | Operator::kNoThrow, 2, 1)  \
7601cb0ef41Sopenharmony_ci  V(AsyncFunctionResolve, Operator::kNoDeopt | Operator::kNoThrow, 2, 1) \
7611cb0ef41Sopenharmony_ci  V(LoadMessage, Operator::kNoThrow | Operator::kNoWrite, 0, 1)          \
7621cb0ef41Sopenharmony_ci  V(StoreMessage, Operator::kNoRead | Operator::kNoThrow, 1, 0)          \
7631cb0ef41Sopenharmony_ci  V(GeneratorRestoreContinuation, Operator::kNoThrow, 1, 1)              \
7641cb0ef41Sopenharmony_ci  V(GeneratorRestoreContext, Operator::kNoThrow, 1, 1)                   \
7651cb0ef41Sopenharmony_ci  V(GeneratorRestoreInputOrDebugPos, Operator::kNoThrow, 1, 1)           \
7661cb0ef41Sopenharmony_ci  V(Debugger, Operator::kNoProperties, 0, 0)                             \
7671cb0ef41Sopenharmony_ci  V(FulfillPromise, Operator::kNoDeopt | Operator::kNoThrow, 2, 1)       \
7681cb0ef41Sopenharmony_ci  V(PerformPromiseThen, Operator::kNoDeopt | Operator::kNoThrow, 4, 1)   \
7691cb0ef41Sopenharmony_ci  V(PromiseResolve, Operator::kNoProperties, 2, 1)                       \
7701cb0ef41Sopenharmony_ci  V(RejectPromise, Operator::kNoDeopt | Operator::kNoThrow, 3, 1)        \
7711cb0ef41Sopenharmony_ci  V(ResolvePromise, Operator::kNoDeopt | Operator::kNoThrow, 2, 1)       \
7721cb0ef41Sopenharmony_ci  V(GetSuperConstructor, Operator::kNoWrite | Operator::kNoThrow, 1, 1)  \
7731cb0ef41Sopenharmony_ci  V(ParseInt, Operator::kNoProperties, 2, 1)                             \
7741cb0ef41Sopenharmony_ci  V(RegExpTest, Operator::kNoProperties, 2, 1)
7751cb0ef41Sopenharmony_ci
7761cb0ef41Sopenharmony_cistruct JSOperatorGlobalCache final {
7771cb0ef41Sopenharmony_ci#define CACHED_OP(Name, properties, value_input_count, value_output_count) \
7781cb0ef41Sopenharmony_ci  struct Name##Operator final : public Operator {                          \
7791cb0ef41Sopenharmony_ci    Name##Operator()                                                       \
7801cb0ef41Sopenharmony_ci        : Operator(IrOpcode::kJS##Name, properties, "JS" #Name,            \
7811cb0ef41Sopenharmony_ci                   value_input_count, Operator::ZeroIfPure(properties),    \
7821cb0ef41Sopenharmony_ci                   Operator::ZeroIfEliminatable(properties),               \
7831cb0ef41Sopenharmony_ci                   value_output_count, Operator::ZeroIfPure(properties),   \
7841cb0ef41Sopenharmony_ci                   Operator::ZeroIfNoThrow(properties)) {}                 \
7851cb0ef41Sopenharmony_ci  };                                                                       \
7861cb0ef41Sopenharmony_ci  Name##Operator k##Name##Operator;
7871cb0ef41Sopenharmony_ci  CACHED_OP_LIST(CACHED_OP)
7881cb0ef41Sopenharmony_ci#undef CACHED_OP
7891cb0ef41Sopenharmony_ci};
7901cb0ef41Sopenharmony_ci
7911cb0ef41Sopenharmony_cinamespace {
7921cb0ef41Sopenharmony_ciDEFINE_LAZY_LEAKY_OBJECT_GETTER(JSOperatorGlobalCache, GetJSOperatorGlobalCache)
7931cb0ef41Sopenharmony_ci}  // namespace
7941cb0ef41Sopenharmony_ci
7951cb0ef41Sopenharmony_ciJSOperatorBuilder::JSOperatorBuilder(Zone* zone)
7961cb0ef41Sopenharmony_ci    : cache_(*GetJSOperatorGlobalCache()), zone_(zone) {}
7971cb0ef41Sopenharmony_ci
7981cb0ef41Sopenharmony_ci#define CACHED_OP(Name, properties, value_input_count, value_output_count) \
7991cb0ef41Sopenharmony_ci  const Operator* JSOperatorBuilder::Name() {                              \
8001cb0ef41Sopenharmony_ci    return &cache_.k##Name##Operator;                                      \
8011cb0ef41Sopenharmony_ci  }
8021cb0ef41Sopenharmony_ciCACHED_OP_LIST(CACHED_OP)
8031cb0ef41Sopenharmony_ci#undef CACHED_OP
8041cb0ef41Sopenharmony_ci
8051cb0ef41Sopenharmony_ci#define UNARY_OP(JSName, Name)                                                \
8061cb0ef41Sopenharmony_ci  const Operator* JSOperatorBuilder::Name(FeedbackSource const& feedback) {   \
8071cb0ef41Sopenharmony_ci    FeedbackParameter parameters(feedback);                                   \
8081cb0ef41Sopenharmony_ci    return zone()->New<Operator1<FeedbackParameter>>(                         \
8091cb0ef41Sopenharmony_ci        IrOpcode::k##JSName, Operator::kNoProperties, #JSName, 2, 1, 1, 1, 1, \
8101cb0ef41Sopenharmony_ci        2, parameters);                                                       \
8111cb0ef41Sopenharmony_ci  }
8121cb0ef41Sopenharmony_ciJS_UNOP_WITH_FEEDBACK(UNARY_OP)
8131cb0ef41Sopenharmony_ci#undef UNARY_OP
8141cb0ef41Sopenharmony_ci
8151cb0ef41Sopenharmony_ci#define BINARY_OP(JSName, Name)                                               \
8161cb0ef41Sopenharmony_ci  const Operator* JSOperatorBuilder::Name(FeedbackSource const& feedback) {   \
8171cb0ef41Sopenharmony_ci    static constexpr auto kProperties = BinopProperties(IrOpcode::k##JSName); \
8181cb0ef41Sopenharmony_ci    FeedbackParameter parameters(feedback);                                   \
8191cb0ef41Sopenharmony_ci    return zone()->New<Operator1<FeedbackParameter>>(                         \
8201cb0ef41Sopenharmony_ci        IrOpcode::k##JSName, kProperties, #JSName, 3, 1, 1, 1, 1,             \
8211cb0ef41Sopenharmony_ci        Operator::ZeroIfNoThrow(kProperties), parameters);                    \
8221cb0ef41Sopenharmony_ci  }
8231cb0ef41Sopenharmony_ciJS_BINOP_WITH_FEEDBACK(BINARY_OP)
8241cb0ef41Sopenharmony_ci#undef BINARY_OP
8251cb0ef41Sopenharmony_ci
8261cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::DefineKeyedOwnPropertyInLiteral(
8271cb0ef41Sopenharmony_ci    const FeedbackSource& feedback) {
8281cb0ef41Sopenharmony_ci  static constexpr int kObject = 1;
8291cb0ef41Sopenharmony_ci  static constexpr int kName = 1;
8301cb0ef41Sopenharmony_ci  static constexpr int kValue = 1;
8311cb0ef41Sopenharmony_ci  static constexpr int kFlags = 1;
8321cb0ef41Sopenharmony_ci  static constexpr int kFeedbackVector = 1;
8331cb0ef41Sopenharmony_ci  static constexpr int kArity =
8341cb0ef41Sopenharmony_ci      kObject + kName + kValue + kFlags + kFeedbackVector;
8351cb0ef41Sopenharmony_ci  FeedbackParameter parameters(feedback);
8361cb0ef41Sopenharmony_ci  return zone()->New<Operator1<FeedbackParameter>>(  // --
8371cb0ef41Sopenharmony_ci      IrOpcode::kJSDefineKeyedOwnPropertyInLiteral,
8381cb0ef41Sopenharmony_ci      Operator::kNoThrow,                   // opcode
8391cb0ef41Sopenharmony_ci      "JSDefineKeyedOwnPropertyInLiteral",  // name
8401cb0ef41Sopenharmony_ci      kArity, 1, 1, 0, 1, 1,                // counts
8411cb0ef41Sopenharmony_ci      parameters);                          // parameter
8421cb0ef41Sopenharmony_ci}
8431cb0ef41Sopenharmony_ci
8441cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::StoreInArrayLiteral(
8451cb0ef41Sopenharmony_ci    const FeedbackSource& feedback) {
8461cb0ef41Sopenharmony_ci  static constexpr int kArray = 1;
8471cb0ef41Sopenharmony_ci  static constexpr int kIndex = 1;
8481cb0ef41Sopenharmony_ci  static constexpr int kValue = 1;
8491cb0ef41Sopenharmony_ci  static constexpr int kFeedbackVector = 1;
8501cb0ef41Sopenharmony_ci  static constexpr int kArity = kArray + kIndex + kValue + kFeedbackVector;
8511cb0ef41Sopenharmony_ci  FeedbackParameter parameters(feedback);
8521cb0ef41Sopenharmony_ci  return zone()->New<Operator1<FeedbackParameter>>(  // --
8531cb0ef41Sopenharmony_ci      IrOpcode::kJSStoreInArrayLiteral,
8541cb0ef41Sopenharmony_ci      Operator::kNoThrow,       // opcode
8551cb0ef41Sopenharmony_ci      "JSStoreInArrayLiteral",  // name
8561cb0ef41Sopenharmony_ci      kArity, 1, 1, 0, 1, 1,    // counts
8571cb0ef41Sopenharmony_ci      parameters);              // parameter
8581cb0ef41Sopenharmony_ci}
8591cb0ef41Sopenharmony_ci
8601cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallForwardVarargs(size_t arity,
8611cb0ef41Sopenharmony_ci                                                      uint32_t start_index) {
8621cb0ef41Sopenharmony_ci  CallForwardVarargsParameters parameters(arity, start_index);
8631cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CallForwardVarargsParameters>>(   // --
8641cb0ef41Sopenharmony_ci      IrOpcode::kJSCallForwardVarargs, Operator::kNoProperties,  // opcode
8651cb0ef41Sopenharmony_ci      "JSCallForwardVarargs",                                    // name
8661cb0ef41Sopenharmony_ci      parameters.arity(), 1, 1, 1, 1, 2,                         // counts
8671cb0ef41Sopenharmony_ci      parameters);                                               // parameter
8681cb0ef41Sopenharmony_ci}
8691cb0ef41Sopenharmony_ci
8701cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::Call(
8711cb0ef41Sopenharmony_ci    size_t arity, CallFrequency const& frequency,
8721cb0ef41Sopenharmony_ci    FeedbackSource const& feedback, ConvertReceiverMode convert_mode,
8731cb0ef41Sopenharmony_ci    SpeculationMode speculation_mode, CallFeedbackRelation feedback_relation) {
8741cb0ef41Sopenharmony_ci  CallParameters parameters(arity, frequency, feedback, convert_mode,
8751cb0ef41Sopenharmony_ci                            speculation_mode, feedback_relation);
8761cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CallParameters>>(   // --
8771cb0ef41Sopenharmony_ci      IrOpcode::kJSCall, Operator::kNoProperties,  // opcode
8781cb0ef41Sopenharmony_ci      "JSCall",                                    // name
8791cb0ef41Sopenharmony_ci      parameters.arity(), 1, 1, 1, 1, 2,           // inputs/outputs
8801cb0ef41Sopenharmony_ci      parameters);                                 // parameter
8811cb0ef41Sopenharmony_ci}
8821cb0ef41Sopenharmony_ci
8831cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallWithArrayLike(
8841cb0ef41Sopenharmony_ci    const CallFrequency& frequency, const FeedbackSource& feedback,
8851cb0ef41Sopenharmony_ci    SpeculationMode speculation_mode, CallFeedbackRelation feedback_relation) {
8861cb0ef41Sopenharmony_ci  static constexpr int kTheArrayLikeObject = 1;
8871cb0ef41Sopenharmony_ci  CallParameters parameters(
8881cb0ef41Sopenharmony_ci      JSCallWithArrayLikeNode::ArityForArgc(kTheArrayLikeObject), frequency,
8891cb0ef41Sopenharmony_ci      feedback, ConvertReceiverMode::kAny, speculation_mode, feedback_relation);
8901cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CallParameters>>(                // --
8911cb0ef41Sopenharmony_ci      IrOpcode::kJSCallWithArrayLike, Operator::kNoProperties,  // opcode
8921cb0ef41Sopenharmony_ci      "JSCallWithArrayLike",                                    // name
8931cb0ef41Sopenharmony_ci      parameters.arity(), 1, 1, 1, 1, 2,                        // counts
8941cb0ef41Sopenharmony_ci      parameters);                                              // parameter
8951cb0ef41Sopenharmony_ci}
8961cb0ef41Sopenharmony_ci
8971cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallWithSpread(
8981cb0ef41Sopenharmony_ci    uint32_t arity, CallFrequency const& frequency,
8991cb0ef41Sopenharmony_ci    FeedbackSource const& feedback, SpeculationMode speculation_mode,
9001cb0ef41Sopenharmony_ci    CallFeedbackRelation feedback_relation) {
9011cb0ef41Sopenharmony_ci  DCHECK_IMPLIES(speculation_mode == SpeculationMode::kAllowSpeculation,
9021cb0ef41Sopenharmony_ci                 feedback.IsValid());
9031cb0ef41Sopenharmony_ci  CallParameters parameters(arity, frequency, feedback,
9041cb0ef41Sopenharmony_ci                            ConvertReceiverMode::kAny, speculation_mode,
9051cb0ef41Sopenharmony_ci                            feedback_relation);
9061cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CallParameters>>(             // --
9071cb0ef41Sopenharmony_ci      IrOpcode::kJSCallWithSpread, Operator::kNoProperties,  // opcode
9081cb0ef41Sopenharmony_ci      "JSCallWithSpread",                                    // name
9091cb0ef41Sopenharmony_ci      parameters.arity(), 1, 1, 1, 1, 2,                     // counts
9101cb0ef41Sopenharmony_ci      parameters);                                           // parameter
9111cb0ef41Sopenharmony_ci}
9121cb0ef41Sopenharmony_ci
9131cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallRuntime(Runtime::FunctionId id) {
9141cb0ef41Sopenharmony_ci  const Runtime::Function* f = Runtime::FunctionForId(id);
9151cb0ef41Sopenharmony_ci  return CallRuntime(f, f->nargs);
9161cb0ef41Sopenharmony_ci}
9171cb0ef41Sopenharmony_ci
9181cb0ef41Sopenharmony_ci
9191cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallRuntime(Runtime::FunctionId id,
9201cb0ef41Sopenharmony_ci                                               size_t arity) {
9211cb0ef41Sopenharmony_ci  const Runtime::Function* f = Runtime::FunctionForId(id);
9221cb0ef41Sopenharmony_ci  return CallRuntime(f, arity);
9231cb0ef41Sopenharmony_ci}
9241cb0ef41Sopenharmony_ci
9251cb0ef41Sopenharmony_ci
9261cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallRuntime(const Runtime::Function* f,
9271cb0ef41Sopenharmony_ci                                               size_t arity) {
9281cb0ef41Sopenharmony_ci  CallRuntimeParameters parameters(f->function_id, arity);
9291cb0ef41Sopenharmony_ci  DCHECK(f->nargs == -1 || f->nargs == static_cast<int>(parameters.arity()));
9301cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CallRuntimeParameters>>(   // --
9311cb0ef41Sopenharmony_ci      IrOpcode::kJSCallRuntime, Operator::kNoProperties,  // opcode
9321cb0ef41Sopenharmony_ci      "JSCallRuntime",                                    // name
9331cb0ef41Sopenharmony_ci      parameters.arity(), 1, 1, f->result_size, 1, 2,     // inputs/outputs
9341cb0ef41Sopenharmony_ci      parameters);                                        // parameter
9351cb0ef41Sopenharmony_ci}
9361cb0ef41Sopenharmony_ci
9371cb0ef41Sopenharmony_ci#if V8_ENABLE_WEBASSEMBLY
9381cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CallWasm(
9391cb0ef41Sopenharmony_ci    const wasm::WasmModule* wasm_module,
9401cb0ef41Sopenharmony_ci    const wasm::FunctionSig* wasm_signature, FeedbackSource const& feedback) {
9411cb0ef41Sopenharmony_ci  JSWasmCallParameters parameters(wasm_module, wasm_signature, feedback);
9421cb0ef41Sopenharmony_ci  return zone()->New<Operator1<JSWasmCallParameters>>(
9431cb0ef41Sopenharmony_ci      IrOpcode::kJSWasmCall, Operator::kNoProperties,  // opcode
9441cb0ef41Sopenharmony_ci      "JSWasmCall",                                    // name
9451cb0ef41Sopenharmony_ci      parameters.input_count(), 1, 1, 1, 1, 2,         // inputs/outputs
9461cb0ef41Sopenharmony_ci      parameters);                                     // parameter
9471cb0ef41Sopenharmony_ci}
9481cb0ef41Sopenharmony_ci#endif  // V8_ENABLE_WEBASSEMBLY
9491cb0ef41Sopenharmony_ci
9501cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::ConstructForwardVarargs(
9511cb0ef41Sopenharmony_ci    size_t arity, uint32_t start_index) {
9521cb0ef41Sopenharmony_ci  ConstructForwardVarargsParameters parameters(arity, start_index);
9531cb0ef41Sopenharmony_ci  return zone()->New<Operator1<ConstructForwardVarargsParameters>>(   // --
9541cb0ef41Sopenharmony_ci      IrOpcode::kJSConstructForwardVarargs, Operator::kNoProperties,  // opcode
9551cb0ef41Sopenharmony_ci      "JSConstructForwardVarargs",                                    // name
9561cb0ef41Sopenharmony_ci      parameters.arity(), 1, 1, 1, 1, 2,                              // counts
9571cb0ef41Sopenharmony_ci      parameters);  // parameter
9581cb0ef41Sopenharmony_ci}
9591cb0ef41Sopenharmony_ci
9601cb0ef41Sopenharmony_ci// Note: frequency is taken by reference to work around a GCC bug
9611cb0ef41Sopenharmony_ci// on AIX (v8:8193).
9621cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::Construct(uint32_t arity,
9631cb0ef41Sopenharmony_ci                                             CallFrequency const& frequency,
9641cb0ef41Sopenharmony_ci                                             FeedbackSource const& feedback) {
9651cb0ef41Sopenharmony_ci  ConstructParameters parameters(arity, frequency, feedback);
9661cb0ef41Sopenharmony_ci  return zone()->New<Operator1<ConstructParameters>>(   // --
9671cb0ef41Sopenharmony_ci      IrOpcode::kJSConstruct, Operator::kNoProperties,  // opcode
9681cb0ef41Sopenharmony_ci      "JSConstruct",                                    // name
9691cb0ef41Sopenharmony_ci      parameters.arity(), 1, 1, 1, 1, 2,                // counts
9701cb0ef41Sopenharmony_ci      parameters);                                      // parameter
9711cb0ef41Sopenharmony_ci}
9721cb0ef41Sopenharmony_ci
9731cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::ConstructWithArrayLike(
9741cb0ef41Sopenharmony_ci    CallFrequency const& frequency, FeedbackSource const& feedback) {
9751cb0ef41Sopenharmony_ci  static constexpr int kTheArrayLikeObject = 1;
9761cb0ef41Sopenharmony_ci  ConstructParameters parameters(
9771cb0ef41Sopenharmony_ci      JSConstructWithArrayLikeNode::ArityForArgc(kTheArrayLikeObject),
9781cb0ef41Sopenharmony_ci      frequency, feedback);
9791cb0ef41Sopenharmony_ci  return zone()->New<Operator1<ConstructParameters>>(  // --
9801cb0ef41Sopenharmony_ci      IrOpcode::kJSConstructWithArrayLike,             // opcode
9811cb0ef41Sopenharmony_ci      Operator::kNoProperties,                         // properties
9821cb0ef41Sopenharmony_ci      "JSConstructWithArrayLike",                      // name
9831cb0ef41Sopenharmony_ci      parameters.arity(), 1, 1, 1, 1, 2,               // counts
9841cb0ef41Sopenharmony_ci      parameters);                                     // parameter
9851cb0ef41Sopenharmony_ci}
9861cb0ef41Sopenharmony_ci
9871cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::ConstructWithSpread(
9881cb0ef41Sopenharmony_ci    uint32_t arity, CallFrequency const& frequency,
9891cb0ef41Sopenharmony_ci    FeedbackSource const& feedback) {
9901cb0ef41Sopenharmony_ci  ConstructParameters parameters(arity, frequency, feedback);
9911cb0ef41Sopenharmony_ci  return zone()->New<Operator1<ConstructParameters>>(             // --
9921cb0ef41Sopenharmony_ci      IrOpcode::kJSConstructWithSpread, Operator::kNoProperties,  // opcode
9931cb0ef41Sopenharmony_ci      "JSConstructWithSpread",                                    // name
9941cb0ef41Sopenharmony_ci      parameters.arity(), 1, 1, 1, 1, 2,                          // counts
9951cb0ef41Sopenharmony_ci      parameters);                                                // parameter
9961cb0ef41Sopenharmony_ci}
9971cb0ef41Sopenharmony_ci
9981cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::LoadNamed(const NameRef& name,
9991cb0ef41Sopenharmony_ci                                             const FeedbackSource& feedback) {
10001cb0ef41Sopenharmony_ci  static constexpr int kObject = 1;
10011cb0ef41Sopenharmony_ci  static constexpr int kFeedbackVector = 1;
10021cb0ef41Sopenharmony_ci  static constexpr int kArity = kObject + kFeedbackVector;
10031cb0ef41Sopenharmony_ci  NamedAccess access(LanguageMode::kSloppy, name, feedback);
10041cb0ef41Sopenharmony_ci  return zone()->New<Operator1<NamedAccess>>(           // --
10051cb0ef41Sopenharmony_ci      IrOpcode::kJSLoadNamed, Operator::kNoProperties,  // opcode
10061cb0ef41Sopenharmony_ci      "JSLoadNamed",                                    // name
10071cb0ef41Sopenharmony_ci      kArity, 1, 1, 1, 1, 2,                            // counts
10081cb0ef41Sopenharmony_ci      access);                                          // parameter
10091cb0ef41Sopenharmony_ci}
10101cb0ef41Sopenharmony_ci
10111cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::LoadNamedFromSuper(
10121cb0ef41Sopenharmony_ci    const NameRef& name, const FeedbackSource& feedback) {
10131cb0ef41Sopenharmony_ci  static constexpr int kReceiver = 1;
10141cb0ef41Sopenharmony_ci  static constexpr int kHomeObject = 1;
10151cb0ef41Sopenharmony_ci  static constexpr int kFeedbackVector = 1;
10161cb0ef41Sopenharmony_ci  static constexpr int kArity = kReceiver + kHomeObject + kFeedbackVector;
10171cb0ef41Sopenharmony_ci  NamedAccess access(LanguageMode::kSloppy, name, feedback);
10181cb0ef41Sopenharmony_ci  return zone()->New<Operator1<NamedAccess>>(                    // --
10191cb0ef41Sopenharmony_ci      IrOpcode::kJSLoadNamedFromSuper, Operator::kNoProperties,  // opcode
10201cb0ef41Sopenharmony_ci      "JSLoadNamedFromSuper",                                    // name
10211cb0ef41Sopenharmony_ci      kArity, 1, 1, 1, 1, 2,                                     // counts
10221cb0ef41Sopenharmony_ci      access);                                                   // parameter
10231cb0ef41Sopenharmony_ci}
10241cb0ef41Sopenharmony_ci
10251cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::LoadProperty(
10261cb0ef41Sopenharmony_ci    FeedbackSource const& feedback) {
10271cb0ef41Sopenharmony_ci  PropertyAccess access(LanguageMode::kSloppy, feedback);
10281cb0ef41Sopenharmony_ci  return zone()->New<Operator1<PropertyAccess>>(           // --
10291cb0ef41Sopenharmony_ci      IrOpcode::kJSLoadProperty, Operator::kNoProperties,  // opcode
10301cb0ef41Sopenharmony_ci      "JSLoadProperty",                                    // name
10311cb0ef41Sopenharmony_ci      3, 1, 1, 1, 1, 2,                                    // counts
10321cb0ef41Sopenharmony_ci      access);                                             // parameter
10331cb0ef41Sopenharmony_ci}
10341cb0ef41Sopenharmony_ci
10351cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::GetIterator(
10361cb0ef41Sopenharmony_ci    FeedbackSource const& load_feedback, FeedbackSource const& call_feedback) {
10371cb0ef41Sopenharmony_ci  GetIteratorParameters access(load_feedback, call_feedback);
10381cb0ef41Sopenharmony_ci  return zone()->New<Operator1<GetIteratorParameters>>(   // --
10391cb0ef41Sopenharmony_ci      IrOpcode::kJSGetIterator, Operator::kNoProperties,  // opcode
10401cb0ef41Sopenharmony_ci      "JSGetIterator",                                    // name
10411cb0ef41Sopenharmony_ci      2, 1, 1, 1, 1, 2,                                   // counts
10421cb0ef41Sopenharmony_ci      access);                                            // parameter
10431cb0ef41Sopenharmony_ci}
10441cb0ef41Sopenharmony_ci
10451cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::HasProperty(FeedbackSource const& feedback) {
10461cb0ef41Sopenharmony_ci  PropertyAccess access(LanguageMode::kSloppy, feedback);
10471cb0ef41Sopenharmony_ci  return zone()->New<Operator1<PropertyAccess>>(          // --
10481cb0ef41Sopenharmony_ci      IrOpcode::kJSHasProperty, Operator::kNoProperties,  // opcode
10491cb0ef41Sopenharmony_ci      "JSHasProperty",                                    // name
10501cb0ef41Sopenharmony_ci      3, 1, 1, 1, 1, 2,                                   // counts
10511cb0ef41Sopenharmony_ci      access);                                            // parameter
10521cb0ef41Sopenharmony_ci}
10531cb0ef41Sopenharmony_ci
10541cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::ForInNext(ForInMode mode,
10551cb0ef41Sopenharmony_ci                                             const FeedbackSource& feedback) {
10561cb0ef41Sopenharmony_ci  return zone()->New<Operator1<ForInParameters>>(       // --
10571cb0ef41Sopenharmony_ci      IrOpcode::kJSForInNext, Operator::kNoProperties,  // opcode
10581cb0ef41Sopenharmony_ci      "JSForInNext",                                    // name
10591cb0ef41Sopenharmony_ci      5, 1, 1, 1, 1, 2,                                 // counts
10601cb0ef41Sopenharmony_ci      ForInParameters{feedback, mode});                 // parameter
10611cb0ef41Sopenharmony_ci}
10621cb0ef41Sopenharmony_ci
10631cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::ForInPrepare(
10641cb0ef41Sopenharmony_ci    ForInMode mode, const FeedbackSource& feedback) {
10651cb0ef41Sopenharmony_ci  return zone()->New<Operator1<ForInParameters>>(  // --
10661cb0ef41Sopenharmony_ci      IrOpcode::kJSForInPrepare,                   // opcode
10671cb0ef41Sopenharmony_ci      Operator::kNoWrite | Operator::kNoThrow,     // flags
10681cb0ef41Sopenharmony_ci      "JSForInPrepare",                            // name
10691cb0ef41Sopenharmony_ci      2, 1, 1, 3, 1, 1,                            // counts
10701cb0ef41Sopenharmony_ci      ForInParameters{feedback, mode});            // parameter
10711cb0ef41Sopenharmony_ci}
10721cb0ef41Sopenharmony_ci
10731cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::GeneratorStore(int register_count) {
10741cb0ef41Sopenharmony_ci  return zone()->New<Operator1<int>>(                   // --
10751cb0ef41Sopenharmony_ci      IrOpcode::kJSGeneratorStore, Operator::kNoThrow,  // opcode
10761cb0ef41Sopenharmony_ci      "JSGeneratorStore",                               // name
10771cb0ef41Sopenharmony_ci      3 + register_count, 1, 1, 0, 1, 0,                // counts
10781cb0ef41Sopenharmony_ci      register_count);                                  // parameter
10791cb0ef41Sopenharmony_ci}
10801cb0ef41Sopenharmony_ci
10811cb0ef41Sopenharmony_ciint RegisterCountOf(Operator const* op) {
10821cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSCreateAsyncFunctionObject, op->opcode());
10831cb0ef41Sopenharmony_ci  return OpParameter<int>(op);
10841cb0ef41Sopenharmony_ci}
10851cb0ef41Sopenharmony_ci
10861cb0ef41Sopenharmony_ciint GeneratorStoreValueCountOf(const Operator* op) {
10871cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSGeneratorStore, op->opcode());
10881cb0ef41Sopenharmony_ci  return OpParameter<int>(op);
10891cb0ef41Sopenharmony_ci}
10901cb0ef41Sopenharmony_ci
10911cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::GeneratorRestoreRegister(int index) {
10921cb0ef41Sopenharmony_ci  return zone()->New<Operator1<int>>(                             // --
10931cb0ef41Sopenharmony_ci      IrOpcode::kJSGeneratorRestoreRegister, Operator::kNoThrow,  // opcode
10941cb0ef41Sopenharmony_ci      "JSGeneratorRestoreRegister",                               // name
10951cb0ef41Sopenharmony_ci      1, 1, 1, 1, 1, 0,                                           // counts
10961cb0ef41Sopenharmony_ci      index);                                                     // parameter
10971cb0ef41Sopenharmony_ci}
10981cb0ef41Sopenharmony_ci
10991cb0ef41Sopenharmony_ciint RestoreRegisterIndexOf(const Operator* op) {
11001cb0ef41Sopenharmony_ci  DCHECK_EQ(IrOpcode::kJSGeneratorRestoreRegister, op->opcode());
11011cb0ef41Sopenharmony_ci  return OpParameter<int>(op);
11021cb0ef41Sopenharmony_ci}
11031cb0ef41Sopenharmony_ci
11041cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::SetNamedProperty(
11051cb0ef41Sopenharmony_ci    LanguageMode language_mode, const NameRef& name,
11061cb0ef41Sopenharmony_ci    FeedbackSource const& feedback) {
11071cb0ef41Sopenharmony_ci  static constexpr int kObject = 1;
11081cb0ef41Sopenharmony_ci  static constexpr int kValue = 1;
11091cb0ef41Sopenharmony_ci  static constexpr int kFeedbackVector = 1;
11101cb0ef41Sopenharmony_ci  static constexpr int kArity = kObject + kValue + kFeedbackVector;
11111cb0ef41Sopenharmony_ci  NamedAccess access(language_mode, name, feedback);
11121cb0ef41Sopenharmony_ci  return zone()->New<Operator1<NamedAccess>>(                  // --
11131cb0ef41Sopenharmony_ci      IrOpcode::kJSSetNamedProperty, Operator::kNoProperties,  // opcode
11141cb0ef41Sopenharmony_ci      "JSSetNamedProperty",                                    // name
11151cb0ef41Sopenharmony_ci      kArity, 1, 1, 0, 1, 2,                                   // counts
11161cb0ef41Sopenharmony_ci      access);                                                 // parameter
11171cb0ef41Sopenharmony_ci}
11181cb0ef41Sopenharmony_ci
11191cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::SetKeyedProperty(
11201cb0ef41Sopenharmony_ci    LanguageMode language_mode, FeedbackSource const& feedback) {
11211cb0ef41Sopenharmony_ci  PropertyAccess access(language_mode, feedback);
11221cb0ef41Sopenharmony_ci  return zone()->New<Operator1<PropertyAccess>>(               // --
11231cb0ef41Sopenharmony_ci      IrOpcode::kJSSetKeyedProperty, Operator::kNoProperties,  // opcode
11241cb0ef41Sopenharmony_ci      "JSSetKeyedProperty",                                    // name
11251cb0ef41Sopenharmony_ci      4, 1, 1, 0, 1, 2,                                        // counts
11261cb0ef41Sopenharmony_ci      access);                                                 // parameter
11271cb0ef41Sopenharmony_ci}
11281cb0ef41Sopenharmony_ci
11291cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::DefineKeyedOwnProperty(
11301cb0ef41Sopenharmony_ci    LanguageMode language_mode, FeedbackSource const& feedback) {
11311cb0ef41Sopenharmony_ci  PropertyAccess access(language_mode, feedback);
11321cb0ef41Sopenharmony_ci  return zone()->New<Operator1<PropertyAccess>>(                     // --
11331cb0ef41Sopenharmony_ci      IrOpcode::kJSDefineKeyedOwnProperty, Operator::kNoProperties,  // opcode
11341cb0ef41Sopenharmony_ci      "JSDefineKeyedOwnProperty",                                    // name
11351cb0ef41Sopenharmony_ci      4, 1, 1, 0, 1, 2,                                              // counts
11361cb0ef41Sopenharmony_ci      access);  // parameter
11371cb0ef41Sopenharmony_ci}
11381cb0ef41Sopenharmony_ci
11391cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::DefineNamedOwnProperty(
11401cb0ef41Sopenharmony_ci    const NameRef& name, FeedbackSource const& feedback) {
11411cb0ef41Sopenharmony_ci  static constexpr int kObject = 1;
11421cb0ef41Sopenharmony_ci  static constexpr int kValue = 1;
11431cb0ef41Sopenharmony_ci  static constexpr int kFeedbackVector = 1;
11441cb0ef41Sopenharmony_ci  static constexpr int kArity = kObject + kValue + kFeedbackVector;
11451cb0ef41Sopenharmony_ci  DefineNamedOwnPropertyParameters parameters(name, feedback);
11461cb0ef41Sopenharmony_ci  return zone()->New<Operator1<DefineNamedOwnPropertyParameters>>(   // --
11471cb0ef41Sopenharmony_ci      IrOpcode::kJSDefineNamedOwnProperty, Operator::kNoProperties,  // opcode
11481cb0ef41Sopenharmony_ci      "JSDefineNamedOwnProperty",                                    // name
11491cb0ef41Sopenharmony_ci      kArity, 1, 1, 0, 1, 2,                                         // counts
11501cb0ef41Sopenharmony_ci      parameters);  // parameter
11511cb0ef41Sopenharmony_ci}
11521cb0ef41Sopenharmony_ci
11531cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::DeleteProperty() {
11541cb0ef41Sopenharmony_ci  return zone()->New<Operator>(                              // --
11551cb0ef41Sopenharmony_ci      IrOpcode::kJSDeleteProperty, Operator::kNoProperties,  // opcode
11561cb0ef41Sopenharmony_ci      "JSDeleteProperty",                                    // name
11571cb0ef41Sopenharmony_ci      3, 1, 1, 1, 1, 2);                                     // counts
11581cb0ef41Sopenharmony_ci}
11591cb0ef41Sopenharmony_ci
11601cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateGeneratorObject() {
11611cb0ef41Sopenharmony_ci  return zone()->New<Operator>(                                     // --
11621cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateGeneratorObject, Operator::kEliminatable,  // opcode
11631cb0ef41Sopenharmony_ci      "JSCreateGeneratorObject",                                    // name
11641cb0ef41Sopenharmony_ci      2, 1, 1, 1, 1, 0);                                            // counts
11651cb0ef41Sopenharmony_ci}
11661cb0ef41Sopenharmony_ci
11671cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::LoadGlobal(const NameRef& name,
11681cb0ef41Sopenharmony_ci                                              const FeedbackSource& feedback,
11691cb0ef41Sopenharmony_ci                                              TypeofMode typeof_mode) {
11701cb0ef41Sopenharmony_ci  static constexpr int kFeedbackVector = 1;
11711cb0ef41Sopenharmony_ci  static constexpr int kArity = kFeedbackVector;
11721cb0ef41Sopenharmony_ci  LoadGlobalParameters parameters(name, feedback, typeof_mode);
11731cb0ef41Sopenharmony_ci  return zone()->New<Operator1<LoadGlobalParameters>>(   // --
11741cb0ef41Sopenharmony_ci      IrOpcode::kJSLoadGlobal, Operator::kNoProperties,  // opcode
11751cb0ef41Sopenharmony_ci      "JSLoadGlobal",                                    // name
11761cb0ef41Sopenharmony_ci      kArity, 1, 1, 1, 1, 2,                             // counts
11771cb0ef41Sopenharmony_ci      parameters);                                       // parameter
11781cb0ef41Sopenharmony_ci}
11791cb0ef41Sopenharmony_ci
11801cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::StoreGlobal(LanguageMode language_mode,
11811cb0ef41Sopenharmony_ci                                               const NameRef& name,
11821cb0ef41Sopenharmony_ci                                               const FeedbackSource& feedback) {
11831cb0ef41Sopenharmony_ci  static constexpr int kValue = 1;
11841cb0ef41Sopenharmony_ci  static constexpr int kFeedbackVector = 1;
11851cb0ef41Sopenharmony_ci  static constexpr int kArity = kValue + kFeedbackVector;
11861cb0ef41Sopenharmony_ci  StoreGlobalParameters parameters(language_mode, feedback, name);
11871cb0ef41Sopenharmony_ci  return zone()->New<Operator1<StoreGlobalParameters>>(   // --
11881cb0ef41Sopenharmony_ci      IrOpcode::kJSStoreGlobal, Operator::kNoProperties,  // opcode
11891cb0ef41Sopenharmony_ci      "JSStoreGlobal",                                    // name
11901cb0ef41Sopenharmony_ci      kArity, 1, 1, 0, 1, 2,                              // counts
11911cb0ef41Sopenharmony_ci      parameters);                                        // parameter
11921cb0ef41Sopenharmony_ci}
11931cb0ef41Sopenharmony_ci
11941cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::HasContextExtension(size_t depth) {
11951cb0ef41Sopenharmony_ci  return zone()->New<Operator1<size_t>>(        // --
11961cb0ef41Sopenharmony_ci      IrOpcode::kJSHasContextExtension,         // opcode
11971cb0ef41Sopenharmony_ci      Operator::kNoWrite | Operator::kNoThrow,  // flags
11981cb0ef41Sopenharmony_ci      "JSHasContextExtension",                  // name
11991cb0ef41Sopenharmony_ci      0, 1, 0, 1, 1, 0,                         // counts
12001cb0ef41Sopenharmony_ci      depth);                                   // parameter
12011cb0ef41Sopenharmony_ci}
12021cb0ef41Sopenharmony_ci
12031cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::LoadContext(size_t depth, size_t index,
12041cb0ef41Sopenharmony_ci                                               bool immutable) {
12051cb0ef41Sopenharmony_ci  ContextAccess access(depth, index, immutable);
12061cb0ef41Sopenharmony_ci  return zone()->New<Operator1<ContextAccess>>(  // --
12071cb0ef41Sopenharmony_ci      IrOpcode::kJSLoadContext,                  // opcode
12081cb0ef41Sopenharmony_ci      Operator::kNoWrite | Operator::kNoThrow,   // flags
12091cb0ef41Sopenharmony_ci      "JSLoadContext",                           // name
12101cb0ef41Sopenharmony_ci      0, 1, 0, 1, 1, 0,                          // counts
12111cb0ef41Sopenharmony_ci      access);                                   // parameter
12121cb0ef41Sopenharmony_ci}
12131cb0ef41Sopenharmony_ci
12141cb0ef41Sopenharmony_ci
12151cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::StoreContext(size_t depth, size_t index) {
12161cb0ef41Sopenharmony_ci  ContextAccess access(depth, index, false);
12171cb0ef41Sopenharmony_ci  return zone()->New<Operator1<ContextAccess>>(  // --
12181cb0ef41Sopenharmony_ci      IrOpcode::kJSStoreContext,                 // opcode
12191cb0ef41Sopenharmony_ci      Operator::kNoRead | Operator::kNoThrow,    // flags
12201cb0ef41Sopenharmony_ci      "JSStoreContext",                          // name
12211cb0ef41Sopenharmony_ci      1, 1, 1, 0, 1, 0,                          // counts
12221cb0ef41Sopenharmony_ci      access);                                   // parameter
12231cb0ef41Sopenharmony_ci}
12241cb0ef41Sopenharmony_ci
12251cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::LoadModule(int32_t cell_index) {
12261cb0ef41Sopenharmony_ci  return zone()->New<Operator1<int32_t>>(       // --
12271cb0ef41Sopenharmony_ci      IrOpcode::kJSLoadModule,                  // opcode
12281cb0ef41Sopenharmony_ci      Operator::kNoWrite | Operator::kNoThrow,  // flags
12291cb0ef41Sopenharmony_ci      "JSLoadModule",                           // name
12301cb0ef41Sopenharmony_ci      1, 1, 1, 1, 1, 0,                         // counts
12311cb0ef41Sopenharmony_ci      cell_index);                              // parameter
12321cb0ef41Sopenharmony_ci}
12331cb0ef41Sopenharmony_ci
12341cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::GetImportMeta() {
12351cb0ef41Sopenharmony_ci  return zone()->New<Operator>(    // --
12361cb0ef41Sopenharmony_ci      IrOpcode::kJSGetImportMeta,  // opcode
12371cb0ef41Sopenharmony_ci      Operator::kNoProperties,     // flags
12381cb0ef41Sopenharmony_ci      "JSGetImportMeta",           // name
12391cb0ef41Sopenharmony_ci      0, 1, 1, 1, 1, 2);           // counts
12401cb0ef41Sopenharmony_ci}
12411cb0ef41Sopenharmony_ci
12421cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::StoreModule(int32_t cell_index) {
12431cb0ef41Sopenharmony_ci  return zone()->New<Operator1<int32_t>>(      // --
12441cb0ef41Sopenharmony_ci      IrOpcode::kJSStoreModule,                // opcode
12451cb0ef41Sopenharmony_ci      Operator::kNoRead | Operator::kNoThrow,  // flags
12461cb0ef41Sopenharmony_ci      "JSStoreModule",                         // name
12471cb0ef41Sopenharmony_ci      2, 1, 1, 0, 1, 0,                        // counts
12481cb0ef41Sopenharmony_ci      cell_index);                             // parameter
12491cb0ef41Sopenharmony_ci}
12501cb0ef41Sopenharmony_ci
12511cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateArguments(CreateArgumentsType type) {
12521cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CreateArgumentsType>>(         // --
12531cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateArguments, Operator::kEliminatable,  // opcode
12541cb0ef41Sopenharmony_ci      "JSCreateArguments",                                    // name
12551cb0ef41Sopenharmony_ci      1, 1, 0, 1, 1, 0,                                       // counts
12561cb0ef41Sopenharmony_ci      type);                                                  // parameter
12571cb0ef41Sopenharmony_ci}
12581cb0ef41Sopenharmony_ci
12591cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateArray(
12601cb0ef41Sopenharmony_ci    size_t arity, base::Optional<AllocationSiteRef> site) {
12611cb0ef41Sopenharmony_ci  // constructor, new_target, arg1, ..., argN
12621cb0ef41Sopenharmony_ci  int const value_input_count = static_cast<int>(arity) + 2;
12631cb0ef41Sopenharmony_ci  CreateArrayParameters parameters(arity, site);
12641cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CreateArrayParameters>>(   // --
12651cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateArray, Operator::kNoProperties,  // opcode
12661cb0ef41Sopenharmony_ci      "JSCreateArray",                                    // name
12671cb0ef41Sopenharmony_ci      value_input_count, 1, 1, 1, 1, 2,                   // counts
12681cb0ef41Sopenharmony_ci      parameters);                                        // parameter
12691cb0ef41Sopenharmony_ci}
12701cb0ef41Sopenharmony_ci
12711cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateArrayIterator(IterationKind kind) {
12721cb0ef41Sopenharmony_ci  CreateArrayIteratorParameters parameters(kind);
12731cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CreateArrayIteratorParameters>>(   // --
12741cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateArrayIterator, Operator::kEliminatable,  // opcode
12751cb0ef41Sopenharmony_ci      "JSCreateArrayIterator",                                    // name
12761cb0ef41Sopenharmony_ci      1, 1, 1, 1, 1, 0,                                           // counts
12771cb0ef41Sopenharmony_ci      parameters);                                                // parameter
12781cb0ef41Sopenharmony_ci}
12791cb0ef41Sopenharmony_ci
12801cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateAsyncFunctionObject(
12811cb0ef41Sopenharmony_ci    int register_count) {
12821cb0ef41Sopenharmony_ci  return zone()->New<Operator1<int>>(          // --
12831cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateAsyncFunctionObject,  // opcode
12841cb0ef41Sopenharmony_ci      Operator::kEliminatable,                 // flags
12851cb0ef41Sopenharmony_ci      "JSCreateAsyncFunctionObject",           // name
12861cb0ef41Sopenharmony_ci      3, 1, 1, 1, 1, 0,                        // counts
12871cb0ef41Sopenharmony_ci      register_count);                         // parameter
12881cb0ef41Sopenharmony_ci}
12891cb0ef41Sopenharmony_ci
12901cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateCollectionIterator(
12911cb0ef41Sopenharmony_ci    CollectionKind collection_kind, IterationKind iteration_kind) {
12921cb0ef41Sopenharmony_ci  CreateCollectionIteratorParameters parameters(collection_kind,
12931cb0ef41Sopenharmony_ci                                                iteration_kind);
12941cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CreateCollectionIteratorParameters>>(
12951cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateCollectionIterator, Operator::kEliminatable,
12961cb0ef41Sopenharmony_ci      "JSCreateCollectionIterator", 1, 1, 1, 1, 1, 0, parameters);
12971cb0ef41Sopenharmony_ci}
12981cb0ef41Sopenharmony_ci
12991cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateBoundFunction(size_t arity,
13001cb0ef41Sopenharmony_ci                                                       const MapRef& map) {
13011cb0ef41Sopenharmony_ci  // bound_target_function, bound_this, arg1, ..., argN
13021cb0ef41Sopenharmony_ci  int const value_input_count = static_cast<int>(arity) + 2;
13031cb0ef41Sopenharmony_ci  CreateBoundFunctionParameters parameters(arity, map);
13041cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CreateBoundFunctionParameters>>(   // --
13051cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateBoundFunction, Operator::kEliminatable,  // opcode
13061cb0ef41Sopenharmony_ci      "JSCreateBoundFunction",                                    // name
13071cb0ef41Sopenharmony_ci      value_input_count, 1, 1, 1, 1, 0,                           // counts
13081cb0ef41Sopenharmony_ci      parameters);                                                // parameter
13091cb0ef41Sopenharmony_ci}
13101cb0ef41Sopenharmony_ci
13111cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateClosure(
13121cb0ef41Sopenharmony_ci    const SharedFunctionInfoRef& shared_info, const CodeTRef& code,
13131cb0ef41Sopenharmony_ci    AllocationType allocation) {
13141cb0ef41Sopenharmony_ci  static constexpr int kFeedbackCell = 1;
13151cb0ef41Sopenharmony_ci  static constexpr int kArity = kFeedbackCell;
13161cb0ef41Sopenharmony_ci  CreateClosureParameters parameters(shared_info, code, allocation);
13171cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CreateClosureParameters>>(   // --
13181cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateClosure, Operator::kEliminatable,  // opcode
13191cb0ef41Sopenharmony_ci      "JSCreateClosure",                                    // name
13201cb0ef41Sopenharmony_ci      kArity, 1, 1, 1, 1, 0,                                // counts
13211cb0ef41Sopenharmony_ci      parameters);                                          // parameter
13221cb0ef41Sopenharmony_ci}
13231cb0ef41Sopenharmony_ci
13241cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateLiteralArray(
13251cb0ef41Sopenharmony_ci    const ArrayBoilerplateDescriptionRef& description,
13261cb0ef41Sopenharmony_ci    FeedbackSource const& feedback, int literal_flags, int number_of_elements) {
13271cb0ef41Sopenharmony_ci  CreateLiteralParameters parameters(description, feedback, number_of_elements,
13281cb0ef41Sopenharmony_ci                                     literal_flags);
13291cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CreateLiteralParameters>>(  // --
13301cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateLiteralArray,                     // opcode
13311cb0ef41Sopenharmony_ci      Operator::kNoProperties,                             // properties
13321cb0ef41Sopenharmony_ci      "JSCreateLiteralArray",                              // name
13331cb0ef41Sopenharmony_ci      1, 1, 1, 1, 1, 2,                                    // counts
13341cb0ef41Sopenharmony_ci      parameters);                                         // parameter
13351cb0ef41Sopenharmony_ci}
13361cb0ef41Sopenharmony_ci
13371cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateEmptyLiteralArray(
13381cb0ef41Sopenharmony_ci    FeedbackSource const& feedback) {
13391cb0ef41Sopenharmony_ci  static constexpr int kFeedbackVector = 1;
13401cb0ef41Sopenharmony_ci  static constexpr int kArity = kFeedbackVector;
13411cb0ef41Sopenharmony_ci  FeedbackParameter parameters(feedback);
13421cb0ef41Sopenharmony_ci  return zone()->New<Operator1<FeedbackParameter>>(  // --
13431cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateEmptyLiteralArray,          // opcode
13441cb0ef41Sopenharmony_ci      Operator::kEliminatable,                       // properties
13451cb0ef41Sopenharmony_ci      "JSCreateEmptyLiteralArray",                   // name
13461cb0ef41Sopenharmony_ci      kArity, 1, 1, 1, 1, 0,                         // counts
13471cb0ef41Sopenharmony_ci      parameters);                                   // parameter
13481cb0ef41Sopenharmony_ci}
13491cb0ef41Sopenharmony_ci
13501cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateArrayFromIterable() {
13511cb0ef41Sopenharmony_ci  return zone()->New<Operator>(              // --
13521cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateArrayFromIterable,  // opcode
13531cb0ef41Sopenharmony_ci      Operator::kNoProperties,               // properties
13541cb0ef41Sopenharmony_ci      "JSCreateArrayFromIterable",           // name
13551cb0ef41Sopenharmony_ci      1, 1, 1, 1, 1, 2);                     // counts
13561cb0ef41Sopenharmony_ci}
13571cb0ef41Sopenharmony_ci
13581cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateLiteralObject(
13591cb0ef41Sopenharmony_ci    const ObjectBoilerplateDescriptionRef& constant_properties,
13601cb0ef41Sopenharmony_ci    FeedbackSource const& feedback, int literal_flags,
13611cb0ef41Sopenharmony_ci    int number_of_properties) {
13621cb0ef41Sopenharmony_ci  CreateLiteralParameters parameters(constant_properties, feedback,
13631cb0ef41Sopenharmony_ci                                     number_of_properties, literal_flags);
13641cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CreateLiteralParameters>>(  // --
13651cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateLiteralObject,                    // opcode
13661cb0ef41Sopenharmony_ci      Operator::kNoProperties,                             // properties
13671cb0ef41Sopenharmony_ci      "JSCreateLiteralObject",                             // name
13681cb0ef41Sopenharmony_ci      1, 1, 1, 1, 1, 2,                                    // counts
13691cb0ef41Sopenharmony_ci      parameters);                                         // parameter
13701cb0ef41Sopenharmony_ci}
13711cb0ef41Sopenharmony_ci
13721cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::GetTemplateObject(
13731cb0ef41Sopenharmony_ci    const TemplateObjectDescriptionRef& description,
13741cb0ef41Sopenharmony_ci    const SharedFunctionInfoRef& shared, FeedbackSource const& feedback) {
13751cb0ef41Sopenharmony_ci  GetTemplateObjectParameters parameters(description, shared, feedback);
13761cb0ef41Sopenharmony_ci  return zone()->New<Operator1<GetTemplateObjectParameters>>(  // --
13771cb0ef41Sopenharmony_ci      IrOpcode::kJSGetTemplateObject,                          // opcode
13781cb0ef41Sopenharmony_ci      Operator::kEliminatable,                                 // properties
13791cb0ef41Sopenharmony_ci      "JSGetTemplateObject",                                   // name
13801cb0ef41Sopenharmony_ci      1, 1, 1, 1, 1, 0,                                        // counts
13811cb0ef41Sopenharmony_ci      parameters);                                             // parameter
13821cb0ef41Sopenharmony_ci}
13831cb0ef41Sopenharmony_ci
13841cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CloneObject(FeedbackSource const& feedback,
13851cb0ef41Sopenharmony_ci                                               int literal_flags) {
13861cb0ef41Sopenharmony_ci  CloneObjectParameters parameters(feedback, literal_flags);
13871cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CloneObjectParameters>>(  // --
13881cb0ef41Sopenharmony_ci      IrOpcode::kJSCloneObject,                          // opcode
13891cb0ef41Sopenharmony_ci      Operator::kNoProperties,                           // properties
13901cb0ef41Sopenharmony_ci      "JSCloneObject",                                   // name
13911cb0ef41Sopenharmony_ci      2, 1, 1, 1, 1, 2,                                  // counts
13921cb0ef41Sopenharmony_ci      parameters);                                       // parameter
13931cb0ef41Sopenharmony_ci}
13941cb0ef41Sopenharmony_ci
13951cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::StackCheck(StackCheckKind kind) {
13961cb0ef41Sopenharmony_ci  return zone()->New<Operator1<StackCheckKind>>(  // --
13971cb0ef41Sopenharmony_ci      IrOpcode::kJSStackCheck,                    // opcode
13981cb0ef41Sopenharmony_ci      Operator::kNoWrite,                         // properties
13991cb0ef41Sopenharmony_ci      "JSStackCheck",                             // name
14001cb0ef41Sopenharmony_ci      0, 1, 1, 0, 1, 2,                           // counts
14011cb0ef41Sopenharmony_ci      kind);                                      // parameter
14021cb0ef41Sopenharmony_ci}
14031cb0ef41Sopenharmony_ci
14041cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateEmptyLiteralObject() {
14051cb0ef41Sopenharmony_ci  return zone()->New<Operator>(               // --
14061cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateEmptyLiteralObject,  // opcode
14071cb0ef41Sopenharmony_ci      Operator::kNoProperties,                // properties
14081cb0ef41Sopenharmony_ci      "JSCreateEmptyLiteralObject",           // name
14091cb0ef41Sopenharmony_ci      0, 1, 1, 1, 1, 2);                      // counts
14101cb0ef41Sopenharmony_ci}
14111cb0ef41Sopenharmony_ci
14121cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateLiteralRegExp(
14131cb0ef41Sopenharmony_ci    const StringRef& constant_pattern, FeedbackSource const& feedback,
14141cb0ef41Sopenharmony_ci    int literal_flags) {
14151cb0ef41Sopenharmony_ci  CreateLiteralParameters parameters(constant_pattern, feedback, -1,
14161cb0ef41Sopenharmony_ci                                     literal_flags);
14171cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CreateLiteralParameters>>(  // --
14181cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateLiteralRegExp,                    // opcode
14191cb0ef41Sopenharmony_ci      Operator::kNoProperties,                             // properties
14201cb0ef41Sopenharmony_ci      "JSCreateLiteralRegExp",                             // name
14211cb0ef41Sopenharmony_ci      1, 1, 1, 1, 1, 2,                                    // counts
14221cb0ef41Sopenharmony_ci      parameters);                                         // parameter
14231cb0ef41Sopenharmony_ci}
14241cb0ef41Sopenharmony_ci
14251cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateFunctionContext(
14261cb0ef41Sopenharmony_ci    const ScopeInfoRef& scope_info, int slot_count, ScopeType scope_type) {
14271cb0ef41Sopenharmony_ci  CreateFunctionContextParameters parameters(scope_info, slot_count,
14281cb0ef41Sopenharmony_ci                                             scope_type);
14291cb0ef41Sopenharmony_ci  return zone()->New<Operator1<CreateFunctionContextParameters>>(   // --
14301cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateFunctionContext, Operator::kNoProperties,  // opcode
14311cb0ef41Sopenharmony_ci      "JSCreateFunctionContext",                                    // name
14321cb0ef41Sopenharmony_ci      0, 1, 1, 1, 1, 2,                                             // counts
14331cb0ef41Sopenharmony_ci      parameters);                                                  // parameter
14341cb0ef41Sopenharmony_ci}
14351cb0ef41Sopenharmony_ci
14361cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateCatchContext(
14371cb0ef41Sopenharmony_ci    const ScopeInfoRef& scope_info) {
14381cb0ef41Sopenharmony_ci  return zone()->New<Operator1<ScopeInfoTinyRef>>(
14391cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateCatchContext, Operator::kNoProperties,  // opcode
14401cb0ef41Sopenharmony_ci      "JSCreateCatchContext",                                    // name
14411cb0ef41Sopenharmony_ci      1, 1, 1, 1, 1, 2,                                          // counts
14421cb0ef41Sopenharmony_ci      ScopeInfoTinyRef{scope_info});                             // parameter
14431cb0ef41Sopenharmony_ci}
14441cb0ef41Sopenharmony_ci
14451cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateWithContext(
14461cb0ef41Sopenharmony_ci    const ScopeInfoRef& scope_info) {
14471cb0ef41Sopenharmony_ci  return zone()->New<Operator1<ScopeInfoTinyRef>>(
14481cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateWithContext, Operator::kNoProperties,  // opcode
14491cb0ef41Sopenharmony_ci      "JSCreateWithContext",                                    // name
14501cb0ef41Sopenharmony_ci      1, 1, 1, 1, 1, 2,                                         // counts
14511cb0ef41Sopenharmony_ci      ScopeInfoTinyRef{scope_info});                            // parameter
14521cb0ef41Sopenharmony_ci}
14531cb0ef41Sopenharmony_ci
14541cb0ef41Sopenharmony_ciconst Operator* JSOperatorBuilder::CreateBlockContext(
14551cb0ef41Sopenharmony_ci    const ScopeInfoRef& scope_info) {
14561cb0ef41Sopenharmony_ci  return zone()->New<Operator1<ScopeInfoTinyRef>>(               // --
14571cb0ef41Sopenharmony_ci      IrOpcode::kJSCreateBlockContext, Operator::kNoProperties,  // opcode
14581cb0ef41Sopenharmony_ci      "JSCreateBlockContext",                                    // name
14591cb0ef41Sopenharmony_ci      0, 1, 1, 1, 1, 2,                                          // counts
14601cb0ef41Sopenharmony_ci      ScopeInfoTinyRef{scope_info});                             // parameter
14611cb0ef41Sopenharmony_ci}
14621cb0ef41Sopenharmony_ci
14631cb0ef41Sopenharmony_ciScopeInfoRef ScopeInfoOf(JSHeapBroker* broker, const Operator* op) {
14641cb0ef41Sopenharmony_ci  DCHECK(IrOpcode::kJSCreateBlockContext == op->opcode() ||
14651cb0ef41Sopenharmony_ci         IrOpcode::kJSCreateWithContext == op->opcode() ||
14661cb0ef41Sopenharmony_ci         IrOpcode::kJSCreateCatchContext == op->opcode());
14671cb0ef41Sopenharmony_ci  return OpParameter<ScopeInfoTinyRef>(op).AsRef(broker);
14681cb0ef41Sopenharmony_ci}
14691cb0ef41Sopenharmony_ci
14701cb0ef41Sopenharmony_cibool operator==(ScopeInfoTinyRef const& lhs, ScopeInfoTinyRef const& rhs) {
14711cb0ef41Sopenharmony_ci  return lhs.object().location() == rhs.object().location();
14721cb0ef41Sopenharmony_ci}
14731cb0ef41Sopenharmony_ci
14741cb0ef41Sopenharmony_cibool operator!=(ScopeInfoTinyRef const& lhs, ScopeInfoTinyRef const& rhs) {
14751cb0ef41Sopenharmony_ci  return !(lhs == rhs);
14761cb0ef41Sopenharmony_ci}
14771cb0ef41Sopenharmony_ci
14781cb0ef41Sopenharmony_cisize_t hash_value(ScopeInfoTinyRef const& ref) {
14791cb0ef41Sopenharmony_ci  return reinterpret_cast<size_t>(ref.object().location());
14801cb0ef41Sopenharmony_ci}
14811cb0ef41Sopenharmony_ci
14821cb0ef41Sopenharmony_cistd::ostream& operator<<(std::ostream& os, ScopeInfoTinyRef const& ref) {
14831cb0ef41Sopenharmony_ci  return os << Brief(*ref.object());
14841cb0ef41Sopenharmony_ci}
14851cb0ef41Sopenharmony_ci
14861cb0ef41Sopenharmony_ci#undef CACHED_OP_LIST
14871cb0ef41Sopenharmony_ci
14881cb0ef41Sopenharmony_ci}  // namespace compiler
14891cb0ef41Sopenharmony_ci}  // namespace internal
14901cb0ef41Sopenharmony_ci}  // namespace v8
1491