5#ifndef V8_COMPILER_TURBOSHAFT_OPERATIONS_H_
6#define V8_COMPILER_TURBOSHAFT_OPERATIONS_H_
40#if V8_ENABLE_WEBASSEMBLY
52class JSWasmCallParameters;
53class DeoptimizeParameters;
117#ifdef V8_INTL_SUPPORT
118#define TURBOSHAFT_INTL_OPERATION_LIST(V) V(StringToCaseIntl)
120#define TURBOSHAFT_INTL_OPERATION_LIST(V)
123#ifdef V8_ENABLE_WEBASSEMBLY
126#define TURBOSHAFT_WASM_OPERATION_LIST(V) \
138 V(AnyConvertExtern) \
139 V(ExternConvertAny) \
140 V(WasmTypeAnnotation) \
146 V(WasmAllocateArray) \
147 V(WasmAllocateStruct) \
150 V(StringPrepareForGetCodeUnit)
152#ifdef V8_ENABLE_WASM_DEINTERLEAVED_MEM_OPS
153#define TURBOSHAFT_DEINTERLEAVED_OPERATION_LIST(V) \
154 V(Simd128LoadPairDeinterleave)
156#define TURBOSHAFT_DEINTERLEAVED_OPERATION_LIST(V)
159#if V8_ENABLE_WASM_SIMD256_REVEC
160#define TURBOSHAFT_SIMD256_COMMOM_OPERATION_LIST(V) \
162 V(Simd256Extract128Lane) \
163 V(Simd256LoadTransform) \
171#if V8_TARGET_ARCH_X64
172#define TURBOSHAFT_SIMD256_X64_OPERATION_LIST(V) \
177#define TURBOSHAFT_SIMD256_OPERATION_LIST(V) \
178 TURBOSHAFT_SIMD256_COMMOM_OPERATION_LIST(V) \
179 TURBOSHAFT_SIMD256_X64_OPERATION_LIST(V)
181#define TURBOSHAFT_SIMD256_OPERATION_LIST(V) \
182 TURBOSHAFT_SIMD256_COMMOM_OPERATION_LIST(V)
186#define TURBOSHAFT_SIMD256_OPERATION_LIST(V)
189#define TURBOSHAFT_SIMD_OPERATION_LIST(V) \
198 V(Simd128ExtractLane) \
199 V(Simd128ReplaceLane) \
200 V(Simd128LaneMemory) \
201 V(Simd128LoadTransform) \
203 TURBOSHAFT_SIMD256_OPERATION_LIST(V) \
204 TURBOSHAFT_DEINTERLEAVED_OPERATION_LIST(V)
207#define TURBOSHAFT_WASM_OPERATION_LIST(V)
208#define TURBOSHAFT_SIMD_OPERATION_LIST(V)
211#define TURBOSHAFT_OPERATION_LIST_BLOCK_TERMINATOR(V) \
221#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
222#define TURBOSHAFT_CPED_OPERATION_LIST(V) \
223 V(GetContinuationPreservedEmbedderData) \
224 V(SetContinuationPreservedEmbedderData)
226#define TURBOSHAFT_CPED_OPERATION_LIST(V)
231#define TURBOSHAFT_SIMPLIFIED_OPERATION_LIST(V) \
232 TURBOSHAFT_INTL_OPERATION_LIST(V) \
233 TURBOSHAFT_CPED_OPERATION_LIST(V) \
236 V(BigIntComparison) \
239 V(WordBinopDeoptOnOverflow) \
240 V(CheckEqualsInternalizedString) \
245 V(ObjectIsNumericValue) \
246 V(Float64SameValue) \
250 V(ConvertJSPrimitiveToObject) \
251 V(ConvertJSPrimitiveToUntagged) \
252 V(ConvertJSPrimitiveToUntaggedOrDeopt) \
253 V(ConvertUntaggedToJSPrimitive) \
254 V(ConvertUntaggedToJSPrimitiveOrDeopt) \
255 V(TruncateJSPrimitiveToUntagged) \
256 V(TruncateJSPrimitiveToUntaggedOrDeopt) \
257 V(DoubleArrayMinMax) \
258 V(EnsureWritableFastElements) \
260 V(FindOrderedHashEntry) \
261 V(LoadDataViewElement) \
262 V(LoadFieldByIndex) \
264 V(LoadStackArgument) \
265 V(LoadTypedElement) \
266 V(StoreDataViewElement) \
268 V(StoreTypedElement) \
269 V(MaybeGrowFastElements) \
270 V(NewArgumentsElements) \
275 V(StringComparison) \
277 V(StringFromCodePointAt) \
280 V(TypedArrayLength) \
283 V(TransitionAndStoreArrayElement) \
284 V(TransitionElementsKind) \
285 V(TransitionElementsKindOrCheckMap) \
287 V(CheckTurboshaftTypeOf) \
292#define TURBOSHAFT_MACHINE_OPERATION_LIST(V) \
296 V(OverflowCheckedBinop) \
298 V(OverflowCheckedUnary) \
304 V(BitcastWord32PairToFloat64) \
309 V(LoadRootRegister) \
315 V(StackPointerGreaterThan) \
320 IF_WASM(V, LoadStackPointer) \
321 IF_WASM(V, SetStackPointer) \
332 V(AtomicWord32Pair) \
338#define TURBOSHAFT_JS_THROWING_OPERATION_LIST(V) \
343#define TURBOSHAFT_JS_OPERATION_LIST(V) \
344 TURBOSHAFT_JS_THROWING_OPERATION_LIST(V)
349#define TURBOSHAFT_OTHER_OPERATION_LIST(V) \
351 V(DecodeExternalPointer) \
354#define TURBOSHAFT_OPERATION_LIST_NOT_BLOCK_TERMINATOR(V) \
355 TURBOSHAFT_WASM_OPERATION_LIST(V) \
356 TURBOSHAFT_SIMD_OPERATION_LIST(V) \
357 TURBOSHAFT_MACHINE_OPERATION_LIST(V) \
358 TURBOSHAFT_SIMPLIFIED_OPERATION_LIST(V) \
359 TURBOSHAFT_JS_OPERATION_LIST(V) \
360 TURBOSHAFT_OTHER_OPERATION_LIST(V)
362#define TURBOSHAFT_OPERATION_LIST(V) \
363 TURBOSHAFT_OPERATION_LIST_BLOCK_TERMINATOR(V) \
364 TURBOSHAFT_OPERATION_LIST_NOT_BLOCK_TERMINATOR(V)
367#define ENUM_CONSTANT(Name) k##Name,
374 return static_cast<std::underlying_type_t<Opcode>
>(
x);
377#define FORWARD_DECLARE(Name) struct Name##Op;
379#undef FORWARD_DECLARE
385#define OPERATION_OPCODE_MAP_CASE(Name) \
387 struct operation_to_opcode_map<Name##Op> \
388 : std::integral_constant<Opcode, Opcode::k##Name> {};
390#undef OPERATION_OPCODE_MAP_CASE
393template <
typename Op>
396template <
typename Op>
399template <
typename Op, u
int64_t Mask, u
int64_t Value>
403 static constexpr uint64_t value =
Value;
406#define COUNT_OPCODES(Name) +1
411#define COUNT_OPCODES(Name) +1
421#define TURBOSHAFT_THROWING_STATIC_OUTPUTS_OPERATIONS_LIST(V) \
422 TURBOSHAFT_JS_THROWING_OPERATION_LIST(V)
426#define TURBOSHAFT_THROWING_OPERATIONS_LIST(V) \
427 TURBOSHAFT_THROWING_STATIC_OUTPUTS_OPERATIONS_LIST(V) \
433#define CASE(Name) case Opcode::k##Name:
459#define THROWING_OP_BOILERPLATE(...) \
460 static constexpr RegisterRepresentation kOutputRepsStorage[]{__VA_ARGS__}; \
461 static constexpr base::Vector<const RegisterRepresentation> kOutReps = \
462 base::VectorOf(kOutputRepsStorage, arraysize(kOutputRepsStorage)); \
463 base::Vector<const RegisterRepresentation> outputs_rep() const { \
466 LazyDeoptOnThrow lazy_deopt_on_throw;
471 std::initializer_list<RegisterRepresentation> values) {
472 storage.
resize(values.size());
474 for (
auto&& value : values) {
495 size_t index =
static_cast<size_t>(rep.
value()) * 2;
516#ifdef V8_ENABLE_WASM_SIMD256_REVEC
569 return bits() == other.bits();
572 return bits() != other.bits();
663 return (
bits() & ~other.bits()) == 0;
670 result.consumes.after_raw_heap_access =
true;
679 result.can_allocate =
true;
693 result.consumes.before_raw_heap_access =
true;
701 result.consumes.store_heap_memory =
true;
710 result.consumes.store_off_heap_memory =
true;
717 result.produces.store_off_heap_memory =
true;
719 result.consumes.store_off_heap_memory =
true;
721 result.consumes.load_off_heap_memory =
true;
723 result.consumes.control_flow =
true;
731 result.produces.store_heap_memory =
true;
733 result.consumes.store_heap_memory =
true;
735 result.consumes.load_heap_memory =
true;
737 result.consumes.control_flow =
true;
770 result.produces.control_flow =
true;
772 result.consumes.store_heap_memory =
true;
773 result.consumes.store_off_heap_memory =
true;
851 return static_cast<size_t>(effects.
bits());
855 return first.produces.bits() & (
second.consumes.bits());
864 return produces.
bits() & (
second.consumes.bits());
903 val =
static_cast<uint8_t
>(std::min<uint32_t>(sum,
kMax));
908 uint8_t
val =
static_cast<uint8_t
>(std::min<size_t>(value,
kMax));
915 static constexpr uint8_t
kMax = std::numeric_limits<uint8_t>::max();
924template <
typename T, u
int64_t M, u
int64_t V>
961 static size_t StorageSlotCount(
Opcode opcode,
size_t input_count);
963 return StorageSlotCount(opcode, input_count);
972 if constexpr (std::is_base_of_v<Operation, Op>) {
973 return opcode == Op::opcode;
976 return IsOpmask<Op>();
991 if (!Is<Op>())
return nullptr;
996 if (!Is<Op>())
return nullptr;
1001 return turboshaft::IsBlockTerminator(opcode);
1005 return Effects().is_required_when_unused();
1010 void PrintInputs(std::ostream& os,
const std::string& op_index_prefix)
const;
1011 void PrintOptions(std::ostream& os)
const;
1014 bool IsOnlyUserOf(
const Operation& value,
const Graph& graph)
const;
1022 : opcode(opcode), input_count(input_count) {
1024 std::numeric_limits<
decltype(this->input_count)>::max());
1027 template <
class OpmaskT>
1034 static_assert(std::is_same_v<
1036 typename OpMaskT<
typename OpmaskT::operation, OpmaskT::mask,
1037 OpmaskT::value>::operation>);
1040 memcpy(&b,
this,
sizeof(uint64_t));
1042 return b == OpmaskT::value;
1051 const char* op_index_prefix =
"#";
1068template <
class Op,
class =
void>
1072 : std::bool_constant<true> {};
1079template <
class Derived>
1088 return turboshaft::IsBlockTerminator(opcode);
1092 derived_this().Effects().is_required_when_unused();
1097 return Derived::Effects();
1099 return std::nullopt;
1104 return *
static_cast<const Derived*
>(
this);
1109 return {
reinterpret_cast<OpIndex*
>(
reinterpret_cast<char*
>(
this) +
1111 derived_this().input_count};
1114 return {
reinterpret_cast<const OpIndex*
>(
1115 reinterpret_cast<const char*
>(
this) +
sizeof(Derived)),
1116 derived_this().input_count};
1123 template <
typename T>
1135 static_assert(
sizeof(Derived) %
sizeof(
OpIndex) == 0);
1136 size_t result = std::max<size_t>(
1137 2, (
r - 1 +
sizeof(Derived) /
sizeof(
OpIndex) + input_count) /
r);
1143 template <
class... Args>
1147 Derived*
result =
new (ptr) Derived(
args...);
1149 result->Validate(*graph);
1152 result->inputs_rep(storage);
1155 size_t end = std::min<size_t>(expected.
size(),
result->input_count);
1156 for (
size_t i = 0;
i <
end; ++
i) {
1157 if (expected[
i] == MaybeRegisterRepresentation::None())
continue;
1158 ValidateOpInputRep(*graph,
result->inputs()[
i],
1168 template <
class... Args>
1171 return New(graph, inputs.
size(), inputs,
args...);
1175 static_assert((std::is_base_of<OperationT, Derived>::value));
1177 static_assert(std::is_trivially_copyable<Derived>::value);
1179 static_assert(std::is_trivially_destructible<Derived>::value);
1183 this->inputs().OverwriteWith(
1194 return derived_this() == other.derived_this();
1197 return derived_this().inputs() == other.derived_this().inputs() &&
1198 derived_this().options() == other.derived_this().options();
1200 template <
typename... Args>
1206 return HashWithOptions(derived_this().
options());
1209 void PrintInputs(std::ostream& os,
const std::string& op_index_prefix)
const {
1212 for (
OpIndex input : inputs()) {
1213 if (!first) os <<
", ";
1215 os << op_index_prefix << input.id();
1221 const auto& options = derived_this().options();
1222 constexpr size_t options_count =
1223 std::tuple_size<std::remove_reference_t<
decltype(
options)>>::value;
1224 if (options_count == 0) {
1227 PrintOptionsHelper(os, options, std::make_index_sequence<options_count>());
1236 template <
class...
T,
size_t...
I>
1238 const std::tuple<T...>& options,
1239 std::index_sequence<I...>) {
1243 ((first ? (first =
false, os << std::get<I>(options))
1244 : os <<
", " << std::get<I>(options)),
1266template <
size_t InputCount,
class Derived>
1272 static constexpr uint16_t input_count = InputCount;
1274 template <
class... Args>
1277 static_assert(
sizeof...(Args) == InputCount,
"wrong number of inputs");
1279 OpIndex* inputs = this->inputs().begin();
1280 ((inputs[
i++] =
args), ...);
1284 template <
class... Args>
1291 template <
typename Fn,
typename Mapper,
size_t... InputI,
size_t... OptionI>
1293 std::index_sequence<InputI...>,
1294 std::index_sequence<OptionI...>)
const {
1295 auto options = this->derived_this().options();
1297 return fn(mapper.Map(this->input(InputI))...,
1298 std::get<OptionI>(options)...);
1301 template <
typename Fn,
typename Mapper>
1304 fn, mapper, std::make_index_sequence<input_count>(),
1305 std::make_index_sequence<
1306 std::tuple_size_v<
decltype(this->derived_this().
options())>>());
1310#define SUPPORTED_OPERATIONS_LIST(V) \
1311 V(float32_round_down, Float32RoundDown) \
1312 V(float64_round_down, Float64RoundDown) \
1313 V(float32_round_up, Float32RoundUp) \
1314 V(float64_round_up, Float64RoundUp) \
1315 V(float32_round_to_zero, Float32RoundTruncate) \
1316 V(float64_round_to_zero, Float64RoundTruncate) \
1317 V(float32_round_ties_even, Float32RoundTiesEven) \
1318 V(float64_round_ties_even, Float64RoundTiesEven) \
1319 V(float64_round_ties_away, Float64RoundTiesAway) \
1320 V(int32_div_is_safe, Int32DivIsSafe) \
1321 V(uint32_div_is_safe, Uint32DivIsSafe) \
1322 V(word32_shift_is_safe, Word32ShiftIsSafe) \
1323 V(word32_ctz, Word32Ctz) \
1324 V(word64_ctz, Word64Ctz) \
1325 V(word64_ctz_lowerable, Word64CtzLowerable) \
1326 V(word32_popcnt, Word32Popcnt) \
1327 V(word64_popcnt, Word64Popcnt) \
1328 V(word32_reverse_bits, Word32ReverseBits) \
1329 V(word64_reverse_bits, Word64ReverseBits) \
1330 V(float32_select, Float32Select) \
1331 V(float64_select, Float64Select) \
1332 V(int32_abs_with_overflow, Int32AbsWithOverflow) \
1333 V(int64_abs_with_overflow, Int64AbsWithOverflow) \
1334 V(word32_rol, Word32Rol) \
1335 V(word64_rol, Word64Rol) \
1336 V(word64_rol_lowerable, Word64RolLowerable) \
1337 V(sat_conversion_is_safe, SatConversionIsSafe) \
1338 V(word32_select, Word32Select) \
1339 V(word64_select, Word64Select) \
1340 V(float64_to_float16_raw_bits, Float16RawBitsConversion) \
1341 V(float16_raw_bits_to_float64, Float16RawBitsConversion) \
1345#define DECLARE_FIELD(name, machine_name) bool name##_;
1346#define DECLARE_GETTER(name, machine_name) \
1347 static bool name() { \
1348 if constexpr (DEBUG_BOOL) { \
1349 base::MutexGuard lock(mutex_.Pointer()); \
1350 DCHECK(initialized_); \
1352 return instance_.name##_; \
1356 static void Initialize();
1357 static bool IsUnalignedLoadSupported(MemoryRepresentation repr);
1358 static bool IsUnalignedStoreSupported(MemoryRepresentation repr);
1364 static
bool initialized_;
1369#undef DECLARE_GETTER
1376 return base::VectorOf(rep_array);
1383 return base::VectorOf(rep_array);
1389 std::initializer_list<RegisterRepresentation> expected_rep,
1391 std::optional<size_t> projection_index = {});
1395 std::optional<size_t> projection_index = {});
1424 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
1435#define GENERIC_BINOP_LIST(V) \
1447 V(ShiftRightLogical) \
1451 V(LessThanOrEqual) \
1453 V(GreaterThanOrEqual)
1455#define DEFINE_KIND(Name) k##Name,
1468 MaybeRegisterRepresentation::Tagged()>();
1479 :
Base(left, right, frame_state, context),
1481 lazy_deopt_on_throw(lazy_deopt_on_throw) {}
1483 auto options()
const {
return std::tuple{
kind, lazy_deopt_on_throw}; }
1489#define GENERIC_UNOP_LIST(V) \
1495#define DEFINE_KIND(Name) k##Name,
1507 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
1516 :
Base(input, frame_state, context),
1518 lazy_deopt_on_throw(lazy_deopt_on_throw) {}
1520 auto options()
const {
return std::tuple{
kind, lazy_deopt_on_throw}; }
1534 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
1544 :
Base(input, frame_state, context),
1546 lazy_deopt_on_throw(lazy_deopt_on_throw) {}
1548 auto options()
const {
return std::tuple{
kind, lazy_deopt_on_throw}; }
1563 return RepVector<RegisterRepresentation::Word32()>();
1568 return MaybeRepVector<MaybeRegisterRepresentation::Word32()>();
1584 kSignedMulOverflownBits,
1585 kUnsignedMulOverflownBits,
1606 return InputsRepFactory::PairOf(rep);
1609 template <
class WordType = Word>
1613 return input<WordType>(0);
1615 template <
class WordType = Word>
1619 return input<WordType>(1);
1628 case Kind::kSignedMulOverflownBits:
1629 case Kind::kUnsignedMulOverflownBits:
1630 case Kind::kBitwiseAnd:
1631 case Kind::kBitwiseOr:
1632 case Kind::kBitwiseXor:
1635 case Kind::kSignedDiv:
1636 case Kind::kUnsignedDiv:
1637 case Kind::kSignedMod:
1638 case Kind::kUnsignedMod:
1647 case Kind::kBitwiseAnd:
1648 case Kind::kBitwiseOr:
1649 case Kind::kBitwiseXor:
1651 case Kind::kSignedMulOverflownBits:
1652 case Kind::kUnsignedMulOverflownBits:
1654 case Kind::kSignedDiv:
1655 case Kind::kUnsignedDiv:
1656 case Kind::kSignedMod:
1657 case Kind::kUnsignedMod:
1667 case Kind::kBitwiseAnd:
1668 case Kind::kBitwiseOr:
1669 case Kind::kBitwiseXor:
1672 case Kind::kSignedMulOverflownBits:
1673 case Kind::kUnsignedMulOverflownBits:
1674 case Kind::kSignedDiv:
1675 case Kind::kUnsignedDiv:
1676 case Kind::kSignedMod:
1677 case Kind::kUnsignedMod:
1686 void PrintOptions(std::ostream& os)
const;
1711 return InputsRepFactory::PairOf(rep);
1739 rep == FloatRepresentation::Float64());
1742 void PrintOptions(std::ostream& os)
const;
1751 kShiftRightArithmetic,
1759 return RepVector<RegisterRepresentation::Word32(),
1760 RegisterRepresentation::Word32()>();
1766 MaybeRegisterRepresentation::Word32(),
1767 MaybeRegisterRepresentation::Word32(),
1768 MaybeRegisterRepresentation::Word32()>();
1778 :
Base(left_low, left_high, right_low, right_high),
kind(
kind) {}
1781 void PrintOptions(std::ostream& os)
const;
1807 return InputsRepFactory::PairOf(rep);
1818 :
Base(left, right, frame_state),
1826 rep == WordRepresentation::Word32());
1828 auto options()
const {
return std::tuple{
kind, rep, feedback, mode}; }
1829 void PrintOptions(std::ostream& os)
const;
1834 static constexpr int kValueIndex = 0;
1835 static constexpr int kOverflowIndex = 1;
1847 switch (rep.
value()) {
1848 case WordRepresentation::Word32():
1849 return RepVector<RegisterRepresentation::Word32(),
1850 RegisterRepresentation::Word32()>();
1851 case WordRepresentation::Word64():
1852 return RepVector<RegisterRepresentation::Word64(),
1853 RegisterRepresentation::Word32()>();
1859 return InputsRepFactory::PairOf(rep);
1867 case Kind::kSignedAdd:
1868 case Kind::kSignedMul:
1870 case Kind::kSignedSub:
1880 void PrintOptions(std::ostream& os)
const;
1887 kCountTrailingZeros,
1901 return InputsRepFactory::SingleRep(rep);
1918 static constexpr int kValueIndex = 0;
1919 static constexpr int kOverflowIndex = 1;
1921 enum class Kind : uint8_t { kAbs };
1926 switch (rep.
value()) {
1927 case WordRepresentation::Word32():
1928 return RepVector<RegisterRepresentation::Word32(),
1929 RegisterRepresentation::Word32()>();
1930 case WordRepresentation::Word64():
1931 return RepVector<RegisterRepresentation::Word64(),
1932 RegisterRepresentation::Word32()>();
1938 return InputsRepFactory::SingleRep(rep);
1993 return InputsRepFactory::SingleRep(rep);
2010 kShiftRightArithmeticShiftOutZeros,
2011 kShiftRightArithmetic,
2029 RegisterRepresentation::Word32()});
2032 template <
typename WordT = Word>
2033 requires(IsWord<WordT>())
2035 DCHECK(IsValidTypeFor<WordT>(rep));
2036 return input<WordT>(0);
2044 case Kind::kShiftRightArithmeticShiftOutZeros:
2045 case Kind::kShiftRightArithmetic:
2046 case Kind::kShiftRightLogical:
2048 case Kind::kShiftLeft:
2049 case Kind::kRotateRight:
2050 case Kind::kRotateLeft:
2058 case Kind::kShiftLeft:
2060 case Kind::kShiftRightArithmeticShiftOutZeros:
2061 case Kind::kShiftRightArithmetic:
2062 case Kind::kShiftRightLogical:
2063 case Kind::kRotateRight:
2064 case Kind::kRotateLeft:
2075 ShiftOp::Kind
kind);
2090 return RepVector<RegisterRepresentation::Word32()>();
2095 return InputsRepFactory::PairOf(rep);
2100 template <
typename T = Any>
2102 DCHECK(IsValidTypeFor<T>(rep));
2105 template <
typename T = Any>
2107 DCHECK(IsValidTypeFor<T>(rep));
2115 if (
kind == Kind::kEqual) {
2117 RegisterRepresentation::Word64(),
2118 RegisterRepresentation::Float32(),
2119 RegisterRepresentation::Float64(),
2120 RegisterRepresentation::Tagged()));
2123#ifdef V8_COMPRESS_POINTERS
2126 if (input_rep == RegisterRepresentation::Tagged()) {
2127 input_rep = RegisterRepresentation::Compressed();
2131 ValidateOpInputRep(graph, left(), input_rep);
2132 ValidateOpInputRep(graph, right(), input_rep);
2137 RegisterRepresentation::Word64(),
2138 RegisterRepresentation::Float32(),
2139 RegisterRepresentation::Float64()));
2141 rep ==
any_of(RegisterRepresentation::Float32(),
2142 RegisterRepresentation::Float64()),
2143 kind ==
any_of(Kind::kSignedLessThan, Kind::kSignedLessThanOrEqual));
2158 kSignedFloatTruncateOverflowToMin,
2159 kUnsignedFloatTruncateOverflowToMin,
2165 kJSFloat16TruncateWithBitcast,
2168 kJSFloat16ChangeWithBitcast,
2208 bool signalling_nan_possible) {
2210 case Kind::kFloatConversion:
2211 return from == RegisterRepresentation::Float32() &&
2212 to == RegisterRepresentation::Float64() &&
2213 reverse_kind == Kind::kFloatConversion &&
2214 !signalling_nan_possible;
2215 case Kind::kSignedFloatTruncateOverflowToMin:
2216 return assumption == Assumption::kReversible &&
2217 reverse_kind == Kind::kSignedToFloat;
2218 case Kind::kUnsignedFloatTruncateOverflowToMin:
2219 return assumption == Assumption::kReversible &&
2220 reverse_kind == Kind::kUnsignedToFloat;
2221 case Kind::kJSFloatTruncate:
2223 case Kind::kJSFloat16TruncateWithBitcast:
2224 case Kind::kJSFloat16ChangeWithBitcast:
2226 case Kind::kSignedToFloat:
2227 if (from == RegisterRepresentation::Word32() &&
2228 to == RegisterRepresentation::Float64()) {
2229 return reverse_kind ==
any_of(Kind::kSignedFloatTruncateOverflowToMin,
2230 Kind::kJSFloatTruncate);
2232 return assumption == Assumption::kReversible &&
2234 any_of(Kind::kSignedFloatTruncateOverflowToMin);
2236 case Kind::kUnsignedToFloat:
2237 if (from == RegisterRepresentation::Word32() &&
2238 to == RegisterRepresentation::Float64()) {
2239 return reverse_kind ==
2240 any_of(Kind::kUnsignedFloatTruncateOverflowToMin,
2241 Kind::kJSFloatTruncate);
2243 return assumption == Assumption::kReversible &&
2244 reverse_kind == Kind::kUnsignedFloatTruncateOverflowToMin;
2246 case Kind::kExtractHighHalf:
2247 case Kind::kExtractLowHalf:
2249 case Kind::kZeroExtend:
2250 case Kind::kSignExtend:
2251 DCHECK_EQ(from, RegisterRepresentation::Word32());
2252 DCHECK_EQ(to, RegisterRepresentation::Word64());
2253 return reverse_kind == Kind::kTruncate;
2254 case Kind::kTruncate:
2255 DCHECK_EQ(from, RegisterRepresentation::Word64());
2256 DCHECK_EQ(to, RegisterRepresentation::Word32());
2257 return reverse_kind == Kind::kBitcast;
2258 case Kind::kBitcast:
2259 return reverse_kind == Kind::kBitcast;
2264 return IsReversible(
kind, assumption, from, to, reverse_kind,
2265 signalling_nan_possible);
2270 return base::VectorOf(&to, 1);
2275 return InputsRepFactory::SingleRep(from);
2278 template <
typename Type = Untagged>
2281 DCHECK(IsValidTypeFor<Type>(from));
2282 return Base::input<Type>(0);
2287 :
Base(input),
kind(
kind), assumption(assumption), from(from), to(to) {}
2290 DCHECK_NE(from, RegisterRepresentation::Tagged());
2291 DCHECK_NE(to, RegisterRepresentation::Tagged());
2313 kFloat64ToAdditiveSafeInteger,
2324 case Kind::kUint32ToInt32:
2325 case Kind::kInt64ToInt32:
2326 case Kind::kUint64ToInt32:
2327 case Kind::kFloat64ToInt32:
2328 case Kind::kFloat64ToUint32:
2329 return RepVector<RegisterRepresentation::Word32()>();
2330 case Kind::kUint64ToInt64:
2331 case Kind::kFloat64ToAdditiveSafeInteger:
2332 case Kind::kFloat64ToInt64:
2333 return RepVector<RegisterRepresentation::Word64()>();
2334 case Kind::kFloat64NotHole:
2335 return RepVector<RegisterRepresentation::Float64()>();
2342 case Kind::kUint32ToInt32:
2343 return MaybeRepVector<MaybeRegisterRepresentation::Word32()>();
2344 case Kind::kInt64ToInt32:
2345 case Kind::kUint64ToInt32:
2346 case Kind::kUint64ToInt64:
2347 return MaybeRepVector<MaybeRegisterRepresentation::Word64()>();
2348 case Kind::kFloat64ToInt32:
2349 case Kind::kFloat64ToUint32:
2350 case Kind::kFloat64ToAdditiveSafeInteger:
2351 case Kind::kFloat64ToInt64:
2352 case Kind::kFloat64NotHole:
2353 return MaybeRepVector<MaybeRegisterRepresentation::Float64()>();
2363 :
Base(input, frame_state),
2365 minus_zero_mode(minus_zero_mode),
2366 feedback(feedback) {}
2369 DCHECK(
Get(graph, frame_state()).Is<FrameStateOp>());
2372 auto options()
const {
return std::tuple{
kind, minus_zero_mode, feedback}; }
2380 static constexpr uint32_t kSuccessValue = 1;
2381 static constexpr uint32_t kFailureValue = 0;
2384 kSignedFloatTruncateOverflowUndefined,
2385 kUnsignedFloatTruncateOverflowUndefined,
2393 switch (to.value()) {
2394 case WordRepresentation::Word32():
2395 return RepVector<RegisterRepresentation::Word32(),
2396 RegisterRepresentation::Word32()>();
2397 case WordRepresentation::Word64():
2398 return RepVector<RegisterRepresentation::Word64(),
2399 RegisterRepresentation::Word32()>();
2405 return InputsRepFactory::SingleRep(from);
2423 return RepVector<RegisterRepresentation::Float64()>();
2429 MaybeRegisterRepresentation::Word32()>();
2436 :
Base(high_word32, low_word32) {}
2456 case Kind::kTagAndSmiBits:
2458 case Kind::kHeapObject:
2467 return base::VectorOf(&to, 1);
2472 return InputsRepFactory::SingleRep(from);
2482 if (
kind == Kind::kSmi) {
2483 DCHECK((from.IsWord() && to.IsTaggedOrCompressed()) ||
2484 (from.IsTaggedOrCompressed() && to.IsWord()));
2486 to == RegisterRepresentation::Word64(),
2491 DCHECK((from.IsWord() && to == RegisterRepresentation::Tagged()) ||
2492 (from == RegisterRepresentation::Tagged() &&
2493 to == RegisterRepresentation::WordPtr()) ||
2494 (from == RegisterRepresentation::Compressed() &&
2495 to == RegisterRepresentation::Word32()));
2511 return base::VectorOf(&rep, 1);
2516 return InitVectorOf(storage, {RegisterRepresentation::Word32(), rep, rep});
2521 :
Base(cond, vtrue, vfalse), rep(rep), hint(hint), implem(implem) {}
2525 (rep == RegisterRepresentation::Word32() &&
2526 SupportedOperations::word32_select()) ||
2527 (rep == RegisterRepresentation::Word64() &&
2528 SupportedOperations::word64_select()) ||
2529 (rep == RegisterRepresentation::Float32() &&
2530 SupportedOperations::float32_select()) ||
2531 (rep == RegisterRepresentation::Float64() &&
2532 SupportedOperations::float64_select()));
2539 auto options()
const {
return std::tuple{rep, hint, implem}; }
2552 return base::VectorOf(&rep, 1);
2557 storage.
resize(input_count);
2558 for (
size_t i = 0;
i < input_count; ++
i) {
2561 return base::VectorOf(storage);
2564 static constexpr size_t kLoopPhiBackEdgeIndex = 1;
2567 :
Base(inputs), rep(rep) {}
2569 template <
typename Fn,
typename Mapper>
2571 auto mapped_inputs = mapper.template
Map<64>(inputs());
2572 return fn(base::VectorOf(mapped_inputs), rep);
2587 return base::VectorOf(&rep, 1);
2592 return InputsRepFactory::SingleRep(rep);
2597 :
Base(first), rep(rep) {}
2613 kCompressedHeapObject,
2615 kRelocatableWasmCall,
2616 kRelocatableWasmStubCall,
2617 kRelocatableWasmIndirectCallTarget,
2618 kRelocatableWasmCanonicalSignatureId
2630 Storage(uint64_t integral = 0) : integral(integral) {}
2646 return base::VectorOf(&rep, 1);
2656 case Kind::kRelocatableWasmCanonicalSignatureId:
2658 return RegisterRepresentation::Word32();
2660 return RegisterRepresentation::Word64();
2661 case Kind::kFloat32:
2662 return RegisterRepresentation::Float32();
2663 case Kind::kFloat64:
2664 return RegisterRepresentation::Float64();
2665 case Kind::kExternal:
2666 case Kind::kTaggedIndex:
2667 case Kind::kTrustedHeapObject:
2668 case Kind::kRelocatableWasmCall:
2669 case Kind::kRelocatableWasmStubCall:
2670 return RegisterRepresentation::WordPtr();
2671 case Kind::kRelocatableWasmIndirectCallTarget:
2672 return RegisterRepresentation::Word32();
2674 case Kind::kHeapObject:
2676 return RegisterRepresentation::Tagged();
2677 case Kind::kCompressedHeapObject:
2678 return RegisterRepresentation::Compressed();
2687 kind == Kind::kWord32,
2688 storage.integral <= WordRepresentation::Word32().MaxUnsignedValue());
2690 kind == Kind::kRelocatableWasmCanonicalSignatureId,
2691 storage.integral <= WordRepresentation::Word32().MaxSignedValue());
2696 return storage.integral;
2703 case Kind::kRelocatableWasmCanonicalSignatureId:
2704 return static_cast<int32_t
>(storage.integral);
2706 return static_cast<int64_t
>(storage.integral);
2714 return static_cast<uint32_t
>(storage.integral);
2719 return static_cast<uint64_t
>(storage.integral);
2729 return storage.float64;
2734 return storage.float32;
2739 return storage.float64;
2744 return static_cast<int32_t
>(
static_cast<uint32_t
>(storage.integral));
2749 return storage.external;
2753 DCHECK(
kind == Kind::kHeapObject ||
kind == Kind::kCompressedHeapObject ||
2754 kind == Kind::kTrustedHeapObject);
2755 return storage.handle;
2761 return static_cast<uint32_t
>(
value) == word32();
2763 return value == word64();
2770 return kind == Kind::kWord32 ||
kind == Kind::kWord64 ||
2771 kind == Kind::kRelocatableWasmCall ||
2772 kind == Kind::kRelocatableWasmStubCall ||
2773 kind == Kind::kRelocatableWasmCanonicalSignatureId ||
2774 kind == Kind::kRelocatableWasmIndirectCallTarget;
2779 void PrintOptions(std::ostream& os)
const;
2786 case Kind::kTaggedIndex:
2787 case Kind::kRelocatableWasmCall:
2788 case Kind::kRelocatableWasmStubCall:
2789 case Kind::kRelocatableWasmIndirectCallTarget:
2790 case Kind::kRelocatableWasmCanonicalSignatureId:
2791 return HashWithOptions(storage.integral);
2792 case Kind::kFloat32:
2793 return HashWithOptions(storage.float32.get_bits());
2794 case Kind::kFloat64:
2796 return HashWithOptions(storage.float64.get_bits());
2797 case Kind::kExternal:
2798 return HashWithOptions(strategy == HashingStrategy::kMakeSnapshotStable
2800 : storage.external.raw());
2801 case Kind::kHeapObject:
2802 case Kind::kCompressedHeapObject:
2803 case Kind::kTrustedHeapObject:
2804 if (strategy == HashingStrategy::kMakeSnapshotStable) {
2805 return HashWithOptions();
2807 return HashWithOptions(storage.handle.address());
2811 if (
kind != other.kind)
return false;
2816 case Kind::kTaggedIndex:
2817 case Kind::kRelocatableWasmCall:
2818 case Kind::kRelocatableWasmStubCall:
2819 case Kind::kRelocatableWasmCanonicalSignatureId:
2820 case Kind::kRelocatableWasmIndirectCallTarget:
2821 return storage.integral == other.storage.integral;
2822 case Kind::kFloat32:
2829 return base::bit_cast<uint32_t>(storage.float32) ==
2830 base::bit_cast<uint32_t>(other.storage.float32);
2831 case Kind::kFloat64:
2839 return base::bit_cast<uint64_t>(storage.float64) ==
2840 base::bit_cast<uint64_t>(other.storage.float64);
2841 case Kind::kExternal:
2842 return storage.external.raw() == other.storage.external.raw();
2843 case Kind::kHeapObject:
2844 case Kind::kCompressedHeapObject:
2845 case Kind::kTrustedHeapObject:
2846 return storage.handle.address() == other.storage.handle.address();
2905 switch (base_is_tagged) {
2906 case BaseTaggedness::kTaggedBase:
2908 case BaseTaggedness::kUntaggedBase:
2909 return RawAligned();
2913 return {.tagged_base =
true,
2914 .maybe_unaligned =
false,
2915 .with_trap_handler =
false,
2916 .trap_on_null =
false,
2917 .load_eliminable =
true,
2918 .is_immutable =
false,
2919 .is_atomic =
false};
2922 return {.tagged_base =
false,
2923 .maybe_unaligned =
false,
2924 .with_trap_handler =
false,
2925 .trap_on_null =
false,
2926 .load_eliminable =
true,
2927 .is_immutable =
false,
2928 .is_atomic =
false};
2931 return {.tagged_base =
false,
2932 .maybe_unaligned =
true,
2933 .with_trap_handler =
false,
2934 .trap_on_null =
false,
2935 .load_eliminable =
true,
2936 .is_immutable =
false,
2937 .is_atomic =
false};
2940 return {.tagged_base =
false,
2941 .maybe_unaligned =
false,
2942 .with_trap_handler =
true,
2943 .trap_on_null =
false,
2944 .load_eliminable =
true,
2945 .is_immutable =
false,
2946 .is_atomic =
false};
2949 return {.tagged_base =
true,
2950 .maybe_unaligned =
false,
2951 .with_trap_handler =
true,
2952 .trap_on_null =
true,
2953 .load_eliminable =
true,
2954 .is_immutable =
false,
2955 .is_atomic =
false};
2958 return rep == MemoryRepresentation::Int8() ||
2959 rep == MemoryRepresentation::Uint8() ||
2960 SupportedOperations::IsUnalignedLoadSupported(rep)
2961 ? LoadOp::Kind::RawAligned()
2962 : LoadOp::Kind::RawUnaligned();
2966 Kind new_kind = *
this;
2972 Kind new_kind(*
this);
2978 Kind new_kind(*
this);
2984 return tagged_base == other.tagged_base &&
2985 maybe_unaligned == other.maybe_unaligned &&
2986 with_trap_handler == other.with_trap_handler &&
2987 load_eliminable == other.load_eliminable &&
2988 is_immutable == other.is_immutable &&
2989 is_atomic == other.is_atomic && trap_on_null == other.trap_on_null;
3004 if (
kind.is_atomic) {
3011 return base::VectorOf(&result_rep, 1);
3021 MaybeRegisterRepresentation::WordPtr()>()
3023 MaybeRegisterRepresentation::WordPtr()>();
3029 return input_count == 2 ? input(1) : OpIndex::Invalid();
3044 int32_t
offset, uint8_t element_size_log2)
3045 :
Base(1 + index.valid()),
3047 loaded_rep(loaded_rep),
3048 result_rep(result_rep),
3049 element_size_log2(element_size_log2),
3052 if (index.valid()) {
3053 input(1) = index.value();
3057 template <
typename Fn,
typename Mapper>
3059 return fn(mapper.Map(
base()), mapper.Map(index()),
kind, loaded_rep,
3060 result_rep,
offset, element_size_log2);
3066 result_rep == RegisterRepresentation::Compressed()) ||
3070 !SupportedOperations::IsUnalignedLoadSupported(loaded_rep));
3076 uint8_t element_size_log2) {
3077 return Base::New(graph, 1 + index.valid(),
base, index,
kind, loaded_rep,
3078 result_rep,
offset, element_size_log2);
3080 void PrintInputs(std::ostream& os,
const std::string& op_index_prefix)
const;
3081 void PrintOptions(std::ostream& os)
const;
3083 return std::tuple{
kind, loaded_rep, result_rep,
offset, element_size_log2};
3088 return base::hash_value(
3089 static_cast<int>(
kind.tagged_base) | (
kind.maybe_unaligned << 1) |
3090 (
kind.load_eliminable << 2) | (
kind.is_immutable << 3) |
3091 (
kind.with_trap_handler << 4) | (
kind.is_atomic << 5));
3111 if (memory_access_kind == MemoryAccessKind::kProtectedByTrapHandler) {
3118 return base::VectorOf(&in_out_rep, 1);
3123 if (bin_op == BinOp::kCompareExchange) {
3125 storage, {RegisterRepresentation::WordPtr(),
3126 RegisterRepresentation::WordPtr(), in_out_rep, in_out_rep});
3129 {RegisterRepresentation::WordPtr(),
3130 RegisterRepresentation::WordPtr(), in_out_rep});
3137 return (input_count == 4) ? input(3) : OpIndex::Invalid();
3141 DCHECK_EQ(bin_op == BinOp::kCompareExchange, expected().valid());
3148 :
Base(3 + expected.valid()),
3150 in_out_rep(in_out_rep),
3151 memory_rep(memory_rep),
3152 memory_access_kind(
kind) {
3156 if (expected.
valid()) {
3157 input(3) = expected.
value();
3161 template <
typename Fn,
typename Mapper>
3163 return fn(mapper.Map(
base()), mapper.Map(index()), mapper.Map(value()),
3164 mapper.Map(expected()), bin_op, in_out_rep, memory_rep,
3165 memory_access_kind);
3173 return Base::New(graph, 3 + expected.
valid(),
base, index, value, expected,
3174 bin_op, result_rep, input_rep,
kind);
3177 void PrintInputs(std::ostream& os,
const std::string& op_index_prefix)
const;
3179 void PrintOptions(std::ostream& os)
const;
3182 return std::tuple{bin_op, in_out_rep, memory_rep, memory_access_kind};
3208 case AtomicRMWOp::BinOp::kAdd:
3210 case AtomicRMWOp::BinOp::kSub:
3212 case AtomicRMWOp::BinOp::kAnd:
3214 case AtomicRMWOp::BinOp::kOr:
3216 case AtomicRMWOp::BinOp::kXor:
3218 case AtomicRMWOp::BinOp::kExchange:
3219 return Kind::kExchange;
3220 case AtomicRMWOp::BinOp::kCompareExchange:
3221 return Kind::kCompareExchange;
3227 if (
kind == Kind::kStore) {
3237 if (
kind == Kind::kStore)
return {};
3238 return RepVector<RegisterRepresentation::Word32(),
3239 RegisterRepresentation::Word32()>();
3243 storage.
resize(input_count);
3245 const bool has_index = HasIndex();
3246 storage[0] = RegisterRepresentation::WordPtr();
3248 storage[1] = RegisterRepresentation::WordPtr();
3250 if (
kind != Kind::kLoad) {
3251 storage[1 + has_index] = RegisterRepresentation::Word32();
3252 storage[2 + has_index] = RegisterRepresentation::Word32();
3253 if (
kind == Kind::kCompareExchange) {
3254 storage[3 + has_index] =
3255 RegisterRepresentation::Word32();
3256 storage[4 + has_index] =
3257 RegisterRepresentation::Word32();
3260 return base::VectorOf(storage);
3268 return kind != Kind::kLoad ? input<Word32>(1 + HasIndex())
3272 return kind != Kind::kLoad ? input<Word32>(2 + HasIndex())
3276 return kind == Kind::kCompareExchange ? input<Word32>(3 + HasIndex())
3280 return kind == Kind::kCompareExchange ? input<Word32>(4 + HasIndex())
3295 const bool has_index = index.has_value();
3299 if (has_index) input(1) = index.value();
3300 if (
kind != Kind::kLoad) {
3301 input(1 + has_index) = value_low.
value();
3302 input(2 + has_index) = value_high.
value();
3303 if (
kind == Kind::kCompareExchange) {
3304 input(3 + has_index) = expected_low.
value();
3305 input(4 + has_index) = expected_high.
value();
3310 template <
typename Fn,
typename Mapper>
3312 return fn(mapper.Map(
base()), mapper.Map(index()), mapper.Map(value_low()),
3313 mapper.Map(value_high()), mapper.Map(expected_low()),
3320 return 1 + has_index;
3326 case Kind::kExchange:
3328 return 3 + has_index;
3329 case Kind::kCompareExchange:
3330 return 5 + has_index;
3343 return Base::New(graph, InputCount(
kind, index.has_value()),
base, index,
3344 value_low, value_high, expected_low, expected_high,
kind,
3348 void PrintInputs(std::ostream& os,
const std::string& op_index_prefix)
const;
3350 void PrintOptions(std::ostream& os)
const;
3365 :
Base(), memory_order(memory_order) {}
3375 auto options()
const {
return std::tuple{memory_order}; }
3376 void PrintOptions(std::ostream& os)
const;
3407 if (maybe_initializing_or_transitioning) {
3410 if (
kind.is_atomic) {
3423 ? RegisterRepresentation::Tagged()
3424 : RegisterRepresentation::WordPtr();
3425 if (
index() == OpIndex::Invalid()) {
3431 RegisterRepresentation::WordPtr()});
3437 return input_count == 3 ? input(2) : OpIndex::Invalid();
3441 uint64_t shifted = shifted_indirect_pointer_tag;
3448 int32_t
offset, uint8_t element_size_log2,
3449 bool maybe_initializing_or_transitioning,
3451 :
Base(2 + index.valid()),
3453 stored_rep(stored_rep),
3454 write_barrier(write_barrier),
3455 element_size_log2(element_size_log2),
3457 maybe_initializing_or_transitioning(
3458 maybe_initializing_or_transitioning),
3459 shifted_indirect_pointer_tag(maybe_indirect_pointer_tag >>
3461 DCHECK_EQ(indirect_pointer_tag(), maybe_indirect_pointer_tag);
3464 if (index.valid()) {
3465 input(2) = index.value();
3469 template <
typename Fn,
typename Mapper>
3471 return fn(mapper.Map(
base()), mapper.Map(index()), mapper.Map(value()),
3472 kind, stored_rep, write_barrier,
offset, element_size_log2,
3473 maybe_initializing_or_transitioning, indirect_pointer_tag());
3479 !SupportedOperations::IsUnalignedLoadSupported(stored_rep));
3486 bool maybe_initializing_or_transitioning,
3488 return Base::New(graph, 2 + index.valid(),
base, index, value,
kind,
3489 stored_rep, write_barrier,
offset, element_size_log2,
3490 maybe_initializing_or_transitioning,
3491 maybe_indirect_pointer_tag);
3494 void PrintInputs(std::ostream& os,
const std::string& op_index_prefix)
const;
3495 void PrintOptions(std::ostream& os)
const;
3498 kind, stored_rep, write_barrier,
3499 offset, element_size_log2, maybe_initializing_or_transitioning};
3516 return RepVector<RegisterRepresentation::Tagged()>();
3521 return MaybeRepVector<MaybeRegisterRepresentation::WordPtr()>();
3528 void PrintOptions(std::ostream& os)
const;
3543 return RepVector<RegisterRepresentation::WordPtr()>();
3548 return MaybeRepVector<MaybeRegisterRepresentation::Word32()>();
3557 void PrintOptions(std::ostream& os)
const;
3558 auto options()
const {
return std::tuple{tag_range}; }
3562 enum class Kind : uint8_t { kFunctionEntry, kBuiltinEntry,
kLoop };
3567 case Kind::kFunctionEntry:
3569 case Kind::kBuiltinEntry:
3588 return input_count > 1 ? Base::input<FrameState>(1)
3604 input(1) = frame_state.
value();
3610 return Base::New(graph, 1 + frame_state.
has_value(), context, frame_state,
3615 DCHECK_EQ(
kind == Kind::kBuiltinEntry, !frame_state().has_value());
3618 template <
typename Fn,
typename Mapper>
3637 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
3655 return RepVector<RegisterRepresentation::Word32()>();
3660 return MaybeRepVector<MaybeRegisterRepresentation::WordPtr()>();
3683 return RepVector<RegisterRepresentation::WordPtr()>();
3692 : size(size), alignment(alignment), is_tagged(is_tagged) {}
3693 auto options()
const {
return std::tuple{
size, alignment, is_tagged}; }
3710 case Kind::kStackCheckOffset:
3711 return RepVector<RegisterRepresentation::Tagged()>();
3712 case Kind::kFramePointer:
3713 case Kind::kParentFramePointer:
3714 return RepVector<RegisterRepresentation::WordPtr()>();
3747 if (inlined)
result += 1;
3752 return input_count - inlined;
3757 return RegisterRepresentation::FromMachineRepresentation(
3758 data->machine_types[idx].representation());
3763 :
Base(inputs), inlined(inlined), data(data) {}
3765 template <
typename Fn,
typename Mapper>
3767 auto mapped_inputs = mapper.template
Map<32>(inputs());
3768 return fn(base::VectorOf(mapped_inputs), inlined, data);
3777 return HashWithOptions(inlined, data->frame_state_info.bailout_id());
3782 auto options()
const {
return std::tuple{inlined, *data}; }
3800 :
Base(frame_state), parameters(parameters) {}
3802 DCHECK(
Get(graph, frame_state()).Is<FrameStateOp>());
3804 auto options()
const {
return std::tuple{parameters}; }
3816 return MaybeRepVector<MaybeRegisterRepresentation::Word32()>();
3826 parameters(parameters) {}
3832 return condition() == other.condition() && negated == other.negated;
3841 DCHECK(
Get(graph, frame_state()).Is<FrameStateOp>());
3843 auto options()
const {
return std::tuple{negated, parameters}; }
3844 void PrintOptions(std::ostream& os)
const;
3847#if V8_ENABLE_WEBASSEMBLY
3855 explicit WasmStackCheckOp(Kind
kind) : Base(),
kind(
kind) {}
3859 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
3860 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
3869 WasmStackCheckOp::Kind
kind);
3870struct TrapIfOp : OperationT<TrapIfOp> {
3872 const TrapId trap_id;
3874 static constexpr OpEffects effects =
3880 base::Vector<const RegisterRepresentation> outputs_rep()
const {
return {}; }
3882 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
3883 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
3884 return MaybeRepVector<MaybeRegisterRepresentation::Word32()>();
3888 OptionalV<FrameState> frame_state()
const {
3894 const TrapId trap_id)
3895 : Base(1 + frame_state.valid()), negated(negated), trap_id(trap_id) {
3897 if (frame_state.valid()) {
3898 input(1) = frame_state.value();
3902 template <
typename Fn,
typename Mapper>
3903 V8_INLINE auto Explode(Fn
fn, Mapper& mapper)
const {
3904 return fn(mapper.Map(
condition()), mapper.Map(frame_state()), negated,
3909 OptionalV<FrameState> frame_state,
bool negated,
3910 const TrapId trap_id) {
3911 return Base::New(graph, 1 + frame_state.valid(),
condition, frame_state,
3915 void Validate(
const Graph& graph)
const {
3916 if (frame_state().valid()) {
3920 auto options()
const {
return std::tuple{negated, trap_id}; }
3933 return MaybeRepVector<MaybeRegisterRepresentation::Word32()>();
3941 auto options()
const {
return std::tuple{source}; }
3960 const char* debug_name =
"")
3962 parameter_index(parameter_index),
3964 debug_name(debug_name) {}
3965 auto options()
const {
return std::tuple{parameter_index, rep, debug_name}; }
3966 void PrintOptions(std::ostream& os)
const;
3974 return RepVector<RegisterRepresentation::Tagged()>();
3983 auto options()
const {
return std::tuple{index}; }
4005 const JSWasmCallParameters* js_wasm_call_parameters)
4006 : descriptor(descriptor),
4009 can_throw(can_throw),
4010 lazy_deopt_on_throw(lazy_deopt_on_throw),
4011 js_wasm_call_parameters(js_wasm_call_parameters) {}
4016 const JSWasmCallParameters* js_wasm_call_parameters =
nullptr) {
4018 lazy_deopt_on_throw == LazyDeoptOnThrow::kNo);
4023 in_reps[
i] = RegisterRepresentation::FromMachineRepresentation(
4030 out_reps[
i] = RegisterRepresentation::FromMachineRepresentation(
4034 can_throw, lazy_deopt_on_throw,
4035 js_wasm_call_parameters);
4047 d.ParameterCount(), d.GPParameterCount(),
4048 d.FPParameterCount(), d.ParameterSlotCount(),
4049 d.ReturnSlotCount(), d.flags());
4071 storage.
resize(input_count);
4073 if (descriptor->
descriptor->IsCodeObjectCall() ||
4074 descriptor->
descriptor->IsJSFunctionCall() ||
4075 descriptor->
descriptor->IsBuiltinPointerCall()) {
4076 storage[
i++] = MaybeRegisterRepresentation::Tagged();
4077#ifdef V8_ENABLE_WEBASSEMBLY
4078 }
else if (descriptor->
descriptor->IsIndirectWasmFunctionCall()) {
4079 storage[
i++] = MaybeRegisterRepresentation::Word32();
4082 storage[
i++] = MaybeRegisterRepresentation::WordPtr();
4084 if (HasFrameState()) {
4085 storage[
i++] = MaybeRegisterRepresentation::None();
4087 for (
auto rep : descriptor->
in_reps) {
4089 if (
i >= input_count)
break;
4093 return base::VectorOf(storage);
4097 return descriptor->
descriptor->NeedsFrameState();
4102 return HasFrameState() ? input<FrameState>(1)
4106 return inputs().SubVector(1 + HasFrameState(), input_count);
4115 :
Base(1 + frame_state.valid() + arguments.size()),
4116 descriptor(descriptor),
4117 callee_effects(effects) {
4120 if (frame_state.
valid()) {
4121 inputs[1] = frame_state.
value();
4124 .OverwriteWith(arguments);
4127 template <
typename Fn,
typename Mapper>
4131 auto mapped_arguments = mapper.template
Map<16>(arguments());
4132 return fn(mapped_callee, mapped_frame_state,
4133 base::VectorOf(mapped_arguments), descriptor, Effects());
4137 if (frame_state().valid()) {
4146 return Base::New(graph, 1 + frame_state.
valid() + arguments.size(), callee,
4147 frame_state, arguments, descriptor, effects);
4152 auto options()
const {
return std::tuple{descriptor, callee_effects}; }
4153 size_t hash_value(
HashingStrategy strategy = HashingStrategy::kDefault)
const;
4154 void PrintOptions(std::ostream& os)
const;
4175 :
Base(throwing_operation),
4176 didnt_throw_block(successor),
4177 catch_block(catch_block) {}
4181 size_t hash_value(
HashingStrategy strategy = HashingStrategy::kDefault)
const;
4182 auto options()
const {
return std::tuple{didnt_throw_block, catch_block}; }
4191 return RepVector<RegisterRepresentation::Tagged()>();
4245 return *results_rep;
4250 return MaybeRepVector<MaybeRegisterRepresentation::None()>();
4256 OpIndex throwing_operation,
bool has_catch_block,
4259 :
Base(throwing_operation),
4260 throwing_op_effects(throwing_op_effects),
4261 has_catch_block(has_catch_block),
4262 results_rep(results_rep) {}
4265 return std::tuple{throwing_op_effects, has_catch_block};
4283 storage.
resize(input_count);
4285#ifdef V8_ENABLE_WEBASSEMBLY
4286 if (descriptor->
descriptor->IsIndirectWasmFunctionCall()) {
4287 storage[
i++] = MaybeRegisterRepresentation::Word32();
4288 }
else if (descriptor->
descriptor->IsDirectWasmFunctionCall() ||
4289 descriptor->
descriptor->IsWasmImportWrapper() ||
4290 descriptor->
descriptor->IsWasmCapiFunction()) {
4291 storage[
i++] = MaybeRegisterRepresentation::WordPtr();
4293 storage[
i++] = MaybeRegisterRepresentation::Tagged();
4296 storage[
i++] = MaybeRegisterRepresentation::Tagged();
4298 for (
auto rep : descriptor->
in_reps) {
4302 return base::VectorOf(storage);
4307 return inputs().SubVector(1, input_count);
4312 :
Base(1 + arguments.size()), descriptor(descriptor) {
4315 inputs.
SubVector(1, inputs.
size()).OverwriteWith(arguments);
4318 template <
typename Fn,
typename Mapper>
4320 OpIndex mapped_callee = mapper.Map(callee());
4321 auto mapped_arguments = mapper.template
Map<16>(arguments());
4322 return fn(mapped_callee, base::VectorOf(mapped_arguments), descriptor);
4328 return Base::New(graph, 1 + arguments.size(), callee, arguments,
4331 auto options()
const {
return std::tuple{descriptor}; }
4332 void PrintOptions(std::ostream& os)
const;
4363 return MaybeRepVector<MaybeRegisterRepresentation::Word32()>();
4370 return inputs().SubVector(1, input_count);
4374 bool spill_caller_frame_slots)
4375 :
Base(1 + return_values.size()),
4376 spill_caller_frame_slots(spill_caller_frame_slots) {
4378 inputs[0] = pop_count;
4379 inputs.
SubVector(1, inputs.
size()).OverwriteWith(return_values);
4382 template <
typename Fn,
typename Mapper>
4384 OpIndex mapped_pop_count = mapper.Map(pop_count());
4385 auto mapped_return_values = mapper.template
Map<4>(return_values());
4386 return fn(mapped_pop_count, base::VectorOf(mapped_return_values),
4387 spill_caller_frame_slots);
4392 bool spill_caller_frame_slots) {
4393 return Base::New(graph, 1 + return_values.
size(), pop_count, return_values,
4394 spill_caller_frame_slots);
4396 auto options()
const {
return std::tuple{spill_caller_frame_slots}; }
4413 size_t hash_value(
HashingStrategy strategy = HashingStrategy::kDefault)
const;
4427 return MaybeRepVector<MaybeRegisterRepresentation::Word32()>();
4434 :
Base(
condition), hint(hint), if_true(if_true), if_false(if_false) {}
4436 size_t hash_value(
HashingStrategy strategy = HashingStrategy::kDefault)
const;
4437 auto options()
const {
return std::tuple{if_true, if_false, hint}; }
4450 return value == other.value &&
destination == other.destination &&
4463 return MaybeRepVector<MaybeRegisterRepresentation::Word32()>();
4471 default_hint(default_hint),
4476 void PrintOptions(std::ostream& os)
const;
4477 size_t hash_value(
HashingStrategy strategy = HashingStrategy::kDefault)
const;
4490 case Opcode::kCheckException: {
4492 return {casted.didnt_throw_block, casted.catch_block};
4494 case Opcode::kGoto: {
4496 return {casted.destination};
4498 case Opcode::kBranch: {
4500 return {casted.if_true, casted.if_false};
4502 case Opcode::kReturn:
4503 case Opcode::kTailCall:
4504 case Opcode::kDeoptimize:
4505 case Opcode::kUnreachable:
4507 case Opcode::kSwitch: {
4516#define NON_TERMINATOR_CASE(op) case Opcode::k##op:
4519#undef NON_TERMINATOR_CASE
4539 template <
typename Fn,
typename Mapper>
4541 auto mapped_inputs = mapper.template
Map<4>(inputs());
4542 return fn(base::VectorOf(mapped_inputs));
4556 return base::VectorOf(&rep, 1);
4567 :
Base(input), index(index), rep(rep) {}
4571 ValidateOpInputRep(graph, input(), rep,
this, index);
4591 return InputsRepFactory::SingleRep(rep);
4598 :
Base(input), rep(rep), type(
std::move(type)), successful(successful) {}
4610 kDetectableCallable,
4638 return RepVector<RegisterRepresentation::Word32()>();
4643 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
4649 :
Base(input),
kind(
kind), input_assumptions(input_assumptions) {}
4677 return RepVector<RegisterRepresentation::Word32()>();
4682 return MaybeRepVector<MaybeRegisterRepresentation::Float64()>();
4704 return RepVector<RegisterRepresentation::Word32()>();
4709 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
4740 return RepVector<RegisterRepresentation::Tagged()>();
4745 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
4751 :
Base(input), from(from), to(to) {}
4764 kHeapNumberOrUndefined,
4783 return RepVector<RegisterRepresentation::Tagged()>();
4788 return InputsRepFactory::SingleRep(input_rep);
4799 input_rep(input_rep),
4800 input_interpretation(input_interpretation),
4801 minus_zero_mode(minus_zero_mode) {}
4805 case JSPrimitiveKind::kBigInt:
4806 DCHECK_EQ(input_rep, RegisterRepresentation::Word64());
4808 CheckForMinusZeroMode::kDontCheckForMinusZero);
4810 case JSPrimitiveKind::kBoolean:
4811 DCHECK_EQ(input_rep, RegisterRepresentation::Word32());
4813 CheckForMinusZeroMode::kDontCheckForMinusZero);
4815 case JSPrimitiveKind::kNumber:
4816 case JSPrimitiveKind::kHeapNumber:
4818 minus_zero_mode == CheckForMinusZeroMode::kCheckForMinusZero,
4819 input_rep == RegisterRepresentation::Float64());
4821 case JSPrimitiveKind::kHeapNumberOrUndefined:
4823 minus_zero_mode == CheckForMinusZeroMode::kDontCheckForMinusZero,
4824 input_rep == RegisterRepresentation::Float64());
4826 case JSPrimitiveKind::kSmi:
4827 DCHECK_EQ(input_rep, WordRepresentation::Word32());
4829 CheckForMinusZeroMode::kDontCheckForMinusZero);
4831 case JSPrimitiveKind::kString:
4832 DCHECK_EQ(input_rep, WordRepresentation::Word32());
4834 any_of(InputInterpretation::kCharCode,
4835 InputInterpretation::kCodePoint));
4841 return std::tuple{
kind, input_rep, input_interpretation, minus_zero_mode};
4865 return RepVector<RegisterRepresentation::Tagged()>();
4870 return InputsRepFactory::SingleRep(input_rep);
4880 :
Base(input, frame_state),
4882 input_rep(input_rep),
4883 input_interpretation(input_interpretation),
4884 feedback(feedback) {}
4887 DCHECK(
Get(graph, frame_state()).Is<FrameStateOp>());
4891 return std::tuple{
kind, input_rep, input_interpretation, feedback};
4899 input_interpretation);
4927 case UntaggedKind::kInt32:
4928 case UntaggedKind::kUint32:
4929 case UntaggedKind::kBit:
4930 return RepVector<RegisterRepresentation::Word32()>();
4931 case UntaggedKind::kInt64:
4932 return RepVector<RegisterRepresentation::Word64()>();
4933 case UntaggedKind::kFloat64:
4934 return RepVector<RegisterRepresentation::Float64()>();
4940 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
4947 :
Base(input),
kind(
kind), input_assumptions(input_assumptions) {}
4984 case UntaggedKind::kInt32:
4985 return RepVector<RegisterRepresentation::Word32()>();
4986 case UntaggedKind::kAdditiveSafeInteger:
4987 case UntaggedKind::kInt64:
4988 return RepVector<RegisterRepresentation::Word64()>();
4989 case UntaggedKind::kFloat64:
4990 return RepVector<RegisterRepresentation::Float64()>();
4991 case UntaggedKind::kArrayIndex:
4992 return Is64() ? RepVector<RegisterRepresentation::Word64()>()
4993 : RepVector<RegisterRepresentation::Word32()>();
4999 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
5011 :
Base(input, frame_state),
5012 from_kind(from_kind),
5014 minus_zero_mode(minus_zero_mode),
5015 feedback(feedback) {}
5017 DCHECK(
Get(graph, frame_state()).Is<FrameStateOp>());
5021 return std::tuple{from_kind, to_kind, minus_zero_mode, feedback};
5054 case UntaggedKind::kInt32:
5055 case UntaggedKind::kBit:
5056 return RepVector<RegisterRepresentation::Word32()>();
5057 case UntaggedKind::kInt64:
5058 return RepVector<RegisterRepresentation::Word64()>();
5064 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
5071 :
Base(input),
kind(
kind), input_assumptions(input_assumptions) {}
5095 case UntaggedKind::kInt32:
5096 return RepVector<RegisterRepresentation::Word32()>();
5102 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
5113 :
Base(input, frame_state),
5115 input_requirement(input_requirement),
5116 feedback(feedback) {}
5118 DCHECK(
Get(graph, frame_state()).Is<FrameStateOp>());
5121 auto options()
const {
return std::tuple{
kind, input_requirement, feedback}; }
5133 return RepVector<RegisterRepresentation::Tagged()>();
5139 MaybeRegisterRepresentation::Tagged()>();
5145 return Base::input<JSGlobalProxy>(2);
5167 return RepVector<RegisterRepresentation::Tagged()>();
5173 MaybeRegisterRepresentation::Tagged(),
5174 MaybeRegisterRepresentation::Tagged()>();
5203 return RepVector<RegisterRepresentation::Tagged()>();
5208 return MaybeRepVector<MaybeRegisterRepresentation::WordPtr()>();
5214 :
Base(length),
kind(
kind), allocation_type(allocation_type) {}
5237 return RepVector<RegisterRepresentation::Tagged()>();
5242 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
5266 return RepVector<RegisterRepresentation::Tagged()>();
5272 MaybeRegisterRepresentation::Word32()>();
5322 return InputsRepFactory::SingleRep(rep);
5328 :
Base(input), rep(rep) {}
5344 kShiftRightArithmetic,
5355 return RepVector<RegisterRepresentation::Tagged()>();
5361 MaybeRegisterRepresentation::Tagged()>();
5372 DCHECK(
Get(graph, frame_state()).Is<FrameStateOp>());
5393 return RepVector<RegisterRepresentation::Tagged()>();
5399 MaybeRegisterRepresentation::Tagged()>();
5430 return RepVector<RegisterRepresentation::Tagged()>();
5435 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
5452 return RepVector<RegisterRepresentation::WordPtr()>();
5477 return RepVector<RegisterRepresentation::Word32()>();
5483 MaybeRegisterRepresentation::WordPtr()>();
5498#ifdef V8_INTL_SUPPORT
5500 enum class Kind : uint8_t {
5514 return RepVector<RegisterRepresentation::Tagged()>();
5518 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
5519 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
5522 V<String> string()
const {
return Base::input<String>(0); }
5530 StringToCaseIntlOp::Kind
kind);
5540 return RepVector<RegisterRepresentation::Word32()>();
5545 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
5566 return RepVector<RegisterRepresentation::WordPtr()>();
5571 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
5578 :
Base(typed_array), elements_kind(elements_kind) {}
5580 auto options()
const {
return std::tuple{elements_kind}; }
5592 return RepVector<RegisterRepresentation::Tagged()>();
5598 MaybeRegisterRepresentation::Tagged(),
5599 MaybeRegisterRepresentation::Tagged()>();
5625 return RepVector<RegisterRepresentation::Tagged()>();
5631 MaybeRegisterRepresentation::WordPtr()>();
5638 :
Base(string, index) {}
5653 return RepVector<RegisterRepresentation::Tagged()>();
5659 MaybeRegisterRepresentation::Word32(),
5660 MaybeRegisterRepresentation::Word32()>();
5683 return RepVector<RegisterRepresentation::Tagged()>();
5689 MaybeRegisterRepresentation::Tagged(),
5690 MaybeRegisterRepresentation::Tagged()>();
5698 :
Base(length, left, right) {}
5718 return RepVector<RegisterRepresentation::Tagged()>();
5724 MaybeRegisterRepresentation::Tagged()>();
5747 int formal_parameter_count =
5752 return RepVector<RegisterRepresentation::Tagged()>();
5761 :
Base(),
kind(
kind), formal_parameter_count(formal_parameter_count) {
5766 auto options()
const {
return std::tuple{
kind, formal_parameter_count}; }
5783 return RepVector<RegisterRepresentation::Tagged()>();
5788 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
5794 int formal_parameter_count)
5795 :
Base(arguments_count),
5797 formal_parameter_count(formal_parameter_count) {}
5800 auto options()
const {
return std::tuple{
type, formal_parameter_count}; }
5805 switch (array_type) {
5814 return RegisterRepresentation::Word32();
5816 return RegisterRepresentation::Float32();
5818 return RegisterRepresentation::Float64();
5821 return RegisterRepresentation::Word64();
5827 static constexpr std::array<RegisterRepresentation, 6> table{
5828 RegisterRepresentation::Word32(), RegisterRepresentation::Word64(),
5829 RegisterRepresentation::Float32(), RegisterRepresentation::Float64(),
5830 RegisterRepresentation::Tagged(), RegisterRepresentation::Compressed()};
5831 return base::VectorOf(&table[
static_cast<size_t>(rep.
value())], 1);
5850 MaybeRegisterRepresentation::Tagged(),
5851 MaybeRegisterRepresentation::WordPtr(),
5852 MaybeRegisterRepresentation::WordPtr()>();
5862 :
Base(buffer,
base, external, index), array_type(array_type) {}
5865 auto options()
const {
return std::tuple{array_type}; }
5883 MaybeRegisterRepresentation::Tagged(),
5884 MaybeRegisterRepresentation::WordPtr(),
5885 MaybeRegisterRepresentation::Word32()>();
5896 :
Base(object, storage, index, is_little_endian),
5897 element_type(element_type) {}
5900 auto options()
const {
return std::tuple{element_type}; }
5910 return RepVector<RegisterRepresentation::Tagged()>();
5916 MaybeRegisterRepresentation::WordPtr()>();
5944 {RegisterRepresentation::Tagged(), RegisterRepresentation::Tagged(),
5945 RegisterRepresentation::WordPtr(), RegisterRepresentation::WordPtr(),
5958 :
Base(buffer,
base, external, index, value), array_type(array_type) {}
5961 auto options()
const {
return std::tuple{array_type}; }
5981 {RegisterRepresentation::Tagged(), RegisterRepresentation::Tagged(),
5982 RegisterRepresentation::WordPtr(),
5984 RegisterRepresentation::Word32()});
5996 :
Base(object, storage, index, value, is_little_endian),
5997 element_type(element_type) {}
6000 auto options()
const {
return std::tuple{element_type}; }
6010 kSignedSmallElement,
6028 storage, {RegisterRepresentation::Tagged(),
6029 RegisterRepresentation::WordPtr(), value_representation()});
6040 :
Base(array, index, value),
6043 double_map(double_map) {}
6048 case Kind::kElement:
6049 case Kind::kNonNumberElement:
6050 case Kind::kOddballElement:
6051 return RegisterRepresentation::Tagged();
6052 case Kind::kNumberElement:
6053 return RegisterRepresentation::Float64();
6054 case Kind::kSignedSmallElement:
6055 return RegisterRepresentation::Word32();
6061 DCHECK_EQ(strategy, HashingStrategy::kDefault);
6062 return HashWithOptions(fast_map.
address(), double_map.
address());
6066 return kind == other.kind && fast_map.
equals(other.fast_map) &&
6067 double_map.
equals(other.double_map);
6070 auto options()
const {
return std::tuple{
kind, fast_map, double_map}; }
6081 return RepVector<RegisterRepresentation::Word32()>();
6086 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
6097 :
Base(1 + map.valid()), maps(
std::move(maps)) {
6098 input(0) = heap_object;
6100 input(1) = map.value();
6106 void PrintOptions(std::ostream& os)
const;
6108 template <
typename Fn,
typename Mapper>
6110 return fn(mapper.Map(heap_object()), mapper.Map(map()), maps);
6115 return Base::New(graph, 1 + map.valid(), heap_object, map, maps);
6134 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
6146 :
Base(2 + map.valid()),
6148 maps(
std::move(maps)),
6149 feedback(feedback) {
6150 input(0) = heap_object;
6151 input(1) = frame_state;
6153 input(2) = map.value();
6158 DCHECK(
Get(graph, frame_state()).Is<FrameStateOp>());
6162 void PrintOptions(std::ostream& os)
const;
6164 template <
typename Fn,
typename Mapper>
6166 return fn(mapper.Map(heap_object()), mapper.Map(frame_state()),
6167 mapper.Map(map()), maps, flags, feedback);
6174 return Base::New(graph, 2 + map.valid(), heap_object, frame_state, map,
6175 maps, flags, feedback);
6194 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
6200 :
Base(heap_object), maps(
std::move(maps)) {}
6204 void PrintOptions(std::ostream& os)
const;
6213 return RepVector<RegisterRepresentation::Tagged()>();
6218 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
6226 :
Base(input, frame_state), feedback_cell(feedback_cell) {}
6229 DCHECK(
Get(graph, frame_state()).Is<FrameStateOp>());
6233 return feedback_cell.
address() == other.feedback_cell.address();
6237 DCHECK_EQ(strategy, HashingStrategy::kDefault);
6238 return HashWithOptions(feedback_cell.
address());
6241 auto options()
const {
return std::tuple{feedback_cell}; }
6252 MaybeRegisterRepresentation::Tagged()>();
6261 :
Base(expected, value, frame_state) {}
6264 DCHECK(
Get(graph, frame_state()).Is<FrameStateOp>());
6276 return RepVector<RegisterRepresentation::Tagged()>();
6281 return MaybeRepVector<MaybeRegisterRepresentation::WordPtr()>();
6302 MaybeRegisterRepresentation::Tagged()>();
6318 kSameValueNumbersOnly,
6327 return RepVector<RegisterRepresentation::Tagged()>();
6333 MaybeRegisterRepresentation::Tagged()>();
6340 :
Base(left, right), mode(mode) {}
6351 return RepVector<RegisterRepresentation::Word32()>();
6357 MaybeRegisterRepresentation::Float64()>();
6375 : c_function(c_function) {}
6384 static constexpr uint32_t kSuccessValue = 1;
6385 static constexpr uint32_t kFailureValue = 0;
6395 static constexpr int kNumNonParamInputs = 3;
6403 kNumNonParamInputs + parameters->
c_signature()->ArgumentCount());
6405 storage[0] = MaybeRegisterRepresentation::None();
6406 storage[1] = MaybeRegisterRepresentation::Tagged();
6407 storage[2] = MaybeRegisterRepresentation::Tagged();
6408 for (
unsigned i = 0;
i < parameters->
c_signature()->ArgumentCount(); ++
i) {
6409 storage[
i + kNumNonParamInputs] = argument_representation(
i);
6411 return base::VectorOf(storage);
6415 unsigned argument_index)
const {
6417 parameters->
c_signature()->ArgumentInfo(argument_index);
6418 uint8_t flags =
static_cast<uint8_t
>(arg_type.
GetFlags());
6421 case CTypeInfo::SequenceType::kScalar:
6422 if (flags & (
static_cast<uint8_t
>(CTypeInfo::Flags::kEnforceRangeBit) |
6423 static_cast<uint8_t
>(CTypeInfo::Flags::kClampBit))) {
6424 return MaybeRegisterRepresentation::Float64();
6427 case CTypeInfo::Type::kVoid:
6429 case CTypeInfo::Type::kBool:
6430 case CTypeInfo::Type::kUint8:
6431 case CTypeInfo::Type::kInt32:
6432 case CTypeInfo::Type::kUint32:
6433 return MaybeRegisterRepresentation::Word32();
6434 case CTypeInfo::Type::kInt64:
6435 case CTypeInfo::Type::kUint64:
6436 return MaybeRegisterRepresentation::Word64();
6437 case CTypeInfo::Type::kV8Value:
6438 case CTypeInfo::Type::kApiObject:
6439 case CTypeInfo::Type::kPointer:
6440 case CTypeInfo::Type::kSeqOneByteString:
6441 return MaybeRegisterRepresentation::Tagged();
6442 case CTypeInfo::Type::kFloat32:
6443 case CTypeInfo::Type::kFloat64:
6444 return MaybeRegisterRepresentation::Float64();
6445 case CTypeInfo::Type::kAny:
6448 return MaybeRegisterRepresentation::None();
6450 case CTypeInfo::SequenceType::kIsSequence:
6451 return MaybeRegisterRepresentation::Tagged();
6452 case CTypeInfo::SequenceType::kIsArrayBuffer:
6465 return inputs().SubVector(kNumNonParamInputs, inputs().
size());
6472 :
Base(kNumNonParamInputs + arguments.size()),
6473 parameters(parameters),
6477 inputs[0] = frame_state;
6478 inputs[1] = data_argument;
6480 inputs.
SubVector(kNumNonParamInputs, kNumNonParamInputs + arguments.size())
6481 .OverwriteWith(arguments);
6484 template <
typename Fn,
typename Mapper>
6486 V<FrameState> mapped_frame_state = mapper.Map(frame_state());
6487 OpIndex mapped_data_argument = mapper.Map(data_argument());
6489 auto mapped_arguments = mapper.template
Map<8>(arguments());
6490 return fn(mapped_frame_state, mapped_data_argument, mapped_context,
6491 base::VectorOf(mapped_arguments), parameters, out_reps);
6500 return Base::New(graph, kNumNonParamInputs + arguments.size(), frame_state,
6501 data_argument, context, arguments, parameters, out_reps);
6506 DCHECK_EQ(out_reps[0], RegisterRepresentation::Word32());
6507 return std::tuple{parameters, out_reps[1], lazy_deopt_on_throw};
6525 auto options()
const {
return std::tuple{reason}; }
6533 return RepVector<RegisterRepresentation::Tagged()>();
6539 MaybeRegisterRepresentation::Tagged()>();
6546 :
Base(object, elements) {}
6560 return RepVector<RegisterRepresentation::Tagged()>();
6566 MaybeRegisterRepresentation::Tagged(),
6567 MaybeRegisterRepresentation::Word32(),
6568 MaybeRegisterRepresentation::Word32()>();
6581 :
Base(object, elements, index, elements_length, frame_state),
6583 feedback(feedback) {}
6586 DCHECK(
Get(graph, frame_state()).Is<FrameStateOp>());
6601 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
6607 :
Base(object), transition(transition) {}
6610 auto options()
const {
return std::tuple{transition}; }
6622 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
6630 :
Base(object, map, frame_state), transition(transition) {}
6633 auto options()
const {
return std::tuple{transition}; }
6639 kFindOrderedHashMapEntry,
6640 kFindOrderedHashMapEntryForInt32Key,
6641 kFindOrderedHashSetEntry,
6649 case Kind::kFindOrderedHashMapEntry:
6650 case Kind::kFindOrderedHashSetEntry:
6651 return RepVector<RegisterRepresentation::Tagged()>();
6652 case Kind::kFindOrderedHashMapEntryForInt32Key:
6653 return RepVector<RegisterRepresentation::WordPtr()>();
6659 return kind == Kind::kFindOrderedHashMapEntryForInt32Key
6661 MaybeRegisterRepresentation::Word32()>()
6663 MaybeRegisterRepresentation::Tagged()>();
6684 explicit CommentOp(
const char* message) : message(message) {}
6693 auto options()
const {
return std::tuple{message}; }
6696#if V8_ENABLE_WEBASSEMBLY
6706 return input<WasmTrustedInstanceData>(0);
6711 : Base(instance), global(global) {}
6714 const RegisterRepresentation& repr = RepresentationFor(global->
type);
6715 return base::VectorOf(&repr, 1);
6718 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
6719 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
6720 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
6724 auto options()
const {
return std::tuple{global}; }
6727struct GlobalSetOp : FixedArityOperationT<2, GlobalSetOp> {
6728 const wasm::WasmGlobal* global;
6729 static constexpr OpEffects effects = OpEffects().
CanWriteMemory();
6732 return input<WasmTrustedInstanceData>(0);
6737 const wasm::WasmGlobal* global)
6738 : Base(instance, value), global(global) {}
6740 base::Vector<const RegisterRepresentation> outputs_rep()
const {
return {}; }
6742 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
6743 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
6745 storage[0] = MaybeRegisterRepresentation::Tagged();
6746 storage[1] = MaybeRegisterRepresentation(RepresentationFor(global->type));
6747 return base::VectorOf(storage);
6750 void Validate(
const Graph& graph)
const {
DCHECK(global->mutability); }
6752 auto options()
const {
return std::tuple{global}; }
6755struct RootConstantOp : FixedArityOperationT<0, RootConstantOp> {
6757 static constexpr OpEffects effects = OpEffects();
6759 explicit RootConstantOp(RootIndex index) : Base(), index(index) {}
6761 base::Vector<const RegisterRepresentation> outputs_rep()
const {
6762 return RepVector<RegisterRepresentation::Tagged()>();
6765 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
6766 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
6770 void Validate(
const Graph& graph)
const {}
6772 auto options()
const {
return std::tuple{index}; }
6775struct IsRootConstantOp : FixedArityOperationT<1, IsRootConstantOp> {
6777 static constexpr OpEffects effects = OpEffects();
6779 V<Object> object()
const {
return input<Object>(0); }
6781 IsRootConstantOp(
V<Object> object, RootIndex index)
6782 : Base(object), index(index) {}
6784 base::Vector<const RegisterRepresentation> outputs_rep()
const {
6785 return RepVector<RegisterRepresentation::Word32()>();
6788 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
6789 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
6790 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
6793 auto options()
const {
return std::tuple{index}; }
6796struct NullOp : FixedArityOperationT<0, NullOp> {
6797 wasm::ValueType
type;
6798 static constexpr OpEffects effects = OpEffects();
6800 explicit NullOp(wasm::ValueType type) : Base(), type(type) {}
6802 base::Vector<const RegisterRepresentation> outputs_rep()
const {
6803 return RepVector<RegisterRepresentation::Tagged()>();
6806 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
6807 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
6811 void Validate(
const Graph& graph)
const {
6812 DCHECK(type.is_object_reference() && type.is_nullable());
6815 auto options()
const {
return std::tuple{type}; }
6818struct IsNullOp : FixedArityOperationT<1, IsNullOp> {
6819 wasm::ValueType
type;
6820 static constexpr OpEffects effects = OpEffects();
6822 V<Object> object()
const {
return input<Object>(0); }
6824 IsNullOp(
V<Object> object, wasm::ValueType type) : Base(object), type(type) {}
6826 base::Vector<const RegisterRepresentation> outputs_rep()
const {
6827 return RepVector<RegisterRepresentation::Word32()>();
6830 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
6831 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
6832 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
6835 auto options()
const {
return std::tuple{type}; }
6840struct AssertNotNullOp : FixedArityOperationT<1, AssertNotNullOp> {
6841 wasm::ValueType
type;
6845 static constexpr OpEffects effects =
6846 OpEffects().CanDependOnChecks().CanLeaveCurrentFunction();
6848 V<Object> object()
const {
return input<Object>(0); }
6850 AssertNotNullOp(
V<Object> object, wasm::ValueType type, TrapId trap_id)
6851 : Base(object), type(type), trap_id(trap_id) {}
6853 base::Vector<const RegisterRepresentation> outputs_rep()
const {
6854 return RepVector<RegisterRepresentation::Tagged()>();
6857 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
6858 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
6859 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
6862 void Validate(
const Graph& graph)
const {
6866 auto options()
const {
return std::tuple{
type, trap_id}; }
6873struct RttCanonOp : FixedArityOperationT<1, RttCanonOp> {
6874 wasm::ModuleTypeIndex type_index;
6876 static constexpr OpEffects effects = OpEffects();
6878 explicit RttCanonOp(
V<FixedArray> rtts, wasm::ModuleTypeIndex type_index)
6879 : Base(rtts), type_index(type_index) {}
6883 base::Vector<const RegisterRepresentation> outputs_rep()
const {
6884 return RepVector<RegisterRepresentation::Tagged()>();
6887 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
6888 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
6889 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
6892 auto options()
const {
return std::tuple{type_index}; }
6895struct WasmTypeCheckOp : OperationT<WasmTypeCheckOp> {
6896 WasmTypeCheckConfig config;
6898 static constexpr OpEffects effects = OpEffects().AssumesConsistentHeap();
6900 WasmTypeCheckOp(
V<Object> object, OptionalV<Map> rtt,
6901 WasmTypeCheckConfig config)
6902 : Base(1 + rtt.valid()), config(config) {
6905 input(1) = rtt.value();
6909 template <
typename Fn,
typename Mapper>
6910 V8_INLINE auto Explode(Fn
fn, Mapper& mapper)
const {
6911 return fn(mapper.Map(
object()), mapper.Map(rtt()), config);
6914 V<Object> object()
const {
return Base::input<Object>(0); }
6915 OptionalV<Map> rtt()
const {
6919 base::Vector<const RegisterRepresentation> outputs_rep()
const {
6920 return RepVector<RegisterRepresentation::Word32()>();
6923 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
6924 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
6927 MaybeRegisterRepresentation::Tagged()>()
6932 auto options()
const {
return std::tuple{config}; }
6934 static WasmTypeCheckOp& New(Graph* graph,
V<Object> object,
6935 OptionalV<Map> rtt, WasmTypeCheckConfig config) {
6936 return Base::New(graph, 1 + rtt.valid(),
object, rtt, config);
6940struct WasmTypeCastOp : OperationT<WasmTypeCastOp> {
6941 WasmTypeCheckConfig config;
6943 static constexpr OpEffects effects = OpEffects().CanLeaveCurrentFunction();
6945 WasmTypeCastOp(
V<Object> object, OptionalV<Map> rtt,
6946 WasmTypeCheckConfig config)
6947 : Base(1 + rtt.valid()), config(config) {
6950 input(1) = rtt.value();
6954 template <
typename Fn,
typename Mapper>
6955 V8_INLINE auto Explode(Fn
fn, Mapper& mapper)
const {
6956 return fn(mapper.Map(
object()), mapper.Map(rtt()), config);
6959 V<Object> object()
const {
return Base::input<Object>(0); }
6960 OptionalV<Map> rtt()
const {
6964 base::Vector<const RegisterRepresentation> outputs_rep()
const {
6965 return RepVector<RegisterRepresentation::Tagged()>();
6968 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
6969 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
6972 MaybeRegisterRepresentation::Tagged()>()
6977 auto options()
const {
return std::tuple{config}; }
6979 static WasmTypeCastOp& New(Graph* graph,
V<Object> object, OptionalV<Map> rtt,
6980 WasmTypeCheckConfig config) {
6981 return Base::New(graph, 1 + rtt.valid(),
object, rtt, config);
6988struct WasmTypeAnnotationOp : FixedArityOperationT<1, WasmTypeAnnotationOp> {
6989 static constexpr OpEffects effects = OpEffects();
6990 wasm::ValueType
type;
6992 explicit WasmTypeAnnotationOp(
V<Object> value, wasm::ValueType type)
6993 : Base(value), type(type) {}
6997 base::Vector<const RegisterRepresentation> outputs_rep()
const {
6998 return RepVector<RegisterRepresentation::Tagged()>();
7001 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7002 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7003 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
7006 void Validate(
const Graph& graph)
const {
7010 DCHECK(type.is_object_reference());
7013 auto options()
const {
return std::tuple(type); }
7016struct AnyConvertExternOp : FixedArityOperationT<1, AnyConvertExternOp> {
7017 static constexpr OpEffects effects =
7019 : OpEffects().CanReadMemory().CanAllocate();
7021 explicit AnyConvertExternOp(
V<Object> object) : Base(object) {}
7023 V<Object> object()
const {
return Base::input<Object>(0); }
7025 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7026 return RepVector<RegisterRepresentation::Tagged()>();
7029 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7030 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7031 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
7035 auto options()
const {
return std::tuple(); }
7038struct ExternConvertAnyOp : FixedArityOperationT<1, ExternConvertAnyOp> {
7039 static constexpr OpEffects effects = OpEffects();
7041 explicit ExternConvertAnyOp(
V<Object> object) : Base(object) {}
7043 V<Object> object()
const {
return Base::input<Object>(0); }
7045 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7046 return RepVector<RegisterRepresentation::Tagged()>();
7049 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7050 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7051 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
7055 auto options()
const {
return std::tuple(); }
7058struct StructGetOp : FixedArityOperationT<1, StructGetOp> {
7061 const wasm::StructType*
type;
7062 wasm::ModuleTypeIndex type_index;
7065 OpEffects Effects()
const {
7069 .CanDependOnChecks()
7071 if (null_check == kWithNullCheck) {
7079 wasm::ModuleTypeIndex type_index,
int field_index,
bool is_signed,
7080 CheckForNull null_check)
7083 null_check(null_check),
7085 type_index(type_index),
7086 field_index(field_index) {}
7090 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7091 return base::VectorOf(&RepresentationFor(type->field(field_index)), 1);
7094 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7095 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7096 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
7099 void Validate(
const Graph& graph)
const {
7100 DCHECK_LT(field_index, type->field_count());
7101 DCHECK_IMPLIES(!is_signed, type->field(field_index).is_packed());
7105 return std::tuple{
type, type_index, field_index,
is_signed, null_check};
7109struct StructSetOp : FixedArityOperationT<2, StructSetOp> {
7111 const wasm::StructType*
type;
7114 wasm::ModuleTypeIndex type_index;
7117 OpEffects Effects()
const {
7121 .CanDependOnChecks()
7123 if (null_check == kWithNullCheck) {
7131 const wasm::StructType* type, wasm::ModuleTypeIndex type_index,
7132 int field_index, CheckForNull null_check)
7133 : Base(object, value),
7134 null_check(null_check),
7136 type_index(type_index),
7137 field_index(field_index) {}
7142 base::Vector<const RegisterRepresentation> outputs_rep()
const {
return {}; }
7144 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7145 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7147 storage[0] = RegisterRepresentation::Tagged();
7148 storage[1] = RepresentationFor(type->field(field_index));
7149 return base::VectorOf(storage);
7152 void Validate(
const Graph& graph)
const {
7153 DCHECK_LT(field_index, type->field_count());
7157 return std::tuple{
type, type_index, field_index, null_check};
7161struct ArrayGetOp : FixedArityOperationT<2, ArrayGetOp> {
7163 const wasm::ArrayType* array_type;
7166 static constexpr OpEffects effects =
7169 .CanDependOnChecks()
7173 const wasm::ArrayType* array_type,
bool is_signed)
7179 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7180 return base::VectorOf(&RepresentationFor(array_type->element_type()), 1);
7183 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7184 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7186 MaybeRegisterRepresentation::Word32()>();
7191 void PrintOptions(std::ostream& os)
const;
7194struct ArraySetOp : FixedArityOperationT<3, ArraySetOp> {
7195 wasm::ValueType element_type;
7198 static constexpr OpEffects effects =
7201 .CanDependOnChecks()
7205 wasm::ValueType element_type)
7206 : Base(array, index, value), element_type(element_type) {}
7212 base::Vector<const RegisterRepresentation> outputs_rep()
const {
return {}; }
7214 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7215 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7216 return InitVectorOf(storage, {RegisterRepresentation::Tagged(),
7217 RegisterRepresentation::Word32(),
7218 RepresentationFor(element_type)});
7222 auto options()
const {
return std::tuple{element_type}; }
7225struct ArrayLengthOp : FixedArityOperationT<1, ArrayLengthOp> {
7228 OpEffects Effects()
const {
7232 .CanDependOnChecks()
7234 if (null_check == kWithNullCheck) {
7242 : Base(array), null_check(null_check) {}
7246 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7247 return RepVector<RegisterRepresentation::Word32()>();
7250 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7251 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7252 return MaybeRepVector<RegisterRepresentation::Tagged()>();
7256 auto options()
const {
return std::tuple{null_check}; }
7259struct WasmAllocateArrayOp : FixedArityOperationT<2, WasmAllocateArrayOp> {
7260 static constexpr OpEffects effects =
7261 OpEffects().CanAllocate().CanLeaveCurrentFunction();
7263 const wasm::ArrayType* array_type;
7266 const wasm::ArrayType* array_type)
7267 : Base(rtt, length), array_type(array_type) {}
7269 V<Map> rtt()
const {
return Base::input<Map>(0); }
7272 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7273 return RepVector<RegisterRepresentation::Tagged()>();
7276 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7277 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7279 MaybeRegisterRepresentation::Word32()>();
7282 auto options()
const {
return std::tuple{array_type}; }
7283 void PrintOptions(std::ostream& os)
const;
7286struct WasmAllocateStructOp : FixedArityOperationT<1, WasmAllocateStructOp> {
7287 static constexpr OpEffects effects =
7288 OpEffects().CanAllocate().CanLeaveCurrentFunction();
7290 const wasm::StructType* struct_type;
7292 explicit WasmAllocateStructOp(
V<Map> rtt,
const wasm::StructType* struct_type)
7293 : Base(rtt), struct_type(struct_type) {}
7295 V<Map> rtt()
const {
return Base::input<Map>(0); }
7297 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7298 return RepVector<RegisterRepresentation::Tagged()>();
7301 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7302 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7303 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
7306 auto options()
const {
return std::tuple{struct_type}; }
7309struct WasmRefFuncOp : FixedArityOperationT<1, WasmRefFuncOp> {
7310 static constexpr OpEffects effects = OpEffects().CanAllocate();
7311 uint32_t function_index;
7314 uint32_t function_index)
7315 : Base(wasm_instance), function_index(function_index) {}
7318 return input<WasmTrustedInstanceData>(0);
7321 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7322 return RepVector<RegisterRepresentation::Tagged()>();
7325 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7326 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7327 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
7330 auto options()
const {
return std::tuple{function_index}; }
7336struct StringAsWtf16Op : FixedArityOperationT<1, StringAsWtf16Op> {
7337 static constexpr OpEffects effects =
7340 .CanDependOnChecks()
7343 explicit StringAsWtf16Op(
V<String> string) : Base(string) {}
7345 V<String> string()
const {
return input<String>(0); }
7347 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7348 return RepVector<RegisterRepresentation::Tagged()>();
7351 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7352 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7353 return MaybeRepVector<RegisterRepresentation::Tagged()>();
7356 auto options()
const {
return std::tuple{}; }
7361struct StringPrepareForGetCodeUnitOp
7362 : FixedArityOperationT<1, StringPrepareForGetCodeUnitOp> {
7363 static constexpr OpEffects effects =
7366 .CanDependOnChecks();
7368 explicit StringPrepareForGetCodeUnitOp(
V<Object> string) : Base(string) {}
7370 OpIndex string()
const {
return input(0); }
7372 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7373 return RepVector<RegisterRepresentation::Tagged(),
7374 RegisterRepresentation::WordPtr(),
7375 RegisterRepresentation::Word32()>();
7378 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7379 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7380 return MaybeRepVector<RegisterRepresentation::Tagged()>();
7383 auto options()
const {
return std::tuple{}; }
7386struct Simd128ConstantOp : FixedArityOperationT<0, Simd128ConstantOp> {
7390 static constexpr OpEffects effects = OpEffects();
7392 explicit Simd128ConstantOp(
const uint8_t incoming_value[kSimd128Size])
7394 std::copy(incoming_value, incoming_value + kSimd128Size, value);
7397 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7398 return RepVector<RegisterRepresentation::Simd128()>();
7401 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7402 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7406 void Validate(
const Graph& graph)
const {
7410 bool IsZero()
const {
return std::memcmp(kZero, value, kSimd128Size) == 0; }
7412 auto options()
const {
return std::tuple{value}; }
7413 void PrintOptions(std::ostream& os)
const;
7416#define FOREACH_SIMD_128_BINARY_SIGN_EXTENSION_OPCODE(V) \
7417 V(I16x8ExtMulLowI8x16S) \
7418 V(I16x8ExtMulHighI8x16S) \
7419 V(I16x8ExtMulLowI8x16U) \
7420 V(I16x8ExtMulHighI8x16U) \
7421 V(I32x4ExtMulLowI16x8S) \
7422 V(I32x4ExtMulHighI16x8S) \
7423 V(I32x4ExtMulLowI16x8U) \
7424 V(I32x4ExtMulHighI16x8U) \
7425 V(I64x2ExtMulLowI32x4S) \
7426 V(I64x2ExtMulHighI32x4S) \
7427 V(I64x2ExtMulLowI32x4U) \
7428 V(I64x2ExtMulHighI32x4U)
7430#define FOREACH_SIMD_128_BINARY_BASIC_OPCODE(V) \
7461 V(I8x16SConvertI16x8) \
7462 V(I8x16UConvertI16x8) \
7473 V(I8x16RoundingAverageU) \
7474 V(I16x8Q15MulRSatS) \
7475 V(I16x8SConvertI32x4) \
7476 V(I16x8UConvertI32x4) \
7488 V(I16x8RoundingAverageU) \
7520 V(F32x4RelaxedMin) \
7521 V(F32x4RelaxedMax) \
7522 V(F64x2RelaxedMin) \
7523 V(F64x2RelaxedMax) \
7524 V(I16x8RelaxedQ15MulRS) \
7525 V(I16x8DotI8x16I7x16S) \
7526 FOREACH_SIMD_128_BINARY_SIGN_EXTENSION_OPCODE(V)
7528#define FOREACH_SIMD_128_BINARY_SPECIAL_OPCODE(V) \
7530 V(I8x16RelaxedSwizzle)
7532#define FOREACH_SIMD_128_BINARY_MANDATORY_OPCODE(V) \
7533 FOREACH_SIMD_128_BINARY_BASIC_OPCODE(V) \
7534 FOREACH_SIMD_128_BINARY_SPECIAL_OPCODE(V)
7536#define FOREACH_SIMD_128_BINARY_OPTIONAL_OPCODE(V) \
7550#define FOREACH_SIMD_128_BINARY_OPCODE(V) \
7551 FOREACH_SIMD_128_BINARY_MANDATORY_OPCODE(V) \
7552 FOREACH_SIMD_128_BINARY_OPTIONAL_OPCODE(V)
7554struct Simd128BinopOp : FixedArityOperationT<2, Simd128BinopOp> {
7556 enum class Kind : uint8_t {
7557#define DEFINE_KIND(kind) k##kind,
7559 kFirstSignExtensionOp = kI16x8ExtMulLowI8x16S,
7560 kLastSignExtensionOp = kI64x2ExtMulHighI32x4U,
7567 static bool IsCommutative(Kind
kind) {
7570 case Kind::kI64x2Add:
7571 case Kind::kI32x4Add:
7572 case Kind::kI16x8Add:
7573 case Kind::kI8x16Add:
7574 case Kind::kF64x2Add:
7575 case Kind::kF32x4Add:
7577 case Kind::kI64x2Mul:
7578 case Kind::kI32x4Mul:
7579 case Kind::kI16x8Mul:
7580 case Kind::kF64x2Mul:
7581 case Kind::kF32x4Mul:
7583 case Kind::kS128Xor:
7590 static constexpr OpEffects effects = OpEffects();
7592 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7593 return RepVector<RegisterRepresentation::Simd128()>();
7596 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7597 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7599 RegisterRepresentation::Simd128()>();
7605 V<Simd128> left()
const {
return input<Simd128>(0); }
7606 V<Simd128> right()
const {
return input<Simd128>(1); }
7612 Simd128BinopOp::Kind
kind);
7614#define FOREACH_SIMD_128_UNARY_SIGN_EXTENSION_OPCODE(V) \
7615 V(I16x8SConvertI8x16Low) \
7616 V(I16x8SConvertI8x16High) \
7617 V(I16x8UConvertI8x16Low) \
7618 V(I16x8UConvertI8x16High) \
7619 V(I32x4SConvertI16x8Low) \
7620 V(I32x4SConvertI16x8High) \
7621 V(I32x4UConvertI16x8Low) \
7622 V(I32x4UConvertI16x8High) \
7623 V(I64x2SConvertI32x4Low) \
7624 V(I64x2SConvertI32x4High) \
7625 V(I64x2UConvertI32x4Low) \
7626 V(I64x2UConvertI32x4High)
7628#define FOREACH_SIMD_128_UNARY_NON_OPTIONAL_OPCODE(V) \
7630 V(F32x4DemoteF64x2Zero) \
7631 V(F64x2PromoteLowF32x4) \
7635 V(I16x8ExtAddPairwiseI8x16S) \
7636 V(I16x8ExtAddPairwiseI8x16U) \
7637 V(I32x4ExtAddPairwiseI16x8S) \
7638 V(I32x4ExtAddPairwiseI16x8U) \
7651 V(I32x4SConvertF32x4) \
7652 V(I32x4UConvertF32x4) \
7653 V(F32x4SConvertI32x4) \
7654 V(F32x4UConvertI32x4) \
7655 V(I32x4TruncSatF64x2SZero) \
7656 V(I32x4TruncSatF64x2UZero) \
7657 V(F64x2ConvertLowI32x4S) \
7658 V(F64x2ConvertLowI32x4U) \
7659 V(I32x4RelaxedTruncF32x4S) \
7660 V(I32x4RelaxedTruncF32x4U) \
7661 V(I32x4RelaxedTruncF64x2SZero) \
7662 V(I32x4RelaxedTruncF64x2UZero) \
7663 FOREACH_SIMD_128_UNARY_SIGN_EXTENSION_OPCODE(V)
7665#define FOREACH_SIMD_128_UNARY_OPTIONAL_OPCODE(V) \
7672 V(F16x8NearestInt) \
7673 V(I16x8SConvertF16x8) \
7674 V(I16x8UConvertF16x8) \
7675 V(F16x8SConvertI16x8) \
7676 V(F16x8UConvertI16x8) \
7677 V(F16x8DemoteF32x4Zero) \
7678 V(F16x8DemoteF64x2Zero) \
7679 V(F32x4PromoteLowF16x8) \
7683 V(F32x4NearestInt) \
7687 V(F64x2NearestInt) \
7690 V(Simd128ReverseBytes)
7692#define FOREACH_SIMD_128_UNARY_OPCODE(V) \
7693 FOREACH_SIMD_128_UNARY_NON_OPTIONAL_OPCODE(V) \
7694 FOREACH_SIMD_128_UNARY_OPTIONAL_OPCODE(V)
7696struct Simd128UnaryOp : FixedArityOperationT<1, Simd128UnaryOp> {
7698 enum class Kind : uint8_t {
7699#define DEFINE_KIND(kind) k##kind,
7701 kFirstSignExtensionOp = kI16x8SConvertI8x16Low,
7702 kLastSignExtensionOp = kI64x2UConvertI32x4High,
7709 static constexpr OpEffects effects = OpEffects();
7711 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7712 return RepVector<RegisterRepresentation::Simd128()>();
7715 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7716 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7717 return MaybeRepVector<RegisterRepresentation::Simd128()>();
7722 V<Simd128> input()
const {
return Base::input<Simd128>(0); }
7728 Simd128UnaryOp::Kind
kind);
7730#define FOREACH_SIMD_128_REDUCE_OPTIONAL_OPCODE(V) \
7738struct Simd128ReduceOp : FixedArityOperationT<1, Simd128ReduceOp> {
7739 enum class Kind : uint8_t {
7740#define DEFINE_KIND(kind) k##kind,
7741 FOREACH_SIMD_128_REDUCE_OPTIONAL_OPCODE(
DEFINE_KIND)
7747 static constexpr OpEffects effects = OpEffects();
7749 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7750 return RepVector<RegisterRepresentation::Simd128()>();
7753 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7754 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7755 return MaybeRepVector<RegisterRepresentation::Simd128()>();
7760 V<Simd128> input()
const {
return Base::input<Simd128>(0); }
7766 Simd128ReduceOp::Kind
kind);
7768#define FOREACH_SIMD_128_SHIFT_OPCODE(V) \
7782struct Simd128ShiftOp : FixedArityOperationT<2, Simd128ShiftOp> {
7783 enum class Kind : uint8_t {
7784#define DEFINE_KIND(kind) k##kind,
7791 static constexpr OpEffects effects = OpEffects();
7793 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7794 return RepVector<RegisterRepresentation::Simd128()>();
7797 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7798 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7800 RegisterRepresentation::Word32()>();
7804 : Base(input, shift),
kind(
kind) {}
7806 V<Simd128> input()
const {
return Base::input<Simd128>(0); }
7807 V<Word32> shift()
const {
return Base::input<Word32>(1); }
7813 Simd128ShiftOp::Kind
kind);
7815#define FOREACH_SIMD_128_TEST_OPCODE(V) \
7826struct Simd128TestOp : FixedArityOperationT<1, Simd128TestOp> {
7827 enum class Kind : uint8_t {
7828#define DEFINE_KIND(kind) k##kind,
7835 static constexpr OpEffects effects = OpEffects();
7837 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7838 return RepVector<RegisterRepresentation::Word32()>();
7841 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7842 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7843 return MaybeRepVector<RegisterRepresentation::Simd128()>();
7848 V<Simd128> input()
const {
return Base::input<Simd128>(0); }
7854 Simd128TestOp::Kind
kind);
7856#define FOREACH_SIMD_128_SPLAT_MANDATORY_OPCODE(V) \
7864#define FOREACH_SIMD_128_SPLAT_OPCODE(V) \
7865 FOREACH_SIMD_128_SPLAT_MANDATORY_OPCODE(V) \
7867struct Simd128SplatOp : FixedArityOperationT<1, Simd128SplatOp> {
7868 enum class Kind : uint8_t {
7869#define DEFINE_KIND(kind) k##kind,
7876 static constexpr OpEffects effects = OpEffects();
7878 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7879 return RepVector<RegisterRepresentation::Simd128()>();
7882 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7883 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7888 return MaybeRepVector<RegisterRepresentation::Word32()>();
7890 return MaybeRepVector<RegisterRepresentation::Word64()>();
7893 return MaybeRepVector<RegisterRepresentation::Float32()>();
7895 return MaybeRepVector<RegisterRepresentation::Float64()>();
7901 V<Any> input()
const {
return Base::input<Any>(0); }
7907 Simd128SplatOp::Kind
kind);
7909#define FOREACH_SIMD_128_TERNARY_MASK_OPCODE(V) \
7911 V(I8x16RelaxedLaneSelect) \
7912 V(I16x8RelaxedLaneSelect) \
7913 V(I32x4RelaxedLaneSelect) \
7914 V(I64x2RelaxedLaneSelect)
7916#define FOREACH_SIMD_128_TERNARY_OTHER_OPCODE(V) \
7921 V(I32x4DotI8x16I7x16AddS)
7923#define FOREACH_SIMD_128_TERNARY_OPTIONAL_OPCODE(V) \
7927#define FOREACH_SIMD_128_TERNARY_OPCODE(V) \
7928 FOREACH_SIMD_128_TERNARY_MASK_OPCODE(V) \
7929 FOREACH_SIMD_128_TERNARY_OTHER_OPCODE(V) \
7930 FOREACH_SIMD_128_TERNARY_OPTIONAL_OPCODE(V)
7932struct Simd128TernaryOp : FixedArityOperationT<3, Simd128TernaryOp> {
7933 enum class Kind : uint8_t {
7934#define DEFINE_KIND(kind) k##kind,
7941 static constexpr OpEffects effects = OpEffects();
7943 base::Vector<const RegisterRepresentation> outputs_rep()
const {
7944 return RepVector<RegisterRepresentation::Simd128()>();
7947 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
7948 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
7950 RegisterRepresentation::Simd128(),
7951 RegisterRepresentation::Simd128()>();
7958 V<Simd128> first()
const {
return input<Simd128>(0); }
7960 V<Simd128> third()
const {
return input<Simd128>(2); }
7966 Simd128TernaryOp::Kind
kind);
7968struct Simd128ExtractLaneOp : FixedArityOperationT<1, Simd128ExtractLaneOp> {
7969 enum class Kind : uint8_t {
7984 static constexpr OpEffects effects = OpEffects();
7990 return MachineRepresentation::kWord8;
7993 return MachineRepresentation::kWord16;
7995 return MachineRepresentation::kWord32;
7997 return MachineRepresentation::kWord64;
8000 return MachineRepresentation::kFloat32;
8002 return MachineRepresentation::kFloat64;
8006 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8013 return RepVector<RegisterRepresentation::Word32()>();
8015 return RepVector<RegisterRepresentation::Word64()>();
8018 return RepVector<RegisterRepresentation::Float32()>();
8020 return RepVector<RegisterRepresentation::Float64()>();
8024 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8025 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8026 return MaybeRepVector<RegisterRepresentation::Simd128()>();
8030 : Base(input),
kind(
kind), lane(lane) {}
8032 V<Simd128> input()
const {
return Base::input<Simd128>(0); }
8034 void Validate(
const Graph& graph)
const {
8060 auto options()
const {
return std::tuple{
kind, lane}; }
8061 void PrintOptions(std::ostream& os)
const;
8064struct Simd128ReplaceLaneOp : FixedArityOperationT<2, Simd128ReplaceLaneOp> {
8065 enum class Kind : uint8_t {
8078 static constexpr OpEffects effects = OpEffects();
8080 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8081 return RepVector<RegisterRepresentation::Simd128()>();
8083 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8084 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8086 {RegisterRepresentation::Simd128(), new_lane_rep()});
8091 : Base(into, new_lane),
kind(
kind), lane(lane) {}
8093 V<Simd128> into()
const {
return input<Simd128>(0); }
8094 V<Any> new_lane()
const {
return input<Any>(1); }
8096 void Validate(
const Graph& graph)
const {
8120 auto options()
const {
return std::tuple{
kind, lane}; }
8121 void PrintOptions(std::ostream& os)
const;
8123 RegisterRepresentation new_lane_rep()
const {
8128 return RegisterRepresentation::Word32();
8130 return RegisterRepresentation::Word64();
8133 return RegisterRepresentation::Float32();
8135 return RegisterRepresentation::Float64();
8145struct Simd128LaneMemoryOp : FixedArityOperationT<3, Simd128LaneMemoryOp> {
8147 using Kind = LoadOp::Kind;
8149 enum class LaneKind : uint8_t { k8 = 0, k16 = 1, k32 = 2, k64 = 3 };
8157 OpEffects Effects()
const {
8158 OpEffects effects = mode == Mode::kLoad ? OpEffects().CanReadMemory()
8159 : OpEffects().CanWriteMemory();
8160 effects = effects.CanDependOnChecks();
8161 if (
kind.with_trap_handler) effects = effects.CanLeaveCurrentFunction();
8165 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8166 return mode == Mode::kLoad ? RepVector<RegisterRepresentation::Simd128()>()
8170 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8171 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8173 RegisterRepresentation::WordPtr(),
8174 RegisterRepresentation::Simd128()>();
8177 Simd128LaneMemoryOp(OpIndex
base, OpIndex index, OpIndex value, Mode mode,
8178 Kind
kind, LaneKind lane_kind, uint8_t lane,
int offset)
8179 : Base(
base, index, value),
8182 lane_kind(lane_kind),
8189 uint8_t lane_size()
const {
return 1 <<
static_cast<uint8_t
>(lane_kind); }
8191 void Validate(
const Graph& graph) {
8195 switch (lane_kind) {
8216 void PrintOptions(std::ostream& os)
const;
8219#define FOREACH_SIMD_128_LOAD_TRANSFORM_OPCODE(V) \
8243struct Simd128LoadTransformOp
8244 : FixedArityOperationT<2, Simd128LoadTransformOp> {
8245 using LoadKind = LoadOp::Kind;
8246 enum class TransformKind : uint8_t {
8247#define DEFINE_KIND(kind) k##kind,
8248 FOREACH_SIMD_128_LOAD_TRANSFORM_OPCODE(
DEFINE_KIND)
8253 TransformKind transform_kind;
8256 OpEffects Effects()
const {
8257 OpEffects effects = OpEffects().CanReadMemory().CanDependOnChecks();
8258 if (load_kind.with_trap_handler) {
8259 effects = effects.CanLeaveCurrentFunction();
8264 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8265 return RepVector<RegisterRepresentation::Simd128()>();
8268 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8269 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8271 RegisterRepresentation::WordPtr()>();
8274 Simd128LoadTransformOp(V<WordPtr>
base, V<WordPtr> index, LoadKind load_kind,
8275 TransformKind transform_kind,
int offset)
8276 : Base(
base, index),
8277 load_kind(load_kind),
8278 transform_kind(transform_kind),
8281 V<WordPtr>
base()
const {
return input<WordPtr>(0); }
8282 V<WordPtr>
index()
const {
return input<WordPtr>(1); }
8284 void Validate(
const Graph& graph) {
DCHECK(!load_kind.tagged_base); }
8286 auto options()
const {
return std::tuple{load_kind, transform_kind,
offset}; }
8287 void PrintOptions(std::ostream& os)
const;
8293struct Simd128ShuffleOp : FixedArityOperationT<2, Simd128ShuffleOp> {
8294 enum class Kind : uint8_t {
8304 static constexpr OpEffects effects = OpEffects();
8306 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8307 return RepVector<RegisterRepresentation::Simd128()>();
8310 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8311 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8313 RegisterRepresentation::Simd128()>();
8317 const uint8_t incoming_shuffle[kSimd128Size])
8336 std::copy_n(incoming_shuffle, count, shuffle);
8339 V<Simd128> left()
const {
return input<Simd128>(0); }
8340 V<Simd128> right()
const {
return input<Simd128>(1); }
8342 void Validate(
const Graph& graph) {
8344 constexpr uint8_t kNumberOfLanesForShuffle = 32;
8345 for (uint8_t index : shuffle) {
8346 DCHECK_LT(index, kNumberOfLanesForShuffle);
8351 auto options()
const {
return std::tuple{
kind, shuffle}; }
8352 void PrintOptions(std::ostream& os)
const;
8355#if V8_ENABLE_WASM_DEINTERLEAVED_MEM_OPS
8360struct Simd128LoadPairDeinterleaveOp
8361 : FixedArityOperationT<2, Simd128LoadPairDeinterleaveOp> {
8362 using LoadKind = LoadOp::Kind;
8363 enum class Kind : uint8_t {
8373 OpEffects Effects()
const {
8374 OpEffects effects = OpEffects().CanReadMemory().CanDependOnChecks();
8375 if (load_kind.with_trap_handler) {
8376 effects = effects.CanLeaveCurrentFunction();
8381 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8382 return RepVector<RegisterRepresentation::Simd128(),
8383 RegisterRepresentation::Simd128()>();
8386 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8387 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8389 RegisterRepresentation::WordPtr()>();
8392 Simd128LoadPairDeinterleaveOp(V<WordPtr>
base, V<WordPtr> index,
8393 LoadKind load_kind, Kind
kind)
8394 : Base(
base, index), load_kind(load_kind),
kind(
kind) {}
8396 V<WordPtr>
base()
const {
return Base::input<WordPtr>(0); }
8397 V<WordPtr>
index()
const {
return Base::input<WordPtr>(1); }
8399 uint32_t lane_size()
const {
8412 void Validate(
const Graph& graph)
const {
DCHECK(!load_kind.tagged_base); }
8414 auto options()
const {
return std::tuple{load_kind,
kind}; }
8416 void PrintOptions(std::ostream& os)
const;
8421#if V8_ENABLE_WASM_SIMD256_REVEC
8423struct Simd256ConstantOp : FixedArityOperationT<0, Simd256ConstantOp> {
8427 static constexpr OpEffects effects = OpEffects();
8429 explicit Simd256ConstantOp(
const uint8_t incoming_value[kSimd256Size])
8431 std::copy(incoming_value, incoming_value + kSimd256Size, value);
8434 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8435 return RepVector<RegisterRepresentation::Simd256()>();
8438 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8439 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8443 void Validate(
const Graph& graph)
const {
8447 bool IsZero()
const {
return std::memcmp(kZero, value, kSimd256Size) == 0; }
8449 auto options()
const {
return std::tuple{value}; }
8450 void PrintOptions(std::ostream& os)
const;
8453struct Simd256Extract128LaneOp
8454 : FixedArityOperationT<1, Simd256Extract128LaneOp> {
8457 static constexpr OpEffects effects = OpEffects();
8459 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8460 return RepVector<RegisterRepresentation::Simd128()>();
8463 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8464 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8465 return MaybeRepVector<RegisterRepresentation::Simd256()>();
8468 Simd256Extract128LaneOp(OpIndex input, uint8_t lane)
8469 : Base(input), lane(lane) {}
8471 OpIndex input()
const {
return Base::input(0); }
8473 void Validate(
const Graph& graph)
const {
8479 auto options()
const {
return std::tuple{lane}; }
8480 void PrintOptions(std::ostream& os)
const;
8483#define FOREACH_SIMD_256_LOAD_TRANSFORM_OPCODE(V) \
8496struct Simd256LoadTransformOp
8497 : FixedArityOperationT<2, Simd256LoadTransformOp> {
8498 using LoadKind = LoadOp::Kind;
8499 enum class TransformKind : uint8_t {
8500#define DEFINE_KIND(kind) k##kind,
8501 FOREACH_SIMD_256_LOAD_TRANSFORM_OPCODE(
DEFINE_KIND)
8506 TransformKind transform_kind;
8509 OpEffects Effects()
const {
8510 OpEffects effects = OpEffects().CanReadMemory().CanDependOnChecks();
8511 if (load_kind.with_trap_handler) {
8512 effects = effects.CanLeaveCurrentFunction();
8517 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8518 return RepVector<RegisterRepresentation::Simd256()>();
8521 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8522 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8524 RegisterRepresentation::WordPtr()>();
8527 Simd256LoadTransformOp(V<WordPtr>
base, V<WordPtr> index, LoadKind load_kind,
8528 TransformKind transform_kind,
int offset)
8529 : Base(
base, index),
8530 load_kind(load_kind),
8531 transform_kind(transform_kind),
8534 V<WordPtr>
base()
const {
return input<WordPtr>(0); }
8535 V<WordPtr>
index()
const {
return input<WordPtr>(1); }
8537 void Validate(
const Graph& graph) {
DCHECK(!load_kind.tagged_base); }
8539 auto options()
const {
return std::tuple{load_kind, transform_kind,
offset}; }
8540 void PrintOptions(std::ostream& os)
const;
8543#define FOREACH_SIMD_256_UNARY_SIGN_EXTENSION_OPCODE(V) \
8544 V(I16x16SConvertI8x16) \
8545 V(I16x16UConvertI8x16) \
8546 V(I32x8SConvertI16x8) \
8547 V(I32x8UConvertI16x8) \
8548 V(I64x4SConvertI32x4) \
8549 V(I64x4UConvertI32x4)
8551#define FOREACH_SIMD_256_UNARY_OPCODE(V) \
8555 V(I16x16ExtAddPairwiseI8x32S) \
8556 V(I16x16ExtAddPairwiseI8x32U) \
8557 V(I32x8ExtAddPairwiseI16x16S) \
8558 V(I32x8ExtAddPairwiseI16x16U) \
8569 V(I32x8UConvertF32x8) \
8570 V(I32x8SConvertF32x8) \
8571 V(F32x8UConvertI32x8) \
8572 V(F32x8SConvertI32x8) \
8573 V(I32x8RelaxedTruncF32x8S) \
8574 V(I32x8RelaxedTruncF32x8U) \
8575 FOREACH_SIMD_256_UNARY_SIGN_EXTENSION_OPCODE(V)
8577struct Simd256UnaryOp : FixedArityOperationT<1, Simd256UnaryOp> {
8579 enum class Kind : uint8_t {
8580#define DEFINE_KIND(kind) k##kind,
8582 kFirstSignExtensionOp = kI16x16SConvertI8x16,
8583 kLastSignExtensionOp = kI64x4UConvertI32x4,
8590 static constexpr OpEffects effects = OpEffects();
8592 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8593 return RepVector<RegisterRepresentation::Simd256()>();
8596 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8597 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8598 if (
kind >= Kind::kFirstSignExtensionOp) {
8599 return MaybeRepVector<RegisterRepresentation::Simd128()>();
8601 return MaybeRepVector<RegisterRepresentation::Simd256()>();
8605 Simd256UnaryOp(OpIndex input, Kind
kind) : Base(input),
kind(
kind) {}
8607 OpIndex input()
const {
return Base::input(0); }
8612std::ostream&
operator<<(std::ostream& os, Simd256UnaryOp::Kind
kind);
8614#define FOREACH_SIMD_256_BINARY_SIGN_EXTENSION_OPCODE(V) \
8615 V(I64x4ExtMulI32x4S) \
8616 V(I64x4ExtMulI32x4U) \
8617 V(I32x8ExtMulI16x8S) \
8618 V(I32x8ExtMulI16x8U) \
8619 V(I16x16ExtMulI8x16S) \
8620 V(I16x16ExtMulI8x16U)
8622#define FOREACH_SIMD_256_BINARY_OPCODE(V) \
8653 V(I8x32SConvertI16x16) \
8654 V(I8x32UConvertI16x16) \
8665 V(I8x32RoundingAverageU) \
8666 V(I16x16SConvertI32x8) \
8667 V(I16x16UConvertI32x8) \
8679 V(I16x16RoundingAverageU) \
8687 V(I32x8DotI16x16S) \
8711 V(F32x8RelaxedMin) \
8712 V(F32x8RelaxedMax) \
8713 V(F64x4RelaxedMin) \
8714 V(F64x4RelaxedMax) \
8715 V(I16x16DotI8x32I7x32S) \
8716 FOREACH_SIMD_256_BINARY_SIGN_EXTENSION_OPCODE(V)
8718struct Simd256BinopOp : FixedArityOperationT<2, Simd256BinopOp> {
8720 enum class Kind : uint8_t {
8721#define DEFINE_KIND(kind) k##kind,
8723 kFirstSignExtensionOp = kI64x4ExtMulI32x4S,
8724 kLastSignExtensionOp = kI16x16ExtMulI8x16U,
8731 static constexpr OpEffects effects = OpEffects();
8733 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8734 return RepVector<RegisterRepresentation::Simd256()>();
8737 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8738 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8739 if (
kind >= Kind::kFirstSignExtensionOp) {
8741 RegisterRepresentation::Simd128()>();
8744 RegisterRepresentation::Simd256()>();
8748 Simd256BinopOp(OpIndex left, OpIndex right, Kind
kind)
8751 OpIndex left()
const {
return input(0); }
8752 OpIndex right()
const {
return input(1); }
8758std::ostream&
operator<<(std::ostream& os, Simd256BinopOp::Kind
kind);
8760#define FOREACH_SIMD_256_SHIFT_OPCODE(V) \
8770struct Simd256ShiftOp : FixedArityOperationT<2, Simd256ShiftOp> {
8771 enum class Kind : uint8_t {
8772#define DEFINE_KIND(kind) k##kind,
8779 static constexpr OpEffects effects = OpEffects();
8781 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8782 return RepVector<RegisterRepresentation::Simd256()>();
8785 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8786 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8788 RegisterRepresentation::Word32()>();
8792 : Base(input, shift),
kind(
kind) {}
8794 V<Simd256> input()
const {
return Base::input<Simd256>(0); }
8795 V<Word32> shift()
const {
return Base::input<Word32>(1); }
8801 Simd256ShiftOp::Kind
kind);
8803#define FOREACH_SIMD_256_TERNARY_MASK_OPCODE(V) \
8805 V(I8x32RelaxedLaneSelect) \
8806 V(I16x16RelaxedLaneSelect) \
8807 V(I32x8RelaxedLaneSelect) \
8808 V(I64x4RelaxedLaneSelect)
8810#define FOREACH_SIMD_256_TERNARY_OTHER_OPCODE(V) \
8815 V(I32x8DotI8x32I7x32AddS)
8817#define FOREACH_SIMD_256_TERNARY_OPCODE(V) \
8818 FOREACH_SIMD_256_TERNARY_MASK_OPCODE(V) \
8819 FOREACH_SIMD_256_TERNARY_OTHER_OPCODE(V)
8821struct Simd256TernaryOp : FixedArityOperationT<3, Simd256TernaryOp> {
8822 enum class Kind : uint8_t {
8823#define DEFINE_KIND(kind) k##kind,
8830 static constexpr OpEffects effects = OpEffects();
8832 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8833 return RepVector<RegisterRepresentation::Simd256()>();
8836 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8837 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8839 RegisterRepresentation::Simd256(),
8840 RegisterRepresentation::Simd256()>();
8847 V<Simd256> first()
const {
return input<Simd256>(0); }
8849 V<Simd256> third()
const {
return input<Simd256>(2); }
8854std::ostream&
operator<<(std::ostream& os, Simd256TernaryOp::Kind
kind);
8856#define FOREACH_SIMD_256_SPLAT_OPCODE(V) \
8864struct Simd256SplatOp : FixedArityOperationT<1, Simd256SplatOp> {
8865 enum class Kind : uint8_t {
8866#define DEFINE_KIND(kind) k##kind,
8873 static constexpr OpEffects effects = OpEffects();
8875 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8876 return RepVector<RegisterRepresentation::Simd256()>();
8879 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8880 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8885 return MaybeRepVector<RegisterRepresentation::Word32()>();
8887 return MaybeRepVector<RegisterRepresentation::Word64()>();
8889 return MaybeRepVector<RegisterRepresentation::Float32()>();
8891 return MaybeRepVector<RegisterRepresentation::Float64()>();
8895 Simd256SplatOp(OpIndex input, Kind
kind) : Base(input),
kind(
kind) {}
8897 OpIndex input()
const {
return Base::input(0); }
8902std::ostream&
operator<<(std::ostream& os, Simd256SplatOp::Kind
kind);
8904struct SimdPack128To256Op : FixedArityOperationT<2, SimdPack128To256Op> {
8905 static constexpr OpEffects effects = OpEffects();
8907 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8908 return RepVector<RegisterRepresentation::Simd256()>();
8911 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8912 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8914 RegisterRepresentation::Simd128()>();
8918 V<Simd128> left()
const {
return Base::input<Simd128>(0); }
8919 V<Simd128> right()
const {
return Base::input<Simd128>(1); }
8920 auto options()
const {
return std::tuple{}; }
8923#ifdef V8_TARGET_ARCH_X64
8924struct Simd256ShufdOp : FixedArityOperationT<1, Simd256ShufdOp> {
8925 static constexpr OpEffects effects = OpEffects();
8928 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8929 return RepVector<RegisterRepresentation::Simd256()>();
8932 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8933 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8934 return MaybeRepVector<RegisterRepresentation::Simd256()>();
8937 Simd256ShufdOp(
V<Simd256> input, uint8_t control)
8938 : Base(input), control(control) {}
8940 V<Simd256> input()
const {
return Base::input<Simd256>(0); }
8943 auto options()
const {
return std::tuple{control}; }
8945 void PrintOptions(std::ostream& os)
const;
8948struct Simd256ShufpsOp : FixedArityOperationT<2, Simd256ShufpsOp> {
8949 static constexpr OpEffects effects = OpEffects();
8952 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8953 return RepVector<RegisterRepresentation::Simd256()>();
8956 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8957 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8959 RegisterRepresentation::Simd256()>();
8963 : Base(left, right), control(control) {}
8965 V<Simd256> left()
const {
return Base::input<Simd256>(0); }
8966 V<Simd256> right()
const {
return Base::input<Simd256>(1); }
8969 auto options()
const {
return std::tuple{control}; }
8971 void PrintOptions(std::ostream& os)
const;
8974#define FOREACH_SIMD_256_UNPACK_OPCODE(V) \
8977struct Simd256UnpackOp : FixedArityOperationT<2, Simd256UnpackOp> {
8978 enum class Kind : uint8_t {
8979#define DEFINE_KIND(kind) k##kind,
8983 static constexpr OpEffects effects = OpEffects();
8986 base::Vector<const RegisterRepresentation> outputs_rep()
const {
8987 return RepVector<RegisterRepresentation::Simd256()>();
8990 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
8991 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
8993 RegisterRepresentation::Simd256()>();
8999 V<Simd256> left()
const {
return Base::input<Simd256>(0); }
9000 V<Simd256> right()
const {
return Base::input<Simd256>(1); }
9005std::ostream&
operator<<(std::ostream& os, Simd256UnpackOp::Kind
kind);
9010struct LoadStackPointerOp : FixedArityOperationT<0, LoadStackPointerOp> {
9012 static constexpr OpEffects effects = OpEffects().CanReadMemory();
9014 base::Vector<const RegisterRepresentation> outputs_rep()
const {
9015 return RepVector<RegisterRepresentation::WordPtr()>();
9018 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
9019 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
9023 auto options()
const {
return std::tuple{}; }
9026struct SetStackPointerOp : FixedArityOperationT<1, SetStackPointerOp> {
9028 static constexpr OpEffects effects = OpEffects().CanCallAnything();
9032 explicit SetStackPointerOp(OpIndex value) : Base(value) {}
9034 base::Vector<const RegisterRepresentation> outputs_rep()
const {
return {}; }
9036 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
9037 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
9038 return MaybeRepVector<MaybeRegisterRepresentation::WordPtr()>();
9041 auto options()
const {
return std::tuple{}; }
9046#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
9047struct GetContinuationPreservedEmbedderDataOp
9048 : FixedArityOperationT<0, GetContinuationPreservedEmbedderDataOp> {
9049 static constexpr OpEffects effects = OpEffects().CanReadOffHeapMemory();
9051 base::Vector<const RegisterRepresentation> outputs_rep()
const {
9052 return RepVector<RegisterRepresentation::Tagged()>();
9055 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
9056 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
9060 GetContinuationPreservedEmbedderDataOp() : Base() {}
9063 auto options()
const {
return std::tuple{}; }
9066struct SetContinuationPreservedEmbedderDataOp
9067 : FixedArityOperationT<1, SetContinuationPreservedEmbedderDataOp> {
9068 static constexpr OpEffects effects = OpEffects().CanWriteOffHeapMemory();
9070 base::Vector<const RegisterRepresentation> outputs_rep()
const {
return {}; }
9072 base::Vector<const MaybeRegisterRepresentation> inputs_rep(
9073 ZoneVector<MaybeRegisterRepresentation>& storage)
const {
9074 return MaybeRepVector<MaybeRegisterRepresentation::Tagged()>();
9077 explicit SetContinuationPreservedEmbedderDataOp(
V<Object> value)
9081 auto options()
const {
return std::tuple{}; }
9085#define OPERATION_EFFECTS_CASE(Name) Name##Op::EffectsIfStatic(),
9086static constexpr std::optional<OpEffects>
9089#undef OPERATION_EFFECTS_CASE
9094template <Opcode opcode>
9097#define OPERATION_OPCODE_MAP_CASE(Name) \
9099 struct opcode_to_operation_map<Opcode::k##Name> { \
9100 using Op = Name##Op; \
9103#undef OPERATION_OPCODE_MAP_CASE
9105template <
class Op,
class =
void>
9109 : std::integral_constant<uint32_t, sizeof(Op::inputs) / sizeof(OpIndex)> {};
9111#define OPERATION_SIZE(Name) sizeof(Name##Op),
9113#undef OPERATION_SIZE
9116#define OPERATION_SIZE(Name) (sizeof(Name##Op) / sizeof(OpIndex)),
9118#undef OPERATION_SIZE
9125 reinterpret_cast<const char*
>(
this) +
9127 return {ptr, input_count};
9136 return Cast<LoadOp>().Effects();
9137 case Opcode::kStore:
9138 return Cast<StoreOp>().Effects();
9140 return Cast<CallOp>().Effects();
9141 case Opcode::kDidntThrow:
9142 return Cast<DidntThrowOp>().Effects();
9143 case Opcode::kTaggedBitcast:
9144 return Cast<TaggedBitcastOp>().Effects();
9145 case Opcode::kAtomicRMW:
9146 return Cast<AtomicRMWOp>().Effects();
9147 case Opcode::kAtomicWord32Pair:
9148 return Cast<AtomicWord32PairOp>().Effects();
9149 case Opcode::kJSStackCheck:
9150 return Cast<JSStackCheckOp>().Effects();
9151#if V8_ENABLE_WEBASSEMBLY
9152 case Opcode::kWasmStackCheck:
9153 return Cast<WasmStackCheckOp>().Effects();
9154 case Opcode::kStructGet:
9155 return Cast<StructGetOp>().Effects();
9156 case Opcode::kStructSet:
9157 return Cast<StructSetOp>().Effects();
9158 case Opcode::kArrayLength:
9159 return Cast<ArrayLengthOp>().Effects();
9160 case Opcode::kSimd128LaneMemory:
9161 return Cast<Simd128LaneMemoryOp>().Effects();
9162 case Opcode::kSimd128LoadTransform:
9163 return Cast<Simd128LoadTransformOp>().Effects();
9164#if V8_ENABLE_WASM_DEINTERLEAVED_MEM_OPS
9165 case Opcode::kSimd128LoadPairDeinterleave:
9166 return Cast<Simd128LoadPairDeinterleaveOp>().Effects();
9168#if V8_ENABLE_WASM_SIMD256_REVEC
9169 case Opcode::kSimd256LoadTransform:
9170 return Cast<Simd256LoadTransformOp>().Effects();
9179inline size_t Operation::StorageSlotCount(
Opcode opcode,
size_t input_count) {
9183 return std::max<size_t>(2, (
r - 1 + size + input_count) /
r);
9194 case Opcode::k##type: { \
9195 const type##Op& op = Cast<type##Op>(); \
9196 return op.outputs_rep(); \
9207 case Opcode::k##type: { \
9208 const type##Op& op = Cast<type##Op>(); \
9209 return op.inputs_rep(storage); \
9217 const Graph& graph);
9246template <
typename T>
9248 requires(std::is_enum_v<T> || std::is_integral_v<T> ||
9249 std::is_floating_point_v<T>)
9256template <
template <
typename>
typename HandleType,
typename T>
9258 requires(std::disjunction_v<
9264template <
typename T>
9291#ifdef V8_ENABLE_WEBASSEMBLY
9295constexpr size_t input_count(wasm::ValueType) {
return 0; }
9296constexpr size_t input_count(WasmTypeCheckConfig) {
return 0; }
9297constexpr size_t input_count(wasm::ModuleTypeIndex) {
return 0; }
9304 return inputs.
size();
9306template <
typename T>
9308 return inputs.size();
9312template <
typename Op,
typename... Args>
9315 size_t input_count = (0 + ... + detail::input_count(
args));
9316 size_t size = Operation::StorageSlotCount(Op::opcode, input_count);
9318 Op* op =
new (storage.
data()) Op(
args...);
9323 DCHECK_GE(input_count, op->input_count);
9327template <
typename F>
9331 case Opcode::k##name: \
9332 return f(op.Cast<name##Op>());
9341template <
typename T,
typename Tuple>
9344template <
typename T,
typename... Ts>
9346 static constexpr bool value = (std::is_same_v<T, Ts> || ...);
9349template <
typename Op,
typename =
void>
9351template <
typename Op>
9353 Op,
std::void_t<std::conjunction<decltype(Op::kOutputRepsStorage),
9354 decltype(Op::lazy_deopt_on_throw)>>>
9355 : std::true_type {};
9357template <
typename Op,
typename =
void>
9360template <
typename Op>
9362 Op,
std::enable_if_t<TupleHasType<
9363 LazyDeoptOnThrow, decltype(std::declval<Op>().options())>::value>>
9364 : std::true_type {};
9377#define THROWING_OP_LOOKS_VALID(Name) \
9378 static_assert(details::ThrowingOpHasProperMembers<Name##Op>()); \
9379 static_assert(details::ThrowingOpHasLazyDeoptOption<Name##Op>());
9381#undef THROWING_OP_LOOKS_VALID
#define FORWARD_DECLARE(Name, Argc)
constexpr Type GetType() const
constexpr Flags GetFlags() const
constexpr SequenceType GetSequenceType() const
void resize(size_t new_size)
Vector< T > SubVector(size_t from, size_t to) const
constexpr size_t size() const
V8_INLINE Address address() const
constexpr MachineRepresentation representation() const
bool equals(MaybeHandle< T > other) const
V8_INLINE Address address() const
void resize(size_t new_size)
size_t ParameterCount() const
MachineType GetParameterType(size_t index) const
size_t ReturnCount() const
MachineType GetReturnType(size_t index) const
static constexpr MaybeRegisterRepresentation Float64()
static constexpr MaybeRegisterRepresentation Compressed()
static constexpr MaybeRegisterRepresentation Word64()
static constexpr MaybeRegisterRepresentation Float32()
static constexpr MaybeRegisterRepresentation Tagged()
static constexpr MaybeRegisterRepresentation Word32()
static constexpr MaybeRegisterRepresentation Simd128()
static constexpr MaybeRegisterRepresentation Simd256()
RegisterRepresentation ToRegisterRepresentation() const
bool IsCompressibleTagged() const
RegisterRepresentation ToRegisterRepresentationForStore() const
constexpr bool has_value() const
constexpr OpIndex value() const
constexpr bool valid() const
constexpr V< T > value() const
constexpr Enum value() const
SaturatedUint8(uint8_t val)
static constexpr uint8_t kMax
SaturatedUint8 & operator+=(const SaturatedUint8 &other)
static SaturatedUint8 FromSize(size_t value)
size_t size() const noexcept
constexpr Enum value() const
#define DEFINE_MULTI_SWITCH_INTEGRAL(name, max_value)
constexpr const char * ToString(DataViewOp op)
base::Vector< const DirectHandle< Object > > args
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in allocation gc speed threshold for starting incremental marking via a task in percent of available threshold for starting incremental marking immediately in percent of available Use a single schedule for determining a marking schedule between JS and C objects schedules the minor GC task with kUserVisible priority max worker number of concurrent for NumberOfWorkerThreads start background threads that allocate memory concurrent_array_buffer_sweeping use parallel threads to clear weak refs in the atomic pause trace progress of the incremental marking trace object counts and memory usage report a tick only when allocated zone memory changes by this amount TracingFlags::gc_stats TracingFlags::gc_stats track native contexts that are expected to be garbage collected verify heap pointers before and after GC memory reducer runs GC with ReduceMemoryFootprint flag Maximum number of memory reducer GCs scheduled Old gen GC speed is computed directly from gc tracer counters Perform compaction on full GCs based on V8 s default heuristics Perform compaction on every full GC Perform code space compaction when finalizing a full GC with stack Stress GC compaction to flush out bugs with moving objects flush of baseline code when it has not been executed recently Use time base code flushing instead of age Use a progress bar to scan large objects in increments when incremental marking is active force incremental marking for small heaps and run it more often force marking at random points between and force scavenge at random points between and reclaim otherwise unreachable unmodified wrapper objects when possible less compaction in non memory reducing mode use high priority threads for concurrent Marking Test mode only flag It allows an unit test to select evacuation candidates use incremental marking for CppHeap cppheap_concurrent_marking c value for membalancer A special constant to balance between memory and space tradeoff The smaller the more memory it uses enable use of SSE4 instructions if available enable use of AVX VNNI instructions if available enable use of POPCNT instruction if available force all emitted branches to be in long mode(MIPS/PPC only)") DEFINE_BOOL(partial_constant_pool
other heap size flags(e.g. initial_heap_size) take precedence") DEFINE_SIZE_T( max_shared_heap_size
#define DECLARE_GETTER(name, Type)
#define DECLARE_FIELD(name,...)
DirectHandle< JSReceiver > options
ZoneVector< RpoNumber > & result
InstructionOperand destination
V8_INLINE Dest bit_cast(Source const &source)
constexpr Vector< T > VectorOf(T *start, size_t size)
constexpr size_t input_count()
std::ostream & operator<<(std::ostream &os, PaddingSpace padding)
constexpr uint16_t kNumberOfBlockTerminatorOpcodes
constexpr Opcode operation_to_opcode_v
V8_INLINE const Operation & Get(const Graph &graph, OpIndex index)
constexpr bool MayThrow(Opcode opcode)
typename underlying_operation< T >::type underlying_operation_t
constexpr RegisterRepresentation RegisterRepresentationForArrayType(ExternalArrayType array_type)
V8_INLINE size_t fast_hash_combine()
const char * OpcodeName(Opcode opcode)
V8_EXPORT_PRIVATE V8_INLINE bool ShouldSkipOperation(const Operation &op)
uint64_t OperationStorageSlot
V8_INLINE OperationStorageSlot * AllocateOpStorage(Graph *graph, size_t slot_count)
V8_INLINE size_t hash_value(OpIndex op)
std::optional< Builtin > TryGetBuiltinId(const ConstantOp *target, JSHeapBroker *broker)
auto VisitOperation(const Operation &op, F &&f)
base::Vector< const RegisterRepresentation > RepVector()
constexpr bool IsBlockTerminator(Opcode opcode)
base::Vector< const RegisterRepresentation > VectorForRep(RegisterRepresentation rep)
V8_INLINE bool CanBeUsedAsInput(const Operation &op)
Zone * get_zone(Graph *graph)
OptionalV(V< T >) -> OptionalV< T >
constexpr std::underlying_type_t< Opcode > OpcodeIndex(Opcode x)
base::Vector< const MaybeRegisterRepresentation > MaybeRepVector()
bool CannotSwapProtectedLoads(OpEffects first, OpEffects second)
constexpr size_t kOperationSizeTable[kNumberOfOpcodes]
constexpr uint16_t kNumberOfOpcodes
static constexpr std::optional< OpEffects > kOperationEffectsTable[kNumberOfOpcodes]
constexpr size_t kOperationSizeDividedBySizeofOpIndexTable[kNumberOfOpcodes]
constexpr char kCompilationZoneName[]
bool CannotSwapOperations(OpEffects first, OpEffects second)
base::Vector< T > InitVectorOf(ZoneVector< T > &storage, std::initializer_list< RegisterRepresentation > values)
base::SmallVector< Block *, 4 > SuccessorBlocks(const Block &block, const Graph &graph)
bool IsUnlikelySuccessor(const Block *block, const Block *successor, const Graph &graph)
Op * CreateOperation(base::SmallVector< OperationStorageSlot, 32 > &storage, Args... args)
@ kUnsignedLessThanOrEqual
@ kReceiverOrNullOrUndefined
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
constexpr int kSimd128Size
Tagged(T object) -> Tagged< T >
constexpr int kIndirectPointerTagShift
bool IsZero(Tagged< Object > obj)
std::ostream & operator<<(std::ostream &os, AtomicMemoryOrder order)
constexpr int kSimd256Size
constexpr bool SmiValuesAre31Bits()
@ kExternalUint8ClampedArray
@ kExternalBigUint64Array
constexpr VFPRoundingMode kRoundToZero
constexpr bool IsIntegral(MachineRepresentation rep)
bool is_signed(Condition cond)
!IsContextMap !IsContextMap native_context
std::ostream & operator<<(std::ostream &os, const Operation &operation)
#define NON_TERMINATOR_CASE(op)
#define TURBOSHAFT_THROWING_OPERATIONS_LIST(V)
#define TURBOSHAFT_OPERATION_LIST_BLOCK_TERMINATOR(V)
#define COUNT_OPCODES(Name)
#define THROWING_OP_LOOKS_VALID(Name)
#define GENERIC_BINOP_LIST(V)
#define SUPPORTED_OPERATIONS_LIST(V)
#define OPERATION_OPCODE_MAP_CASE(Name)
#define DEFINE_KIND(Name)
#define OPERATION_SIZE(Name)
#define TURBOSHAFT_OPERATION_LIST(V)
#define TURBOSHAFT_OPERATION_LIST_NOT_BLOCK_TERMINATOR(V)
#define THROWING_OP_BOILERPLATE(...)
#define GENERIC_UNOP_LIST(V)
#define OPERATION_EFFECTS_CASE(Name)
#define I(name, number_of_args, result_size)
#define NON_EXPORTED_BASE(code)
#define DCHECK_LE(v1, v2)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
#define V8_EXPORT_PRIVATE
constexpr bool IsEmpty() const
const CFunctionInfo * signature
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< String > message() const
AbortCSADcheckOp(V< String > message)
AllocateOp(V< WordPtr > size, AllocationType type)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< WordPtr > size() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
ArgumentsLengthOp(Kind kind, int formal_parameter_count)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const RegisterRepresentation > outputs_rep() const
AssumeMapOp(V< HeapObject > heap_object, ZoneRefSet< Map > maps)
V< HeapObject > heap_object() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< WordPtr > index() const
OptionalOpIndex expected() const
AtomicRMWOp(OpIndex base, OpIndex index, OpIndex value, OptionalOpIndex expected, BinOp bin_op, RegisterRepresentation in_out_rep, MemoryRepresentation memory_rep, MemoryAccessKind kind)
V< WordPtr > base() const
void Validate(const Graph &graph) const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
OpEffects Effects() const
MemoryAccessKind memory_access_kind
base::Vector< const RegisterRepresentation > outputs_rep() const
MemoryRepresentation memory_rep
RegisterRepresentation in_out_rep
static AtomicRMWOp & New(Graph *graph, OpIndex base, OpIndex index, OpIndex value, OptionalOpIndex expected, BinOp bin_op, RegisterRepresentation result_rep, MemoryRepresentation input_rep, MemoryAccessKind kind)
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
V< WordPtr > base() const
OptionalV< Word32 > value_high() const
static AtomicWord32PairOp & New(Graph *graph, V< WordPtr > base, OptionalV< WordPtr > index, OptionalV< Word32 > value_low, OptionalV< Word32 > value_high, OptionalV< Word32 > expected_low, OptionalV< Word32 > expected_high, Kind kind, int32_t offset)
OptionalV< Word32 > value_low() const
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
OpEffects Effects() const
OptionalV< WordPtr > index() const
base::Vector< const RegisterRepresentation > outputs_rep() const
static constexpr size_t InputCount(Kind kind, bool has_index)
OptionalV< Word32 > expected_low() const
OptionalV< Word32 > expected_high() const
static Kind KindFromBinOp(AtomicRMWOp::BinOp bin_op)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
AtomicWord32PairOp(V< WordPtr > base, OptionalV< WordPtr > index, OptionalV< Word32 > value_low, OptionalV< Word32 > value_high, OptionalV< Word32 > expected_low, OptionalV< Word32 > expected_high, Kind kind, int32_t offset)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
void Validate(const Graph &graph) const
BigIntBinopOp(V< BigInt > left, V< BigInt > right, V< FrameState > frame_state, Kind kind)
V< BigInt > right() const
V< FrameState > frame_state() const
base::Vector< const RegisterRepresentation > outputs_rep() const
static bool IsCommutative(Kind kind)
BigIntComparisonOp(V< BigInt > left, V< BigInt > right, Kind kind)
V< BigInt > right() const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
BigIntUnaryOp(V< BigInt > input, Kind kind)
V< BigInt > input() const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< Word32 > low_word32() const
V< Word32 > high_word32() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
BitcastWord32PairToFloat64Op(V< Word32 > high_word32, V< Word32 > low_word32)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
BranchOp(V< Word32 > condition, Block *if_true, Block *if_false, BranchHint hint)
base::Vector< const RegisterRepresentation > outputs_rep() const
V< Word32 > condition() const
const TSCallDescriptor * descriptor
void Validate(const Graph &graph) const
base::Vector< const OpIndex > arguments() const
static CallOp & New(Graph *graph, V< CallTarget > callee, OptionalV< FrameState > frame_state, base::Vector< const OpIndex > arguments, const TSCallDescriptor *descriptor, OpEffects effects)
V< CallTarget > callee() const
CallOp(V< CallTarget > callee, OptionalV< FrameState > frame_state, base::Vector< const OpIndex > arguments, const TSCallDescriptor *descriptor, OpEffects effects)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const RegisterRepresentation > results_rep() const
bool HasFrameState() const
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
OptionalV< FrameState > frame_state() const
OpEffects Effects() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
ChangeOp(V< Untagged > input, Kind kind, Assumption assumption, RegisterRepresentation from, RegisterRepresentation to)
RegisterRepresentation to
void Validate(const Graph &graph) const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
static bool IsReversible(Kind kind, Assumption assumption, RegisterRepresentation from, RegisterRepresentation to, Kind reverse_kind, bool signalling_nan_possible)
bool IsReversibleBy(Kind reverse_kind, bool signalling_nan_possible) const
RegisterRepresentation from
base::Vector< const RegisterRepresentation > outputs_rep() const
void Validate(const Graph &graph) const
V< Untagged > input() const
ChangeOrDeoptOp(V< Untagged > input, V< FrameState > frame_state, Kind kind, CheckForMinusZeroMode minus_zero_mode, const FeedbackSource &feedback)
V< FrameState > frame_state() const
base::Vector< const RegisterRepresentation > outputs_rep() const
CheckForMinusZeroMode minus_zero_mode
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< Object > expected() const
V< Object > value() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
CheckEqualsInternalizedStringOp(V< Object > expected, V< Object > value, V< FrameState > frame_state)
V< FrameState > frame_state() const
void Validate(const Graph &graph) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const RegisterRepresentation > outputs_rep() const
Block * didnt_throw_block
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< Any > throwing_operation() const
CheckExceptionOp(V< Any > throwing_operation, Block *successor, Block *catch_block)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
V< HeapObject > heap_object() const
OptionalV< Map > map() const
static CheckMapsOp & New(Graph *graph, V< HeapObject > heap_object, V< FrameState > frame_state, OptionalV< Map > map, ZoneRefSet< Map > maps, CheckMapsFlags flags, const FeedbackSource &feedback)
CheckMapsOp(V< HeapObject > heap_object, V< FrameState > frame_state, OptionalV< Map > map, ZoneRefSet< Map > maps, CheckMapsFlags flags, const FeedbackSource &feedback)
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
void Validate(const Graph &graph) const
V< FrameState > frame_state() const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
RegisterRepresentation rep
CheckTurboshaftTypeOfOp(OpIndex input, RegisterRepresentation rep, Type type, bool successful)
CheckedClosureOp(V< Object > input, V< FrameState > frame_state, Handle< FeedbackCell > feedback_cell)
bool operator==(const CheckedClosureOp &other) const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< Object > input() const
Handle< FeedbackCell > feedback_cell
base::Vector< const RegisterRepresentation > outputs_rep() const
V< FrameState > frame_state() const
size_t hash_value(HashingStrategy strategy=HashingStrategy::kDefault) const
void Validate(const Graph &graph) const
base::Vector< const RegisterRepresentation > outputs_rep() const
OptionalV< Map > map() const
CompareMapsOp(V< HeapObject > heap_object, OptionalV< Map > map, ZoneRefSet< Map > maps)
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
static CompareMapsOp & New(Graph *graph, V< HeapObject > heap_object, OptionalV< Map > map, ZoneRefSet< Map > maps)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< HeapObject > heap_object() const
RegisterRepresentation rep
void Validate(const Graph &graph) const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
ComparisonOp(V< Any > left, V< Any > right, Kind kind, RegisterRepresentation rep)
base::Vector< const RegisterRepresentation > outputs_rep() const
static bool IsCommutative(Kind kind)
base::Vector< const RegisterRepresentation > outputs_rep() const
i::Float64 number() const
i::Float64 float64() const
i::Float32 float32() const
int32_t tagged_index() const
ConstantOp(Kind kind, Storage storage)
size_t hash_value(HashingStrategy strategy=HashingStrategy::kDefault) const
bool IsWord(uint64_t value) const
IndirectHandle< i::HeapObject > handle() const
void Validate(const Graph &graph) const
i::Tagged< Smi > smi() const
bool operator==(const ConstantOp &other) const
static RegisterRepresentation Representation(Kind kind)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &) const
ExternalReference external_reference() const
int64_t signed_integral() const
uint64_t integral() const
V< JSPrimitive > value() const
V< JSGlobalProxy > global_proxy() const
V< Context > native_context() const
ConvertJSPrimitiveToObjectOp(V< JSPrimitive > value, V< Context > native_context, V< JSGlobalProxy > global_proxy, ConvertReceiverMode mode)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
V< JSPrimitive > input() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
ConvertJSPrimitiveToUntaggedOp(V< JSPrimitive > input, UntaggedKind kind, InputAssumptions input_assumptions)
InputAssumptions input_assumptions
JSPrimitiveKind from_kind
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
void Validate(const Graph &graph) const
ConvertJSPrimitiveToUntaggedOrDeoptOp(V< Object > input, V< FrameState > frame_state, JSPrimitiveKind from_kind, UntaggedKind to_kind, CheckForMinusZeroMode minus_zero_mode, const FeedbackSource &feedback)
CheckForMinusZeroMode minus_zero_mode
V< Object > input() const
V< FrameState > frame_state() const
ConvertOp(V< Object > input, Kind from, Kind to)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< Object > input() const
InputInterpretation input_interpretation
ConvertUntaggedToJSPrimitiveOp(V< Untagged > input, JSPrimitiveKind kind, RegisterRepresentation input_rep, InputInterpretation input_interpretation, CheckForMinusZeroMode minus_zero_mode)
CheckForMinusZeroMode minus_zero_mode
void Validate(const Graph &graph) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
RegisterRepresentation input_rep
V< Untagged > input() const
V< Untagged > input() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
RegisterRepresentation input_rep
ConvertUntaggedToJSPrimitiveOrDeoptOp(V< Untagged > input, V< FrameState > frame_state, JSPrimitiveKind kind, RegisterRepresentation input_rep, InputInterpretation input_interpretation, const FeedbackSource &feedback)
base::Vector< const RegisterRepresentation > outputs_rep() const
V< FrameState > frame_state() const
InputInterpretation input_interpretation
void Validate(const Graph &graph) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
RegisterRepresentation rep
DebugPrintOp(OpIndex input, RegisterRepresentation rep)
DecodeExternalPointerOp(OpIndex handle, ExternalPointerTagRange tag_range)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
ExternalPointerTagRange tag_range
void Validate(const Graph &graph) const
base::Vector< const RegisterRepresentation > outputs_rep() const
V< FrameState > frame_state() const
base::Vector< const RegisterRepresentation > outputs_rep() const
V< Word32 > condition() const
const DeoptimizeParameters * parameters
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
size_t hash_value(HashingStrategy strategy=HashingStrategy::kDefault) const
void Validate(const Graph &graph) const
bool EqualsForGVN(const DeoptimizeIfOp &other) const
DeoptimizeIfOp(V< Word32 > condition, V< FrameState > frame_state, bool negated, const DeoptimizeParameters *parameters)
void Validate(const Graph &graph) const
base::Vector< const RegisterRepresentation > outputs_rep() const
V< FrameState > frame_state() const
const DeoptimizeParameters * parameters
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
DeoptimizeOp(V< FrameState > frame_state, const DeoptimizeParameters *parameters)
const base::Vector< const RegisterRepresentation > * results_rep
OpEffects throwing_op_effects
OpEffects Effects() const
OpIndex throwing_operation() const
DidntThrowOp(OpIndex throwing_operation, bool has_catch_block, const base::Vector< const RegisterRepresentation > *results_rep, OpEffects throwing_op_effects)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
DoubleArrayMinMaxOp(V< JSArray > array, Kind kind)
V< JSArray > array() const
bool after_raw_heap_access
constexpr EffectDimensions()
static EffectDimensions FromBits(Bits bits)
bool before_raw_heap_access
bool load_off_heap_memory
bool operator!=(EffectDimensions other) const
bool operator==(EffectDimensions other) const
bool store_off_heap_memory
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
EnsureWritableFastElementsOp(OpIndex object, OpIndex elements)
MaybeRegisterRepresentation argument_representation(unsigned argument_index) const
V< Context > context() const
const FastApiCallParameters * parameters
V< Object > data_argument() const
V< FrameState > frame_state() const
static FastApiCallOp & New(Graph *graph, V< FrameState > frame_state, V< Object > data_argument, V< Context > context, base::Vector< const OpIndex > arguments, const FastApiCallParameters *parameters, base::Vector< const RegisterRepresentation > out_reps)
base::Vector< const RegisterRepresentation > out_reps
base::Vector< const OpIndex > arguments() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
base::Vector< const RegisterRepresentation > outputs_rep() const
LazyDeoptOnThrow lazy_deopt_on_throw
FastApiCallOp(V< FrameState > frame_state, V< Object > data_argument, V< Context > context, base::Vector< const OpIndex > arguments, const FastApiCallParameters *parameters, base::Vector< const RegisterRepresentation > out_reps)
const CFunctionInfo * c_signature() const
FastApiCallParameters(FastApiCallFunction c_function)
FastApiCallFunction c_function
static const FastApiCallParameters * Create(FastApiCallFunction c_function, Zone *graph_zone)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
OpIndex data_structure() const
base::Vector< const RegisterRepresentation > outputs_rep() const
FindOrderedHashEntryOp(OpIndex data_structure, V< Word32 > key, Kind kind)
V8_INLINE auto ExplodeImpl(Fn fn, Mapper &mapper, std::index_sequence< InputI... >, std::index_sequence< OptionI... >) const
static Derived & New(Graph *graph, Args... args)
FixedArityOperationT(Args... args)
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< Float64 > input() const
Float64IsOp(V< Float64 > input, NumericKind kind)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
Float64SameValueOp(V< Float64 > left, V< Float64 > right)
base::Vector< const RegisterRepresentation > outputs_rep() const
V< Float64 > left() const
V< Float64 > right() const
base::Vector< const RegisterRepresentation > outputs_rep() const
static bool IsCommutative(Kind kind)
void Validate(const Graph &graph) const
FloatBinopOp(V< Float > left, V< Float > right, Kind kind, FloatRepresentation rep)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
FloatUnaryOp(V< Float > input, Kind kind, FloatRepresentation rep)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
FrameConstantOp(Kind kind)
base::Vector< const RegisterRepresentation > outputs_rep() const
OpIndex parent_frame_state() const
const OpIndex state_value(size_t idx) const
uint16_t state_values_count() const
FrameStateOp(base::Vector< const OpIndex > inputs, bool inlined, const FrameStateData *data)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
const FrameStateData * data
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
base::Vector< const OpIndex > state_values() const
RegisterRepresentation state_value_rep(size_t idx) const
size_t hash_value(HashingStrategy strategy=HashingStrategy::kDefault) const
V< FrameState > frame_state() const
V< Context > context() const
V< Object > right() const
GenericBinopOp(V< Object > left, V< Object > right, V< FrameState > frame_state, V< Context > context, Kind kind, LazyDeoptOnThrow lazy_deopt_on_throw)
V< FrameState > frame_state() const
GenericUnopOp(V< Object > input, V< FrameState > frame_state, V< Context > context, Kind kind, LazyDeoptOnThrow lazy_deopt_on_throw)
V< Object > input() const
V< Context > context() const
base::Vector< const RegisterRepresentation > outputs_rep() const
GotoOp(Block *destination, bool is_backedge)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
JSStackCheckOp(V< Context > context, OptionalV< FrameState > frame_state, Kind kind)
void Validate(const Graph &graph) const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
static JSStackCheckOp & New(Graph *graph, V< Context > context, OptionalV< FrameState > frame_state, Kind kind)
OptionalV< FrameState > frame_state() const
OpEffects Effects() const
V< Context > native_context() const
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
base::Vector< const RegisterRepresentation > outputs_rep() const
ExternalArrayType element_type
base::Vector< const RegisterRepresentation > outputs_rep() const
LoadDataViewElementOp(OpIndex object, OpIndex storage, OpIndex index, OpIndex is_little_endian, ExternalArrayType element_type)
OpIndex is_little_endian() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
LoadFieldByIndexOp(OpIndex object, OpIndex index)
LoadMessageOp(V< WordPtr > offset)
V< WordPtr > offset() const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
static constexpr Kind TaggedBase()
constexpr Kind NotLoadEliminable()
static constexpr Kind RawAligned()
static constexpr Kind Protected()
bool operator==(const Kind &other) const
constexpr Kind Immutable() const
static constexpr Kind Aligned(BaseTaggedness base_is_tagged)
static constexpr Kind TrapOnNull()
constexpr Kind Atomic() const
static constexpr Kind MaybeUnaligned(MemoryRepresentation rep)
static constexpr Kind RawUnaligned()
base::Vector< const RegisterRepresentation > outputs_rep() const
MemoryRepresentation loaded_rep
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
RegisterRepresentation result_rep
OptionalOpIndex index() const
static constexpr bool OffsetIsValid(int32_t offset, bool tagged_base)
void Validate(const Graph &graph) const
static LoadOp & New(Graph *graph, OpIndex base, OptionalOpIndex index, Kind kind, MemoryRepresentation loaded_rep, RegisterRepresentation result_rep, int32_t offset, uint8_t element_size_log2)
LoadOp(OpIndex base, OptionalOpIndex index, Kind kind, MemoryRepresentation loaded_rep, RegisterRepresentation result_rep, int32_t offset, uint8_t element_size_log2)
OpEffects Effects() const
uint8_t element_size_log2
std::tuple options() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
LoadStackArgumentOp(OpIndex base, OpIndex index)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
LoadTypedElementOp(OpIndex buffer, OpIndex base, OpIndex external, OpIndex index, ExternalArrayType array_type)
ExternalArrayType array_type
V< Word32 > index() const
V< Object > elements() const
V< FrameState > frame_state() const
base::Vector< const RegisterRepresentation > outputs_rep() const
MaybeGrowFastElementsOp(V< Object > object, V< Object > elements, V< Word32 > index, V< Word32 > elements_length, V< FrameState > frame_state, GrowFastElementsMode mode, const FeedbackSource &feedback)
V< Word32 > elements_length() const
GrowFastElementsMode mode
void Validate(const Graph &graph) const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< Object > object() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
MemoryBarrierOp(AtomicMemoryOrder memory_order)
base::Vector< const RegisterRepresentation > outputs_rep() const
AtomicMemoryOrder memory_order
OpIndex arguments_count() const
int formal_parameter_count
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
NewArgumentsElementsOp(OpIndex arguments_count, CreateArgumentsType type, int formal_parameter_count)
AllocationType allocation_type
NewArrayOp(OpIndex length, Kind kind, AllocationType allocation_type)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const RegisterRepresentation > outputs_rep() const
NewConsStringOp(V< Word32 > length, V< String > first, V< String > second)
V< String > second() const
V< String > first() const
V< Word32 > length() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
ObjectIsNumericValueOp(V< Object > input, NumericKind kind, FloatRepresentation input_rep)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
FloatRepresentation input_rep
base::Vector< const RegisterRepresentation > outputs_rep() const
V< Object > input() const
V< Object > input() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
ObjectIsOp(V< Object > input, Kind kind, InputAssumptions input_assumptions)
InputAssumptions input_assumptions
base::Vector< const RegisterRepresentation > outputs_rep() const
constexpr OpEffects CanWriteOffHeapMemory() const
bool operator==(OpEffects other) const
constexpr OpEffects CanLeaveCurrentFunction() const
constexpr bool is_required_when_unused() const
static OpEffects FromBits(Bits bits)
OpEffects operator|(OpEffects other) const
constexpr OpEffects CanReadOffHeapMemory() const
bool required_when_unused
constexpr OpEffects CanDependOnChecks() const
bool can_read_mutable_memory() const
bool hoistable_before_a_branch() const
constexpr OpEffects CanDoRawHeapAccess() const
constexpr OpEffects CanWriteHeapMemory() const
constexpr OpEffects CanCallAnything() const
constexpr OpEffects CanCreateIdentity() const
constexpr OpEffects CanReadHeapMemory() const
constexpr OpEffects AssumesConsistentHeap() const
constexpr OpEffects CanReadImmutableMemory() const
bool can_be_constant_folded() const
constexpr OpEffects RequiredWhenUnused() const
constexpr OpEffects CanChangeControlFlow() const
constexpr OpEffects CanDeopt() const
OpEffects operator&(OpEffects other) const
constexpr OpEffects CanAllocateWithoutIdentity() const
constexpr OpEffects CanAllocate() const
constexpr OpEffects CanWriteMemory() const
bool repetition_is_eliminatable() const
bool requires_consistent_heap() const
bool IsSubsetOf(OpEffects other) const
EffectDimensions consumes
EffectDimensions produces
constexpr OpEffects CanReadMemory() const
bool operator!=(OpEffects other) const
static constexpr uint64_t mask
void PrintOptions(std::ostream &os) const
const Derived & derived_this() const
static constexpr OpEffects Effects()
static Derived & New(Graph *graph, ShadowyOpIndexVectorWrapper inputs, Args... args)
static Derived & New(Graph *graph, size_t input_count, Args... args)
size_t StorageSlotCount() const
base::Vector< OpIndex > inputs()
bool EqualsForGVN(const Base &other) const
void Validate(const Graph &graph) const
V8_INLINE OpIndex & input(size_t i)
base::Vector< const RegisterRepresentation > outputs_rep() const
OperationT(ShadowyOpIndexVectorWrapper inputs)
bool operator==(const Base &other) const
void PrintInputs(std::ostream &os, const std::string &op_index_prefix) const
base::Vector< const OpIndex > inputs() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
static constexpr bool IsBlockTerminator()
bool IsRequiredWhenUnused() const
size_t hash_value(HashingStrategy strategy=HashingStrategy::kDefault) const
OperationT(size_t input_count)
size_t HashWithOptions(const Args &... args) const
V8_INLINE V< Any > input(size_t i) const
static const Opcode opcode
static constexpr std::optional< OpEffects > EffectsIfStatic()
static size_t StorageSlotCount(size_t input_count)
static void PrintOptionsHelper(std::ostream &os, const std::tuple< T... > &options, std::index_sequence< I... >)
V8_INLINE V< T > input(size_t i) const
OpIndex Map(OpIndex index)
OptionalOpIndex Map(OptionalOpIndex index)
base::SmallVector< OpIndex, N > Map(base::Vector< const OpIndex > indices)
const underlying_operation_t< Op > & Cast() const
V8_INLINE OpIndex input(size_t i) const
underlying_operation_t< Op > * TryCast()
Operation(const Operation &)=delete
bool IsBlockTerminator() const
Operation & operator=(const Operation &)=delete
bool IsProtectedLoad() const
bool IsRequiredWhenUnused() const
const uint16_t input_count
V8_CLANG_NO_SANITIZE("memory") bool IsOpmask() const
SaturatedUint8 saturated_use_count
Operation(Opcode opcode, size_t input_count)
const underlying_operation_t< Op > * TryCast() const
underlying_operation_t< Op > & Cast()
base::Vector< const RegisterRepresentation > outputs_rep() const
size_t StorageSlotCount() const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
OsrValueOp(int32_t index)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
OverflowCheckedBinopOp(V< Word > left, V< Word > right, Kind kind, WordRepresentation rep)
static bool IsCommutative(Kind kind)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
OverflowCheckedUnaryOp(V< Word > input, Kind kind, WordRepresentation rep)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const RegisterRepresentation > outputs_rep() const
RegisterRepresentation rep
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
ParameterOp(int32_t parameter_index, RegisterRepresentation rep, const char *debug_name="")
RegisterRepresentation rep
base::Vector< const RegisterRepresentation > outputs_rep() const
PendingLoopPhiOp(OpIndex first, RegisterRepresentation rep)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
PhiOp(base::Vector< const OpIndex > inputs, RegisterRepresentation rep)
void Validate(const Graph &graph) const
RegisterRepresentation rep
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
base::Vector< const RegisterRepresentation > outputs_rep() const
RegisterRepresentation rep
ProjectionOp(V< Any > input, uint16_t index, RegisterRepresentation rep)
void Validate(const Graph &graph) const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< Object > retained() const
RetainOp(V< Object > retained)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const OpIndex > return_values() const
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
ReturnOp(V< Word32 > pop_count, base::Vector< const OpIndex > return_values, bool spill_caller_frame_slots)
static ReturnOp & New(Graph *graph, V< Word32 > pop_count, base::Vector< const OpIndex > return_values, bool spill_caller_frame_slots)
base::Vector< const RegisterRepresentation > outputs_rep() const
V< Word32 > pop_count() const
bool spill_caller_frame_slots
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
RuntimeAbortOp(AbortReason reason)
base::Vector< const RegisterRepresentation > outputs_rep() const
V< Object > right() const
SameValueOp(V< Object > left, V< Object > right, Mode mode)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
void Validate(const Graph &graph) const
RegisterRepresentation rep
base::Vector< const RegisterRepresentation > outputs_rep() const
SelectOp(V< Word32 > cond, V< Any > vtrue, V< Any > vfalse, RegisterRepresentation rep, BranchHint hint, Implementation implem)
ShiftOp(V< Word > left, V< Word32 > right, Kind kind, WordRepresentation rep)
base::Vector< const RegisterRepresentation > outputs_rep() const
bool IsRightShift() const
static bool IsRightShift(Kind kind)
V< Word32 > right() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
static bool AllowsWord64ToWord32Truncation(Kind kind)
StackPointerGreaterThanOp(V< WordPtr > stack_limit, StackCheckKind kind)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< WordPtr > stack_limit() const
base::Vector< const RegisterRepresentation > outputs_rep() const
StackSlotOp(int size, int alignment, bool is_tagged=false)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
StaticAssertOp(V< Word32 > condition, const char *source)
V< Word32 > condition() const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
StoreDataViewElementOp(OpIndex object, OpIndex storage, OpIndex index, OpIndex value, OpIndex is_little_endian, ExternalArrayType element_type)
OpIndex is_little_endian() const
ExternalArrayType element_type
base::Vector< const RegisterRepresentation > outputs_rep() const
StoreMessageOp(V< WordPtr > offset, V< Object > object)
V< Object > object() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< WordPtr > offset() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
base::Vector< const RegisterRepresentation > outputs_rep() const
OptionalOpIndex index() const
MemoryRepresentation stored_rep
IndirectPointerTag indirect_pointer_tag() const
WriteBarrierKind write_barrier
static StoreOp & New(Graph *graph, OpIndex base, OptionalOpIndex index, OpIndex value, Kind kind, MemoryRepresentation stored_rep, WriteBarrierKind write_barrier, int32_t offset, uint8_t element_size_log2, bool maybe_initializing_or_transitioning, IndirectPointerTag maybe_indirect_pointer_tag=kIndirectPointerNullTag)
StoreOp(OpIndex base, OptionalOpIndex index, OpIndex value, Kind kind, MemoryRepresentation stored_rep, WriteBarrierKind write_barrier, int32_t offset, uint8_t element_size_log2, bool maybe_initializing_or_transitioning, IndirectPointerTag maybe_indirect_pointer_tag=kIndirectPointerNullTag)
bool maybe_initializing_or_transitioning
OpEffects Effects() const
void Validate(const Graph &graph) const
uint8_t element_size_log2
uint16_t shifted_indirect_pointer_tag
ExternalArrayType array_type
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
StoreTypedElementOp(OpIndex buffer, OpIndex base, OpIndex external, OpIndex index, OpIndex value, ExternalArrayType array_type)
StringAtOp(V< String > string, V< WordPtr > position, Kind kind)
V< String > string() const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< WordPtr > position() const
static bool IsCommutative(Kind kind)
V< String > right() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
StringComparisonOp(V< String > left, V< String > right, Kind kind)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< String > right() const
base::Vector< const RegisterRepresentation > outputs_rep() const
StringConcatOp(V< Smi > length, V< String > left, V< String > right)
V< String > string() const
StringFromCodePointAtOp(V< String > string, V< WordPtr > index)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< WordPtr > index() const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< Smi > position() const
base::Vector< const RegisterRepresentation > outputs_rep() const
V< String > string() const
StringIndexOfOp(V< String > string, V< String > search, V< Smi > position)
V< String > search() const
V< String > string() const
StringLengthOp(V< String > string)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
StringSubstringOp(V< String > string, V< Word32 > start, V< Word32 > end)
V< Word32 > start() const
V< String > string() const
Case(int32_t value, Block *destination, BranchHint hint)
bool operator==(const Case &other) const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< Word32 > input() const
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< Case > cases
SwitchOp(V< Word32 > input, base::Vector< Case > cases, Block *default_case, BranchHint default_hint)
const CallDescriptor * descriptor
static const TSCallDescriptor * Create(const CallDescriptor *descriptor, CanThrow can_throw, LazyDeoptOnThrow lazy_deopt_on_throw, Zone *graph_zone, const JSWasmCallParameters *js_wasm_call_parameters=nullptr)
base::Vector< const RegisterRepresentation > in_reps
TSCallDescriptor(const CallDescriptor *descriptor, base::Vector< const RegisterRepresentation > in_reps, base::Vector< const RegisterRepresentation > out_reps, CanThrow can_throw, LazyDeoptOnThrow lazy_deopt_on_throw, const JSWasmCallParameters *js_wasm_call_parameters)
LazyDeoptOnThrow lazy_deopt_on_throw
base::Vector< const RegisterRepresentation > out_reps
const JSWasmCallParameters * js_wasm_call_parameters
RegisterRepresentation to
OpEffects Effects() const
void Validate(const Graph &graph) const
TaggedBitcastOp(OpIndex input, RegisterRepresentation from, RegisterRepresentation to, Kind kind)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
RegisterRepresentation from
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const OpIndex > arguments() const
base::Vector< const RegisterRepresentation > outputs_rep() const
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
static TailCallOp & New(Graph *graph, OpIndex callee, base::Vector< const OpIndex > arguments, const TSCallDescriptor *descriptor)
TailCallOp(OpIndex callee, base::Vector< const OpIndex > arguments, const TSCallDescriptor *descriptor)
const TSCallDescriptor * descriptor
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< Context > context() const
ToNumberOrNumericOp(V< Object > input, V< FrameState > frame_state, V< Context > context, Object::Conversion kind, LazyDeoptOnThrow lazy_deopt_on_throw)
V< FrameState > frame_state() const
V< Object > input() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
V< WordPtr > index() const
RegisterRepresentation value_representation() const
size_t hash_value(HashingStrategy strategy=HashingStrategy::kDefault) const
MaybeIndirectHandle< Map > fast_map
TransitionAndStoreArrayElementOp(V< JSArray > array, V< WordPtr > index, V< Any > value, Kind kind, MaybeIndirectHandle< Map > fast_map, MaybeIndirectHandle< Map > double_map)
bool operator==(const TransitionAndStoreArrayElementOp &other) const
V< JSArray > array() const
MaybeIndirectHandle< Map > double_map
ElementsTransition transition
base::Vector< const RegisterRepresentation > outputs_rep() const
TransitionElementsKindOp(OpIndex object, const ElementsTransition &transition)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
ElementsTransitionWithMultipleSources transition
V< HeapObject > object() const
base::Vector< const RegisterRepresentation > outputs_rep() const
TransitionElementsKindOrCheckMapOp(V< HeapObject > object, V< Map > map, V< FrameState > frame_state, const ElementsTransitionWithMultipleSources &transition)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
TruncateJSPrimitiveToUntaggedOp(V< JSPrimitive > input, UntaggedKind kind, InputAssumptions input_assumptions)
V< JSPrimitive > input() const
base::Vector< const RegisterRepresentation > outputs_rep() const
InputAssumptions input_assumptions
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
TruncateJSPrimitiveToUntaggedOrDeoptOp(V< JSPrimitive > input, V< FrameState > frame_state, UntaggedKind kind, InputRequirement input_requirement, const FeedbackSource &feedback)
V< JSPrimitive > input() const
V< FrameState > frame_state() const
void Validate(const Graph &graph) const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
InputRequirement input_requirement
base::Vector< const RegisterRepresentation > outputs_rep() const
TryChangeOp(OpIndex input, Kind kind, FloatRepresentation from, WordRepresentation to)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V8_INLINE auto Explode(Fn fn, Mapper &mapper) const
base::Vector< const RegisterRepresentation > outputs_rep() const
TupleOp(base::Vector< const V< Any > > inputs)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
V< JSTypedArray > typed_array() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
ElementsKind elements_kind
TypedArrayLengthOp(V< JSTypedArray > typed_array, ElementsKind elements_kind)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
IntrusiveSetIndex active_loop_variables_index
MaybeRegisterRepresentation rep
Word32PairBinopOp(V< Word32 > left_low, V< Word32 > left_high, V< Word32 > right_low, V< Word32 > right_high, Kind kind)
base::Vector< const RegisterRepresentation > outputs_rep() const
V< Word32 > left_high() const
V< Word32 > left_low() const
V< Word32 > right_high() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(const ZoneVector< MaybeRegisterRepresentation > &storage) const
V< Word32 > right_low() const
base::Vector< const RegisterRepresentation > outputs_rep() const
Word32SignHintOp(V< Word32 > input, Sign sign)
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
V< Word32 > input() const
CheckForMinusZeroMode mode
void Validate(const Graph &graph) const
WordBinopDeoptOnOverflowOp(V< Word > left, V< Word > right, V< FrameState > frame_state, Kind kind, WordRepresentation rep, FeedbackSource feedback, CheckForMinusZeroMode mode)
base::Vector< const RegisterRepresentation > outputs_rep() const
V< FrameState > frame_state() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
bool IsCommutative() const
V< WordType > left() const
V< WordType > right() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
base::Vector< const RegisterRepresentation > outputs_rep() const
static bool AllowsWord64ToWord32Truncation(Kind kind)
static bool IsAssociative(Kind kind)
static bool IsCommutative(Kind kind)
WordBinopOp(V< Word > left, V< Word > right, Kind kind, WordRepresentation rep)
base::Vector< const RegisterRepresentation > outputs_rep() const
base::Vector< const MaybeRegisterRepresentation > inputs_rep(ZoneVector< MaybeRegisterRepresentation > &storage) const
WordUnaryOp(V< Word > input, Kind kind, WordRepresentation rep)
size_t operator()(SwitchOp::Case v)
size_t operator()(const TSCallDescriptor &v)
Storage(uint64_t integral=0)
bool operator==(const ConstantOp::Storage &) const
Storage(i::Float32 constant)
ExternalReference external
IndirectHandle< HeapObject > handle
Storage(IndirectHandle< HeapObject > constant)
Storage(i::Tagged< Smi > smi)
Storage(ExternalReference constant)
Storage(i::Float64 constant)
#define END_ALLOW_USE_DEPRECATED()
#define V8_LIKELY(condition)
#define START_ALLOW_USE_DEPRECATED()
std::unique_ptr< ValueMirror > value
std::unique_ptr< ValueMirror > key