5 #ifndef V8_COMPILER_JS_OPERATOR_H_ 6 #define V8_COMPILER_JS_OPERATOR_H_ 8 #include "src/base/compiler-specific.h" 9 #include "src/globals.h" 10 #include "src/maybe-handles.h" 11 #include "src/runtime/runtime.h" 12 #include "src/type-hints.h" 13 #include "src/vector-slot-pair.h" 19 class ObjectBoilerplateDescription;
20 class ArrayBoilerplateDescription;
22 class SharedFunctionInfo;
28 struct JSOperatorGlobalCache;
34 CallFrequency() : value_(std::numeric_limits<float>::quiet_NaN()) {}
36 DCHECK(!std::isnan(value));
39 bool IsKnown()
const {
return !IsUnknown(); }
40 bool IsUnknown()
const {
return std::isnan(value_); }
47 return bit_cast<
uint32_t>(this->value_) == bit_cast<uint32_t>(that.value_);
49 bool operator!=(
CallFrequency const& that)
const {
return !(*
this == that); }
55 static constexpr
float kNoFeedbackCallFrequency = -1;
70 : bit_field_(ArityField::encode(arity) |
71 StartIndexField::encode(start_index)) {}
73 size_t arity()
const {
return ArityField::decode(bit_field_); }
74 uint32_t start_index()
const {
return StartIndexField::decode(bit_field_); }
77 return this->bit_field_ == that.bit_field_;
80 return !(*
this == that);
94 std::ostream& operator<<(std::ostream&,
98 Operator const*) V8_WARN_UNUSED_RESULT;
106 : arity_(arity), frequency_(frequency), feedback_(feedback) {}
108 uint32_t arity()
const {
return arity_; }
132 : bit_field_(ArityField::encode(arity) |
133 StartIndexField::encode(start_index)) {}
135 size_t arity()
const {
return ArityField::decode(bit_field_); }
136 uint32_t start_index()
const {
return StartIndexField::decode(bit_field_); }
139 return this->bit_field_ == that.bit_field_;
142 return !(*
this == that);
159 Operator const*) V8_WARN_UNUSED_RESULT;
167 ConvertReceiverMode convert_mode,
168 SpeculationMode speculation_mode)
169 : bit_field_(ArityField::encode(arity) |
170 SpeculationModeField::encode(speculation_mode) |
171 ConvertReceiverModeField::encode(convert_mode)),
172 frequency_(frequency),
173 feedback_(feedback) {}
175 size_t arity()
const {
return ArityField::decode(bit_field_); }
176 CallFrequency const& frequency()
const {
return frequency_; }
177 ConvertReceiverMode convert_mode()
const {
178 return ConvertReceiverModeField::decode(bit_field_);
182 SpeculationMode speculation_mode()
const {
183 return SpeculationModeField::decode(bit_field_);
187 return this->bit_field_ == that.bit_field_ &&
188 this->frequency_ == that.frequency_ &&
189 this->feedback_ == that.feedback_;
191 bool operator!=(
CallParameters const& that)
const {
return !(*
this == that); }
195 return base::hash_combine(p.bit_field_, p.frequency_, p.feedback_);
219 : id_(
id), arity_(arity) {}
221 Runtime::FunctionId id()
const {
return id_; }
222 size_t arity()
const {
return arity_; }
225 const Runtime::FunctionId id_;
246 size_t depth()
const {
return depth_; }
247 size_t index()
const {
return index_; }
248 bool immutable()
const {
return immutable_; }
253 const bool immutable_;
254 const uint16_t depth_;
263 V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream&,
ContextAccess const&);
272 ScopeType scope_type);
275 int slot_count()
const {
return slot_count_; }
276 ScopeType scope_type()
const {
return scope_type_; }
280 int const slot_count_;
281 ScopeType
const scope_type_;
291 std::ostream& operator<<(std::ostream& os,
301 : name_(name), feedback_(feedback) {}
326 : feedback_(feedback) {}
349 : name_(name), feedback_(feedback), language_mode_(language_mode) {}
352 LanguageMode language_mode()
const {
return language_mode_; }
358 LanguageMode
const language_mode_;
366 std::ostream& operator<<(std::ostream&,
NamedAccess const&);
376 TypeofMode typeof_mode)
377 : name_(name), feedback_(feedback), typeof_mode_(typeof_mode) {}
380 TypeofMode typeof_mode()
const {
return typeof_mode_; }
387 const TypeofMode typeof_mode_;
407 : language_mode_(language_mode), name_(name), feedback_(feedback) {}
409 LanguageMode language_mode()
const {
return language_mode_; }
414 const LanguageMode language_mode_;
434 : feedback_(feedback), language_mode_(language_mode) {}
436 LanguageMode language_mode()
const {
return language_mode_; }
441 LanguageMode
const language_mode_;
455 CreateArgumentsType
const& CreateArgumentsTypeOf(
const Operator* op);
463 : arity_(arity), site_(site) {}
465 size_t arity()
const {
return arity_; }
488 IterationKind kind()
const {
return kind_; }
491 IterationKind
const kind_;
511 IterationKind iteration_kind)
512 : collection_kind_(collection_kind), iteration_kind_(iteration_kind) {
513 CHECK(!(collection_kind == CollectionKind::kSet &&
514 iteration_kind == IterationKind::kKeys));
517 CollectionKind collection_kind()
const {
return collection_kind_; }
518 IterationKind iteration_kind()
const {
return iteration_kind_; }
521 CollectionKind
const collection_kind_;
522 IterationKind
const iteration_kind_;
532 std::ostream& operator<<(std::ostream&,
543 : arity_(arity), map_(map) {}
545 size_t arity()
const {
return arity_; }
571 PretenureFlag pretenure)
572 : shared_info_(shared_info),
573 feedback_cell_(feedback_cell),
575 pretenure_(pretenure) {}
580 PretenureFlag pretenure()
const {
return pretenure_; }
586 PretenureFlag
const pretenure_;
605 : constant_(constant),
612 int length()
const {
return length_; }
613 int flags()
const {
return flags_; }
634 : feedback_(feedback), flags_(flags) {}
637 int flags()
const {
return flags_; }
654 enum class ForInMode : uint8_t {
655 kUseEnumCacheKeysAndIndices,
660 size_t hash_value(ForInMode);
662 std::ostream& operator<<(std::ostream&, ForInMode);
664 ForInMode ForInModeOf(Operator
const* op) V8_WARN_UNUSED_RESULT;
666 BinaryOperationHint BinaryOperationHintOf(
const Operator* op);
668 CompareOperationHint CompareOperationHintOf(
const Operator* op);
670 int RegisterCountOf(Operator
const* op) V8_WARN_UNUSED_RESULT;
672 int GeneratorStoreValueCountOf(
const Operator* op) V8_WARN_UNUSED_RESULT;
673 int RestoreRegisterIndexOf(
const Operator* op) V8_WARN_UNUSED_RESULT;
681 :
public NON_EXPORTED_BASE(ZoneObject) {
685 const Operator* Equal(CompareOperationHint hint);
686 const Operator* StrictEqual(CompareOperationHint hint);
687 const Operator* LessThan(CompareOperationHint hint);
688 const Operator* GreaterThan(CompareOperationHint hint);
689 const Operator* LessThanOrEqual(CompareOperationHint hint);
690 const Operator* GreaterThanOrEqual(CompareOperationHint hint);
697 const Operator* ShiftRightLogical();
698 const Operator* Add(BinaryOperationHint hint);
713 const Operator* ToNumberConvertBigInt();
719 const Operator* CreateArguments(CreateArgumentsType
type);
721 const Operator* CreateArrayIterator(IterationKind);
722 const Operator* CreateAsyncFunctionObject(
int register_count);
723 const Operator* CreateCollectionIterator(CollectionKind, IterationKind);
728 PretenureFlag pretenure = NOT_TENURED);
729 const Operator* CreateIterResultObject();
730 const Operator* CreateStringIterator();
731 const Operator* CreateKeyValueArray();
738 int number_of_elements);
740 const Operator* CreateArrayFromIterable();
741 const Operator* CreateEmptyLiteralObject();
743 const Operator* CreateLiteralObject(
746 int number_of_properties);
757 ConvertReceiverMode convert_mode = ConvertReceiverMode::kAny,
758 SpeculationMode speculation_mode = SpeculationMode::kDisallowSpeculation);
763 SpeculationMode speculation_mode = SpeculationMode::kDisallowSpeculation);
768 const Operator* ConstructForwardVarargs(
size_t arity,
uint32_t start_index);
773 const Operator* ConstructWithSpread(
780 const Operator* StoreProperty(LanguageMode language_mode,
794 const Operator* GetSuperConstructor();
796 const Operator* CreateGeneratorObject();
800 TypeofMode typeof_mode = NOT_INSIDE_TYPEOF);
801 const Operator* StoreGlobal(LanguageMode language_mode,
805 const Operator* LoadContext(
size_t depth,
size_t index,
bool immutable);
806 const Operator* StoreContext(
size_t depth,
size_t index);
808 const Operator* LoadModule(int32_t cell_index);
809 const Operator* StoreModule(int32_t cell_index);
811 const Operator* HasInPrototypeChain();
813 const Operator* OrdinaryHasInstance();
815 const Operator* AsyncFunctionEnter();
816 const Operator* AsyncFunctionReject();
817 const Operator* AsyncFunctionResolve();
820 const Operator* ForInNext(ForInMode);
821 const Operator* ForInPrepare(ForInMode);
827 const Operator* GeneratorStore(
int value_count);
830 const Operator* GeneratorRestoreContinuation();
831 const Operator* GeneratorRestoreContext();
834 const Operator* GeneratorRestoreRegister(
int index);
835 const Operator* GeneratorRestoreInputOrDebugPos();
841 const Operator* PerformPromiseThen();
847 int slot_count, ScopeType scope_type);
857 Zone* zone()
const {
return zone_; }
869 #endif // V8_COMPILER_JS_OPERATOR_H_