5#ifndef V8_COMPILER_TURBOSHAFT_MACHINE_LOWERING_REDUCER_INL_H_
6#define V8_COMPILER_TURBOSHAFT_MACHINE_LOWERING_REDUCER_INL_H_
48template <
typename Next>
55 switch (input_assumptions) {
78 frame_state, DeoptimizeReason::kLostPrecision,
84 V<Word32> i32 =
__ TruncateWord64ToWord32(i64_input);
86 __ Word64Equal(
__ ChangeInt32ToInt64(i32), i64_input), frame_state,
87 DeoptimizeReason::kLostPrecision, feedback);
93 __ Uint64LessThanOrEqual(i64_input,
static_cast<uint64_t
>(
kMaxInt)),
94 frame_state, DeoptimizeReason::kLostPrecision, feedback);
95 return __ TruncateWord64ToWord32(i64_input);
100 std::numeric_limits<int64_t>::max()),
101 frame_state, DeoptimizeReason::kLostPrecision, feedback);
106 V<Word32> i32 =
__ TruncateFloat64ToInt32OverflowUndefined(f64_input);
108 __ Float64Equal(
__ ChangeInt32ToFloat64(i32), f64_input),
109 frame_state, DeoptimizeReason::kLostPrecisionOrNaN, feedback);
117 __ Int32LessThan(
__ Float64ExtractHighWord32(f64_input), 0);
119 DeoptimizeReason::kMinusZero, feedback);
127 V<Word32> ui32 =
__ TruncateFloat64ToUint32OverflowUndefined(f64_input);
129 __ Float64Equal(
__ ChangeUint32ToFloat64(ui32), f64_input),
130 frame_state, DeoptimizeReason::kLostPrecisionOrNaN, feedback);
138 __ Int32LessThan(
__ Float64ExtractHighWord32(f64_input), 0);
140 DeoptimizeReason::kMinusZero, feedback);
148 V<Word64> i64 =
__ TruncateFloat64ToInt64OverflowToMin(f64_input);
150 __ Float64Equal(
__ ChangeInt64ToFloat64(i64), f64_input),
151 frame_state, DeoptimizeReason::kLostPrecisionOrNaN, feedback);
159 __ Int32LessThan(
__ Float64ExtractHighWord32(f64_input), 0);
161 DeoptimizeReason::kMinusZero, feedback);
168 __ Word64Equal(
__ Word64ShiftRightArithmetic(
172 __ DeoptimizeIfNot(check_is_zero, frame_state,
173 DeoptimizeReason::kNotAdditiveSafeInteger, feedback);
179 V<Word64> i64 =
__ TruncateFloat64ToInt64OverflowToMin(f64_input);
181 __ Float64Equal(
__ ChangeInt64ToFloat64(i64), f64_input),
182 frame_state, DeoptimizeReason::kLostPrecisionOrNaN, feedback);
190 __ Int32LessThan(
__ Float64ExtractHighWord32(f64_input), 0);
192 DeoptimizeReason::kMinusZero, feedback);
206 frame_state, DeoptimizeReason::kHole, feedback);
219 return Next::ReduceDeoptimizeIf(
condition, frame_state, negated,
231 __ Deoptimize(frame_state, parameters);
236 __ Deoptimize(frame_state, parameters);
260 V<Map> map =
__ LoadMapField(input);
262 __ TaggedEqual(map,
__ HeapConstant(
factory_->bigint_map()));
271 V<Word32> bitfield =
__ template LoadField<Word32>(
273 GOTO_IF(
__ Word32Equal(bitfield, 0), done, 1);
285 V<Word32> magnitude_check =
__ Uint64LessThanOrEqual(
286 lsd, std::numeric_limits<int64_t>::max());
287 GOTO_IF(magnitude_check, done, 1);
297 __ Word64Equal(lsd, std::numeric_limits<int64_t>::min());
309 input,
__ HeapConstant(
factory_->undefined_value()));
311 __ TaggedEqual(input,
__ HeapConstant(
factory_->null_value()));
312 return __ Word32BitwiseOr(is_undefined, is_null);
328#if V8_STATIC_ROOTS_BOOL
332 static_assert(StaticReadOnlyRoot::kFirstAllocatedRoot ==
333 StaticReadOnlyRoot::kUndefinedValue);
334 static_assert(StaticReadOnlyRoot::kUndefinedValue +
336 StaticReadOnlyRoot::kNullValue);
337 is_null_or_undefined =
__ Uint32LessThanOrEqual(
338 __ TruncateWordPtrToWord32(
340 __ Word32Constant(StaticReadOnlyRoot::kNullValue));
345 V<Map> map =
__ LoadMapField(input);
353 __ Word32Equal(Map::Bits1::IsCallableBit::kMask,
355 bitfield, Map::Bits1::IsCallableBit::kMask));
358 check =
__ Word32Equal(
359 Map::Bits1::IsConstructorBit::kMask,
360 __ Word32BitwiseAnd(bitfield,
361 Map::Bits1::IsConstructorBit::kMask));
364 check =
__ Word32Equal(
365 Map::Bits1::IsCallableBit::kMask,
367 bitfield, (Map::Bits1::IsCallableBit::kMask) |
368 (Map::Bits1::IsUndetectableBit::kMask)));
371 check =
__ Word32Equal(
372 0,
__ Word32BitwiseAnd(bitfield,
373 Map::Bits1::IsCallableBit::kMask));
381#if V8_STATIC_ROOTS_BOOL
384 check =
__ Word32BitwiseOr(is_null_or_undefined, is_non_primitive);
386 static_assert(LAST_PRIMITIVE_HEAP_OBJECT_TYPE == ODDBALL_TYPE);
387 static_assert(
LAST_TYPE == LAST_JS_RECEIVER_TYPE);
390 V<Word32> instance_type =
__ LoadInstanceTypeField(map);
391 GOTO_IF_NOT(
__ Uint32LessThanOrEqual(ODDBALL_TYPE, instance_type),
395 check =
__ Word32Equal(
397 __ TaggedEqual(map,
__ HeapConstant(
factory_->boolean_map())));
402 check =
__ Word32Equal(
403 Map::Bits1::IsUndetectableBit::kMask,
404 __ Word32BitwiseAnd(bitfield,
405 Map::Bits1::IsUndetectableBit::kMask));
418 return __ Word32Constant(0);
430 V<Map> map =
__ LoadMapField(input);
432 __ TaggedEqual(map,
__ HeapConstant(
factory_->heap_number_map())));
445 V<Map> map =
__ LoadMapField(input);
447 __ TaggedEqual(map,
__ HeapConstant(
factory_->heap_number_map())),
466 V<Map> map =
__ LoadMapField(input);
468 __ TaggedEqual(map,
__ HeapConstant(
factory_->heap_number_map())),
471 __ TaggedEqual(map,
__ HeapConstant(
factory_->bigint_map())));
477#if V8_STATIC_ROOTS_BOOL
486 V<Map> map =
__ LoadMapField(input);
488 __ Uint32LessThanOrEqual(
489 __ TruncateWordPtrToWord32(
__ BitcastHeapObjectToWordPtr(map)),
490 __ Word32Constant(InstanceTypeChecker::kStringMapUpperBound)));
503 V<Map> map =
__ LoadMapField(input);
506 __ TruncateWordPtrToWord32(
__ BitcastHeapObjectToWordPtr(map)),
507 __ Word32Constant(StaticReadOnlyRoot::kSymbolMap)));
525 V<Map> map =
__ LoadMapField(input);
526 V<Word32> instance_type =
__ LoadInstanceTypeField(map);
530#if !V8_STATIC_ROOTS_BOOL
532 check =
__ Word32Equal(instance_type, SYMBOL_TYPE);
539 check =
__ Uint32LessThan(
540 __ Word32Sub(instance_type, FIRST_JS_ARRAY_BUFFER_VIEW_TYPE),
541 LAST_JS_ARRAY_BUFFER_VIEW_TYPE -
542 FIRST_JS_ARRAY_BUFFER_VIEW_TYPE + 1);
555 V<Map> map =
__ LoadMapField(input);
556 V<Word32> instance_type =
__ LoadInstanceTypeField(map);
558 return __ Word32Equal(
559 __ Word32BitwiseAnd(instance_type,
572 V<Map> map =
__ LoadMapField(input);
573 V<Word32> instance_type =
__ LoadInstanceTypeField(map);
577 GOTO_IF_NOT(
__ Word32Equal(instance_type, JS_PRIMITIVE_WRAPPER_TYPE),
580 V<Word32> bitfield2 =
__ template LoadField<Word32>(
584 __ Word32BitwiseAnd(bitfield2, Map::Bits2::ElementsKindBits::kMask);
587 << Map::Bits2::ElementsKindBits::kShift,
593 << Map::Bits2::ElementsKindBits::kShift,
612 GOTO(done,
__ Word32Equal(
__ Float64ExtractHighWord32(value),
619 return __ Float64Equal(diff, diff);
624 return __ Float64Equal(diff, 0.0);
633 GOTO(done, in_range);
640 V<Word32> v32 =
__ TruncateFloat64ToInt32OverflowUndefined(value);
641 GOTO_IF_NOT(
__ Float64Equal(value,
__ ChangeInt32ToFloat64(v32)), done,
643 IF (
__ Word32Equal(v32, 0)) {
645 GOTO_IF(
__ Int32LessThan(
__ Float64ExtractHighWord32(value), 0), done,
655 V<Word32> v32 =
__ TruncateFloat64ToInt32OverflowUndefined(value);
656 GOTO_IF_NOT(
__ Float64Equal(value,
__ ChangeInt32ToFloat64(v32)), done,
658 IF (
__ Word32Equal(v32, 0)) {
660 GOTO_IF(
__ Int32LessThan(
__ Float64ExtractHighWord32(value), 0), done,
668 V<Word32> overflow =
__ template Projection<1>(add);
678 V<Word64> value64 =
__ BitcastFloat64ToWord64(value);
682 V<Word32> value_lo =
__ Float64ExtractLowWord32(value);
684 V<Word32> value_hi =
__ Float64ExtractHighWord32(value);
693 return __ Word32Equal(diff, 0);
722 V<Map> map =
__ LoadMapField(input);
724 __ TaggedEqual(map,
__ HeapConstant(
factory_->heap_number_map())), done,
739 return __ CallBuiltin_PlainPrimitiveToNumber(
743 return __ CallBuiltin_StringToNumber(
isolate_,
749 return __ CallBuiltin_ToBoolean(
isolate_, input);
762 GOTO(done,
__ TagSmi(
__ ReversibleFloat64ToInt32(value)));
785 GOTO_IF(
__ Word64Equal(input_w64, int64_t{0}), done,
791 if (input_interpretation ==
796 __ TruncateWord64ToWord32(
__ Word64ShiftRightLogical(
803 __ Word64ShiftRightArithmetic(input_w64, int32_t{63});
805 __ Word64BitwiseXor(input_w64, sign_mask), sign_mask);
809 input_interpretation,
821 switch (input_interpretation) {
824 return __ TagSmi(input_w32);
833 if (
BIND(overflow)) {
846 __ TagSmi(input_w32));
860 switch (input_interpretation) {
863 Label<> outside_smi_range(
this);
865 V<Word32> v32 =
__ TruncateWord64ToWord32(input_w64);
867 GOTO_IF_NOT(
__ Word64Equal(v64, input_w64), outside_smi_range);
870 GOTO(done,
__ TagSmi(v32));
875 if (
BIND(outside_smi_range)) {
888 __ TagSmi(
__ TruncateWord64ToWord32(input_w64)));
904 Label<> outside_smi_range(
this);
906 V<Word32> v32 =
__ TruncateFloat64ToInt32OverflowUndefined(input_f64);
913 IF (
__ Word32Equal(v32, 0)) {
915 __ Int32LessThan(
__ Float64ExtractHighWord32(input_f64), 0),
921 GOTO(done,
__ TagSmi(v32));
926 if (
BIND(outside_smi_range)) {
949 Label<> allocate_heap_number(
this);
957 allocate_heap_number);
960 GOTO(allocate_heap_number);
963 if (
BIND(allocate_heap_number)) {
995 switch (input_interpretation) {
998 __ Word32BitwiseAnd(input_w32, 0xFFFF));
1017 input_interpretation,
1023 if (input_interpretation ==
1026 return __ TagSmi(input_w32);
1029 __ Int32AddCheckOverflow(input_w32, input_w32);
1031 DeoptimizeReason::kLostPrecision, feedback);
1032 return __ BitcastWord32ToSmi(
__ template Projection<0>(test));
1036 InputInterpretation::kUnsigned);
1038 __ DeoptimizeIfNot(check, frame_state, DeoptimizeReason::kLostPrecision,
1040 return __ TagSmi(input_w32);
1045 if (input_interpretation ==
1047 V<Word32> i32 =
__ TruncateWord64ToWord32(input_w64);
1048 V<Word32> check =
__ Word64Equal(
__ ChangeInt32ToInt64(i32), input_w64);
1049 __ DeoptimizeIfNot(check, frame_state, DeoptimizeReason::kLostPrecision,
1052 return __ TagSmi(i32);
1056 DeoptimizeReason::kLostPrecision, feedback);
1057 return __ BitcastWord32ToSmi(
__ template Projection<0>(test));
1061 InputInterpretation::kUnsigned);
1064 __ DeoptimizeIfNot(check, frame_state, DeoptimizeReason::kLostPrecision,
1066 return __ TagSmi(
__ TruncateWord64ToWord32(input_w64));
1078 if (input_assumptions ==
1081 }
else if (input_assumptions ==
1091 GOTO(done,
__ ReversibleFloat64ToInt32(value));
1098 InputAssumptions::kPlainPrimitive);
1107 GOTO(done,
__ JSTruncateFloat64ToWord32(f64));
1113 if (input_assumptions ==
1118 InputAssumptions::kNumberOrOddball);
1127 GOTO(done,
__ ReversibleFloat64ToInt64(value));
1145 GOTO(done,
__ ReversibleFloat64ToUint32(value));
1154 return __ TaggedEqual(
object,
__ HeapConstant(
factory_->true_value()));
1157 InputAssumptions::kNumberOrOddball) {
1173 InputAssumptions::kPlainPrimitive);
1200 __ DeoptimizeIfNot(
__ ObjectIsSmi(
object), frame_state,
1201 DeoptimizeReason::kNotASmi, feedback);
1212 V<Map> map =
__ LoadMapField(
object);
1215 __ HeapConstant(
factory_->heap_number_map())),
1216 frame_state, DeoptimizeReason::kNotAHeapNumber, feedback);
1221 __ ChangeFloat64ToInt32OrDeopt(heap_number_value, frame_state,
1222 minus_zero_mode, feedback));
1239 V<Map> map =
__ LoadMapField(
object);
1241 __ TaggedEqual(map,
__ HeapConstant(
factory_->heap_number_map())),
1242 frame_state, DeoptimizeReason::kNotAHeapNumber, feedback);
1246 __ ChangeFloat64ToAdditiveSafeIntegerOrDeopt(
1247 heap_number_value, frame_state, minus_zero_mode, feedback));
1262 V<Map> map =
__ LoadMapField(
object);
1264 __ TaggedEqual(map,
__ HeapConstant(
factory_->heap_number_map())),
1265 frame_state, DeoptimizeReason::kNotAHeapNumber, feedback);
1269 __ ChangeFloat64ToInt64OrDeopt(heap_number_value, frame_state,
1270 minus_zero_mode, feedback));
1281 IF (
__ ObjectIsSmi(
object)) {
1286 from_kind, feedback));
1294 JSPrimitiveKind::kNumberOrString);
1301 V<Map> map =
__ LoadMapField(
object);
1303 map,
__ HeapConstant(
factory_->heap_number_map())))) {
1308 if constexpr (
Is64()) {
1309 V<Word64> i64 =
__ TruncateFloat64ToInt64OverflowUndefined(
1316 __ DeoptimizeIfNot(
__ Float64Equal(
__ ChangeInt64ToFloat64(i64),
1319 DeoptimizeReason::kLostPrecisionOrNaN,
1323 DeoptimizeReason::kNotAnArrayIndex, feedback);
1326 DeoptimizeReason::kNotAnArrayIndex, feedback);
1329 V<Word32> i32 =
__ TruncateFloat64ToInt32OverflowUndefined(
1331 __ DeoptimizeIfNot(
__ Float64Equal(
__ ChangeInt32ToFloat64(i32),
1334 DeoptimizeReason::kLostPrecisionOrNaN,
1340#if V8_STATIC_ROOTS_BOOL
1341 V<Word32> is_string_map =
__ Uint32LessThanOrEqual(
1342 __ TruncateWordPtrToWord32(
__ BitcastHeapObjectToWordPtr(map)),
1343 __ Word32Constant(InstanceTypeChecker::kStringMapUpperBound));
1345 V<Word32> instance_type =
__ LoadInstanceTypeField(map);
1349 __ DeoptimizeIfNot(is_string_map, frame_state,
1350 DeoptimizeReason::kNotAString, feedback);
1362 ExternalReference::string_to_array_index_function());
1367 DeoptimizeReason::kNotAnArrayIndex, feedback);
1385 InputAssumptions::kNumberOrOddball);
1391 V<Float64> number_value =
__ template LoadField<Float64>(
1393 GOTO(done,
__ JSTruncateFloat64ToWord32(number_value));
1405 V<Word32> bitfield =
__ template LoadField<Word32>(
1407 IF (
__ Word32Equal(bitfield, 0)) {
1415 GOTO(done,
__ Word64Sub(0, lsd));
1427 if (input_assumptions ==
1431 GOTO(done,
__ Word32Equal(
__ TaggedEqual(
object,
__ TagSmi(0)), 0));
1441#if V8_STATIC_ROOTS_BOOL
1446 static_assert(StaticReadOnlyRoot::kFirstAllocatedRoot ==
1447 StaticReadOnlyRoot::kUndefinedValue);
1448 static_assert(StaticReadOnlyRoot::kUndefinedValue +
sizeof(
Undefined) ==
1449 StaticReadOnlyRoot::kNullValue);
1450 static_assert(StaticReadOnlyRoot::kNullValue +
sizeof(
Null) ==
1451 StaticReadOnlyRoot::kempty_string);
1452 static_assert(StaticReadOnlyRoot::kempty_string +
1454 StaticReadOnlyRoot::kFalseValue);
1455 static_assert(StaticReadOnlyRoot::kFalseValue +
sizeof(
False) ==
1456 StaticReadOnlyRoot::kTrueValue);
1457 V<Word32> object_as_word32 =
__ TruncateWordPtrToWord32(
1460 __ Word32Constant(StaticReadOnlyRoot::kTrueValue);
1461 GOTO_IF(
__ Uint32LessThan(object_as_word32, true_as_word32), done, 0);
1462 GOTO_IF(
__ Word32Equal(object_as_word32, true_as_word32), done, 1);
1466 __ TaggedEqual(
object,
__ HeapConstant(
factory_->false_value())),
1475 __ TaggedEqual(
object,
__ HeapConstant(
factory_->empty_string())),
1483 __ TaggedEqual(
object,
__ HeapConstant(
factory_->null_value())),
1488 __ HeapConstant(
factory_->undefined_value())),
1494 V<Map> map =
__ LoadMapField(
object);
1498 V<Word32> bitfield =
__ template LoadField<Word32>(
1501 Map::Bits1::IsUndetectableBit::kMask),
1507 map,
__ HeapConstant(
factory_->heap_number_map())))) {
1512 GOTO(done,
__ Float64LessThan(0.0,
__ Float64Abs(number_value)));
1517 __ TaggedEqual(map,
__ HeapConstant(
factory_->bigint_map())))) {
1518 V<Word32> bitfield =
__ template LoadField<Word32>(
1550 input, frame_state, input_requirement, feedback);
1551 GOTO(done,
__ JSTruncateFloat64ToWord32(number_value));
1559 if (!value_map.valid()) {
1560 value_map =
__ LoadMapField(value);
1562#if V8_STATIC_ROOTS_BOOL
1567 return __ Uint32LessThan(
1569 __ TruncateWordPtrToWord32(
__ BitcastHeapObjectToWordPtr(value_map)));
1571 static_assert(
LAST_TYPE == LAST_JS_RECEIVER_TYPE);
1572 V<Word32> value_instance_type =
__ LoadInstanceTypeField(value_map);
1573 return __ Uint32LessThanOrEqual(FIRST_JS_RECEIVER_TYPE,
1574 value_instance_type);
1584 return global_proxy;
1590 Label<> convert_to_object(
this);
1597 if (
BIND(convert_to_object)) {
1601 value,
__ HeapConstant(
factory_->undefined_value()))),
1602 done, global_proxy);
1604 value,
__ HeapConstant(
factory_->null_value()))),
1605 done, global_proxy);
1648 map =
__ HeapConstant(
factory_->cons_two_byte_string_map());
1651 map =
__ HeapConstant(
factory_->cons_one_byte_string_map());
1654 constexpr int kAllOnesMask = -1;
1656 V<Map> first_map =
__ LoadMapField(first);
1657 first_type =
__ LoadInstanceTypeField(first_map);
1660 first_type =
__ Word32Constant(kAllOnesMask);
1664 second_type =
__ LoadInstanceTypeField(second_map);
1667 second_type =
__ Word32Constant(kAllOnesMask);
1672 V<Word32> instance_type =
__ Word32BitwiseAnd(first_type, second_type);
1676 map =
__ HeapConstant(
factory_->cons_two_byte_string_map());
1678 map =
__ HeapConstant(
factory_->cons_one_byte_string_map());
1683 auto string =
__ template Allocate<ConsString>(
1691 return __ FinishInitialization(std::move(
string));
1698 GOTO_IF(
__ WordPtrEqual(length, 0), done,
1699 __ HeapConstant(
factory_->empty_fixed_array()));
1710 array_map =
factory_->fixed_double_array_map();
1714 the_hole_value =
__ template LoadField<Float64>(
1721 array_map =
factory_->fixed_array_map();
1725 the_hole_value =
__ HeapConstant(
factory_->the_hole_value());
1730 __ WordPtrAdd(
__ WordPtrShiftLeft(length,
static_cast<int>(size_log2)),
1731 access.header_size);
1734 auto uninitialized_array =
1735 __ template Allocate<AnyFixedArray>(size, allocation_type);
1737 __ HeapConstant(array_map));
1738 __ InitializeField(uninitialized_array,
1740 __ TagSmi(
__ TruncateWordPtrToWord32(length)));
1743 auto array =
__ FinishInitialization(std::move(uninitialized_array));
1747 WHILE(
__ UintPtrLessThan(index, length)) {
1748 __ StoreNonArrayBufferElement(array, access, index, the_hole_value);
1750 index =
__ WordPtrAdd(index, 1);
1767 __ ChangeInt32ToIntPtr(
__ UntagSmi(
__ template LoadField<Smi>(
1770 V<Object> elements =
__ template LoadField<Object>(
1776 WHILE(
__ UintPtrLessThan(index, array_length)) {
1777 V<Float64> element =
__ template LoadNonArrayBufferElement<Float64>(
1782 index =
__ WordPtrAdd(index, 1);
1785 return __ ConvertFloat64ToNumber(
result,
1797 V<WordPtr> index =
__ ChangeInt32ToIntPtr(field_index);
1805 __ Word32BitwiseAnd(
__ TruncateWordPtrToWord32(index), 0x1), 0x1)),
1813 IF (
__ IntPtrLessThan(index, 0)) {
1816 V<Object> properties =
__ template LoadField<Object>(
1819 V<WordPtr> out_of_object_index =
__ WordPtrSub(0, index);
1821 __ Load(properties, out_of_object_index,
1837 if (
BIND(double_field)) {
1840 V<WordPtr> double_index =
__ WordPtrShiftRightArithmetic(index, 1);
1844 IF (
__ IntPtrLessThan(double_index, 0)) {
1845 V<Object> properties =
__ template LoadField<Object>(
1848 V<WordPtr> out_of_object_index =
__ WordPtrSub(0, double_index);
1850 properties, out_of_object_index,
1858 __ Load(
object, double_index,
1865 if (
BIND(loaded_field, field)) {
1869 GOTO_IF(
__ ObjectIsSmi(field), done, field);
1870 V<Map> map =
__ LoadMapField(field);
1872 __ TaggedEqual(map,
__ HeapConstant(
factory_->heap_number_map())),
1892 __ IntAddCheckOverflow(left, right, rep);
1895 __ DeoptimizeIf(overflow, frame_state, DeoptimizeReason::kOverflow,
1897 return __ template Projection<0>(
result, rep);
1902 __ IntSubCheckOverflow(left, right, rep);
1905 __ DeoptimizeIf(overflow, frame_state, DeoptimizeReason::kOverflow,
1907 return __ template Projection<0>(
result, rep);
1914 __ Int32MulCheckOverflow(left_w32, right_w32);
1916 __ DeoptimizeIf(overflow, frame_state, DeoptimizeReason::kOverflow,
1921 IF (
__ Word32Equal(value, 0)) {
1923 __ Int32LessThan(
__ Word32BitwiseOr(left_w32, right_w32), 0),
1924 frame_state, DeoptimizeReason::kMinusZero, feedback);
1936 __ DeoptimizeIf(overflow, frame_state, DeoptimizeReason::kOverflow,
1938 return __ template Projection<0>(
result);
1946 if (
__ matcher().MatchPowerOfTwoWord32Constant(right_w32, &divisor)) {
1953 __ Word32Equal(
__ Word32BitwiseAnd(left_w32, divisor - 1), 0);
1954 __ DeoptimizeIfNot(check, frame_state,
1955 DeoptimizeReason::kLostPrecision, feedback);
1956 return __ Word32ShiftRightArithmeticShiftOutZeros(
1962 IF (
__ Int32LessThan(0, right_w32)) {
1963 GOTO(done,
__ Int32Div(left_w32, right_w32));
1967 DeoptimizeReason::kDivisionByZero, feedback);
1971 DeoptimizeReason::kMinusZero, feedback);
1977 DeoptimizeReason::kOverflow, feedback);
1980 GOTO(done,
__ Int32Div(left_w32, right_w32));
1985 __ Word32Equal(left_w32,
__ Word32Mul(value, right_w32));
1986 __ DeoptimizeIfNot(lossless, frame_state,
1987 DeoptimizeReason::kLostPrecision, feedback);
1997 DeoptimizeReason::kDivisionByZero, feedback);
2001 std::numeric_limits<int64_t>::min()))) {
2003 DeoptimizeReason::kOverflow, feedback);
2006 return __ Int64Div(left_w64, right_w64);
2034 IF (
__ Int32LessThanOrEqual(right_w32, 0)) {
2040 __ DeoptimizeIfNot(temp, frame_state,
2041 DeoptimizeReason::kDivisionByZero, feedback);
2042 GOTO(rhs_checked, temp);
2044 GOTO(rhs_checked, right_w32);
2047 BIND(rhs_checked, rhs_value);
2049 IF (
__ Int32LessThan(left_w32, 0)) {
2054 V<Word32> temp =
__ Uint32Mod(
__ Word32Sub(0, left_w32), rhs_value);
2058 DeoptimizeReason::kMinusZero, feedback);
2059 GOTO(done,
__ Word32Sub(0, temp));
2074 DeoptimizeReason::kDivisionByZero, feedback);
2079 std::numeric_limits<int64_t>::min()))) {
2081 DeoptimizeReason::kOverflow, feedback);
2084 return __ Int64Mod(left_w64, right_w64);
2093 if (
__ matcher().MatchPowerOfTwoWord32Constant(right_w32, &divisor)) {
2100 __ Word32Equal(
__ Word32BitwiseAnd(left_w32, divisor - 1), 0);
2101 __ DeoptimizeIfNot(check, frame_state,
2102 DeoptimizeReason::kLostPrecision, feedback);
2103 return __ Word32ShiftRightLogical(
2108 DeoptimizeReason::kDivisionByZero, feedback);
2111 V<Word32> value =
__ Uint32Div(left_w32, right_w32);
2115 __ Word32Equal(left_w32,
__ Word32Mul(right_w32, value));
2116 __ DeoptimizeIfNot(lossless, frame_state,
2117 DeoptimizeReason::kLostPrecision, feedback);
2128 DeoptimizeReason::kDivisionByZero, feedback);
2162 __ CallRuntime_TerminateExecution(
isolate_, frame_state,
2163 __ NoContextConstant());
2170 ? DeoptimizeReason::kBigIntTooBig
2171 : DeoptimizeReason::kDivisionByZero,
2217 if (ref.IsString()) {
2220 V<Map> dynamic_map =
__ LoadMapField(
string);
2222 IF (
__ TaggedEqual(dynamic_map,
__ HeapConstant(expected_map))) {
2231 Label<> seq_string(
this), external_string(
this), cons_string(
this),
2232 sliced_string(
this), thin_string(
this);
2249#if V8_STATIC_ROOTS_BOOL
2251 __ TruncateWordPtrToWord32(
__ BitcastTaggedToWordPtr(map));
2253 using StringTypeRange =
2254 InstanceTypeChecker::kUniqueMapRangeOfStringType;
2257 static_assert(StringTypeRange::kSeqString.first == 0);
2258 GOTO_IF(
__ Uint32LessThanOrEqual(map_bits,
2259 StringTypeRange::kSeqString.
second),
2262 static_assert(StringTypeRange::kSeqString.second + Map::kSize ==
2263 StringTypeRange::kExternalString.first);
2265 map_bits, StringTypeRange::kExternalString.
second),
2268 static_assert(StringTypeRange::kExternalString.second + Map::kSize ==
2269 StringTypeRange::kConsString.first);
2270 GOTO_IF(
__ Uint32LessThanOrEqual(map_bits,
2271 StringTypeRange::kConsString.
second),
2274 static_assert(StringTypeRange::kConsString.second + Map::kSize ==
2275 StringTypeRange::kSlicedString.first);
2276 GOTO_IF(
__ Uint32LessThanOrEqual(map_bits,
2277 StringTypeRange::kSlicedString.
second),
2280 static_assert(StringTypeRange::kSlicedString.second + Map::kSize ==
2281 StringTypeRange::kThinString.first);
2282 GOTO_IF(
__ Uint32LessThanOrEqual(map_bits,
2283 StringTypeRange::kThinString.
second),
2286 V<Word32> instance_type =
__ LoadInstanceTypeField(map);
2301 if (
BIND(seq_string)) {
2302#if V8_STATIC_ROOTS_BOOL
2304 __ Word32BitwiseAnd(map_bits,
2305 InstanceTypeChecker::kStringMapEncodingMask),
2306 InstanceTypeChecker::kOneByteStringMapBit);
2315 if (
BIND(external_string)) {
2318#if V8_STATIC_ROOTS_BOOL
2319 V<Word32> is_uncached_external_string =
__ Uint32LessThanOrEqual(
2320 __ Word32Sub(map_bits,
2321 StringTypeRange::kUncachedExternalString.first),
2322 StringTypeRange::kUncachedExternalString.
second -
2323 StringTypeRange::kUncachedExternalString.first);
2325 V<Word32> is_uncached_external_string =
__ Word32Equal(
2333#if V8_STATIC_ROOTS_BOOL
2335 __ Word32BitwiseAnd(map_bits,
2336 InstanceTypeChecker::kStringMapEncodingMask),
2337 InstanceTypeChecker::kTwoByteStringMapBit);
2344 constexpr uint8_t twobyte_size_log2 = 1;
2351 constexpr uint8_t onebyte_size_log2 = 0;
2360 if (
BIND(cons_string)) {
2371 if (
BIND(sliced_string)) {
2377 __ ChangeInt32ToIntPtr(
__ UntagSmi(
offset)));
2381 if (
BIND(thin_string)) {
2387 if (
BIND(runtime)) {
2409 return __ template LoadField<Word32>(
string,
2418 V<WordPtr> byte_length =
__ template LoadField<WordPtr>(
2421 return __ WordPtrShiftRightLogical(byte_length,
2431 return __ CallBuiltin_StringFromCodePointAt(
isolate_,
string, index);
2434#ifdef V8_INTL_SUPPORT
2436 StringToCaseIntlOp::Kind
kind) {
2437 if (
kind == StringToCaseIntlOp::Kind::kLower) {
2438 return __ CallBuiltin_StringToLowerCaseIntl(
2442 return __ CallRuntime_StringToUpperCaseIntl(
2452 return __ CallBuiltin_StringSubstring(
isolate_,
string, s, e);
2458 return __ CallBuiltin_StringAdd_CheckNone(
isolate_,
__ NoContextConstant(),
2468 GOTO_IF(
__ TaggedEqual(left, right), done,
2471 V<Word32> left_length =
__ template LoadField<Word32>(
2473 V<Word32> right_length =
__ template LoadField<Word32>(
2475 IF (
__ Word32Equal(left_length, right_length)) {
2477 __ CallBuiltin_StringEqual(
isolate_, left, right,
2478 __ ChangeInt32ToIntPtr(left_length)));
2487 return __ CallBuiltin_StringLessThan(
isolate_, left, right);
2489 return __ CallBuiltin_StringLessThanOrEqual(
isolate_, left, right);
2494 int formal_parameter_count) {
2501 return __ TagSmi(
__ TruncateWordPtrToWord32(arguments_length));
2505 __ WordPtrSub(arguments_length, formal_parameter_count);
2507 IF (
__ IntPtrLessThan(rest_length, 0)) {
2510 GOTO(done, rest_length);
2514 return __ TagSmi(
__ TruncateWordPtrToWord32(value));
2520 int formal_parameter_count) {
2525 return __ CallBuiltin_NewSloppyArgumentsElements(
2526 isolate_, frame, p_count, arguments_count);
2528 return __ CallBuiltin_NewStrictArgumentsElements(
2529 isolate_, frame, p_count, arguments_count);
2531 return __ CallBuiltin_NewRestArgumentsElements(
isolate_, frame, p_count,
2558#if V8_COMPRESS_POINTERS && V8_TARGET_BIG_ENDIAN
2577 __ StoreArrayBufferElement(
2591 V<Map> map =
__ LoadMapField(array);
2594 V<Word32> elements_kind =
__ Word32ShiftRightLogical(
2595 __ Word32BitwiseAnd(bitfield2, Map::Bits2::ElementsKindBits::kMask),
2596 Map::Bits2::ElementsKindBits::kShift);
2638 GOTO_IF(
__ ObjectIsSmi(value), do_store, elements_kind);
2644 V<Map> value_map =
__ LoadMapField(value);
2645 IF (
__ TaggedEqual(value_map,
2646 __ HeapConstant(
factory_->heap_number_map()))) {
2650 double_map.ToHandleChecked());
2654 fast_map.ToHandleChecked());
2660 do_store, elements_kind);
2664 V<Map> value_map =
__ LoadMapField(value);
2666 value_map,
__ HeapConstant(
factory_->heap_number_map())))) {
2668 fast_map.ToHandleChecked());
2672 GOTO(do_store, elements_kind);
2674 BIND(do_store, store_kind);
2675 V<Object> elements =
__ template LoadField<Object>(
2679 IF (
__ ObjectIsSmi(value)) {
2681 __ ChangeInt32ToFloat64(
__ UntagSmi(value));
2682 __ StoreNonArrayBufferElement(
2688 __ StoreNonArrayBufferElement(
2690 __ Float64SilenceNaN(float_value));
2694 __ StoreNonArrayBufferElement(
2725 double_map.ToHandleChecked());
2735 V<Object> elements =
__ template LoadField<Object>(
2738 __ StoreNonArrayBufferElement(
2748 V<Object> elements =
__ template LoadField<Object>(
2750 __ StoreNonArrayBufferElement(
2752 __ Float64SilenceNaN(value));
2777 fast_map.ToHandleChecked());
2780 fast_map.ToHandleChecked());
2783 V<Object> elements =
__ template LoadField<Object>(
2788 access.type = compiler::Type::BooleanOrNullOrUndefined();
2791 __ StoreNonArrayBufferElement(elements, access, index, value);
2809 V<Object> elements =
__ template LoadField<Object>(
2814 __ StoreNonArrayBufferElement(
2825 __ StoreNonArrayBufferElement(elements, access, index,
2838 if (!map.has_value()) {
2839 map =
__ LoadMapField(heap_object);
2848 if (maps.is_empty()) {
2849 __ Deoptimize(frame_state, DeoptimizeReason::kWrongMap, feedback);
2854 if (map.has_value()) {
2855 heap_object_map = map.value();
2857 heap_object_map =
__ LoadMapField(heap_object);
2866 heap_object_map =
__ LoadMapField(heap_object);
2867 __ DeoptimizeIfNot(
__ CompareMaps(heap_object, heap_object_map, maps),
2868 frame_state, DeoptimizeReason::kWrongMap, feedback);
2873 heap_object, heap_object_map, frame_state, feedback);
2874 __ Deoptimize(frame_state, DeoptimizeReason::kWrongMap, feedback);
2877 __ DeoptimizeIfNot(
__ CompareMaps(heap_object, heap_object_map, maps),
2878 frame_state, DeoptimizeReason::kWrongMap, feedback);
2882 __ AssumeMap(heap_object, maps);
2888 LABEL_BLOCK(no_change) {
return Next::ReduceFloatUnary(input,
kind, rep); }
2905 V<Float64> two_52 =
__ Float64Constant(4503599627370496.0E0);
2906 V<Float64> minus_two_52 =
__ Float64Constant(-4503599627370496.0E0);
2933 IF (
LIKELY(
__ Float64LessThan(0.0, input_f64))) {
2938 GOTO_IF_NOT(
__ Float64LessThan(temp1, input_f64), done, temp1);
2941 GOTO(done, input_f64);
2943 __ Float64LessThanOrEqual(input_f64, minus_two_52))) {
2944 GOTO(done, input_f64);
2950 __ Float64Sub(-0.0, temp2));
2951 GOTO(done,
__ Float64Sub(-0.0,
__ Float64Sub(temp2, 1.0)));
2984 IF (
LIKELY(
__ Float64LessThan(0.0, input_f64))) {
2989 GOTO_IF_NOT(
__ Float64LessThan(input_f64, temp1), done, temp1);
2990 GOTO(done,
__ Float64Sub(temp1, 1.0));
2992 GOTO(done, input_f64);
2994 __ Float64LessThanOrEqual(input_f64, minus_two_52))) {
2995 GOTO(done, input_f64);
3001 __ Float64Sub(-0.0, temp2));
3002 GOTO(done,
__ Float64Sub(-1.0, temp2));
3027 GOTO_IF(
__ Float64LessThan(temp1, 0.5), done, value);
3028 GOTO_IF(
__ Float64LessThan(0.5, temp1), done,
3032 GOTO_IF(
__ Float64Equal(temp2, 0.0), done, value);
3064 IF (
__ Float64LessThan(0.0, input_f64)) {
3070 GOTO_IF(
__ Float64LessThan(input_f64, temp1), done,
3071 __ Float64Sub(temp1, 1.0));
3076 UNLIKELY(
__ Float64LessThanOrEqual(input_f64, minus_two_52)),
3083 IF (
__ Float64LessThan(temp1, temp2)) {
3084 GOTO(done,
__ Float64Sub(-0.0,
__ Float64Sub(temp2, 1.0)));
3086 GOTO(done,
__ Float64Sub(-0.0, temp2));
3105 V<Map> map =
__ LoadMapField(input);
3106 V<Word32> instance_type =
__ LoadInstanceTypeField(map);
3107 V<Word32> is_function_type =
__ Uint32LessThanOrEqual(
3108 __ Word32Sub(instance_type, FIRST_JS_FUNCTION_TYPE),
3109 (LAST_JS_FUNCTION_TYPE - FIRST_JS_FUNCTION_TYPE));
3110 __ DeoptimizeIfNot(is_function_type, frame_state,
3117 __ DeoptimizeIfNot(
__ TaggedEqual(cell,
__ HeapConstant(feedback_cell)),
3118 frame_state, DeoptimizeReason::kWrongFeedbackCell,
3134 V<Map> value_map =
__ LoadMapField(value);
3135 V<Word32> value_instance_type =
__ LoadInstanceTypeField(value_map);
3141 V<String> value_actual =
__ template LoadField<String>(
3143 __ DeoptimizeIfNot(
__ TaggedEqual(expected, value_actual), frame_state,
3150 __ Word32BitwiseAnd(value_instance_type,
3160 OpIndex try_string_to_index_or_lookup_existing =
__ ExternalConstant(
3161 ExternalReference::try_string_to_index_or_lookup_existing());
3165 try_string_to_index_or_lookup_existing, {isolate_ptr, value},
3171 __ DeoptimizeIfNot(
__ TaggedEqual(expected, value_internalized),
3172 frame_state, DeoptimizeReason::kWrongName,
3183 return __ BitcastWordPtrToTagged(
__ template LoadField<WordPtr>(
3189 __ BitcastTaggedToWordPtr(
object));
3197 return __ CallBuiltin_SameValue(
isolate_, left, right);
3199 return __ CallBuiltin_SameValueNumbersOnly(
isolate_, left, right);
3207 IF (
__ Float64Equal(left, right)) {
3210 V<Word32> left_hi =
__ Float64ExtractHighWord32(left);
3211 V<Word32> right_hi =
__ Float64ExtractHighWord32(right);
3212 GOTO(done,
__ Word32Equal(left_hi, right_hi));
3215 GOTO_IF(
__ Float64Equal(left, left), done, 0);
3216 GOTO_IF(
__ Float64Equal(right, right), done, 0);
3226 __ TagSmi(
static_cast<int>(reason)));
3234 V<Map> map =
__ LoadMapField(elements);
3239 map,
__ HeapConstant(
factory_->fixed_array_map()))),
3244 __ CallBuiltin_CopyFastSmiOrObjectElements(
isolate_,
object);
3259 GOTO_IF(
LIKELY(
__ Uint32LessThan(index, elements_length)), done, elements);
3264 new_elements =
__ CallBuiltin_GrowFastDoubleElements(
isolate_,
object,
3268 new_elements =
__ CallBuiltin_GrowFastSmiOrObjectElements(
3275 DeoptimizeReason::kCouldNotGrowElements, feedback);
3276 GOTO(done, new_elements);
3284 V<Map> source_map =
__ HeapConstant(transition.source().object());
3285 V<Map> target_map =
__ HeapConstant(transition.target().object());
3288 V<Map> map =
__ LoadMapField(
object);
3292 switch (transition.mode()) {
3299 __ CallRuntime_TransitionElementsKind(
3300 isolate_,
__ NoContextConstant(),
object, target_map);
3313 const MapRef target = transition.target();
3314 V<Map> target_map =
__ HeapConstant(target.object());
3316 IF (
LIKELY(
__ TaggedEqual(map, target_map))) {
3321 for (
const MapRef transition_source : transition_sources) {
3323 transition_source.elements_kind(), target.elements_kind());
3325 IF (
__ TaggedEqual(map,
__ HeapConstant(transition_source.object()))) {
3331 __ CallRuntime_TransitionElementsKind(
3332 isolate_,
__ NoContextConstant(),
object, target_map);
3339 __ Deoptimize(frame_state, DeoptimizeReason::kWrongMap,
3340 transition.feedback());
3347 __ AssumeMap(
object, maps);
3356 return __ CallBuiltin_FindOrderedHashMapEntry(
3363 __ ChangeInt32ToIntPtr(
__ UntagSmi(
__ template LoadField<Smi>(
3366 hash =
__ WordPtrBitwiseAnd(hash,
__ WordPtrSub(number_of_buckets, 1));
3375 GOTO(loop, first_entry);
3394 __ LoadMapField(candidate_key),
3395 __ HeapConstant(
factory_->heap_number_map()))) {
3398 __ ChangeInt32ToFloat64(
key)),
3409 GOTO(loop, next_entry);
3416 return __ CallBuiltin_FindOrderedHashSetEntry(
3429 V<Word32> first_code_unit =
__ StringCharCodeAt(
string, index);
3431 __ Word32BitwiseAnd(first_code_unit, 0xFC00), 0xD800)),
3432 done, first_code_unit);
3433 if (!length.has_value()) {
3434 length =
__ ChangeUint32ToUintPtr(
__ template LoadField<Word32>(
3438 GOTO_IF_NOT(
__ IntPtrLessThan(next_index, length.value()), done,
3441 V<Word32> second_code_unit =
__ StringCharCodeAt(
string, next_index);
3443 __ Word32Equal(
__ Word32BitwiseAnd(second_code_unit, 0xFC00), 0xDC00),
3444 done, first_code_unit);
3449#if V8_TARGET_BIG_ENDIAN
3451 __ Word32ShiftLeft(first_code_unit, 16), second_code_unit);
3454 __ Word32ShiftLeft(second_code_unit, 16), first_code_unit);
3460 const int32_t surrogate_offset = 0x10000 - (0xD800 << 10) - 0xDC00;
3462 __ Word32Add(
__ Word32ShiftLeft(first_code_unit, 10),
3463 __ Word32Add(second_code_unit, surrogate_offset));
3494 __ InitializeElement(
3495 string, AccessBuilderTS::ForSeqTwoByteStringCharacter(), 0, code);
3496 GOTO(done,
__ FinishInitialization(std::move(
string)));
3517 V<Word32> lead_offset =
__ Word32Constant(0xD800 - (0x10000 >> 10));
3520 V<Word32> lead =
__ Word32Add(
__ Word32ShiftRightLogical(codepoint, 10),
3525 __ Word32Add(
__ Word32BitwiseAnd(codepoint, 0x3FF), 0xDC00);
3528#if V8_TARGET_BIG_ENDIAN
3529 code =
__ Word32BitwiseOr(
__ Word32ShiftLeft(lead, 16), trail);
3531 code =
__ Word32BitwiseOr(
__ Word32ShiftLeft(trail, 16), lead);
3541 auto access = AccessBuilderTS::ForSeqTwoByteStringCharacter();
3543 __ InitializeElement(
string, access, 0, code);
3544 GOTO(done,
__ FinishInitialization(std::move(
string)));
3552 __ CodeComment(
"AllocateSeqTwoByteString");
3556 __ template Allocate<SeqTwoByteString>(
3565 __ SeqTwoByteStringMapConstant());
3566 __ InitializeField(
string, AccessBuilderTS::ForStringLength(), length);
3567 __ InitializeField(
string, AccessBuilderTS::ForNameRawHashField(),
3574#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
3576 return __ LoadOffHeap(
3577 __ IsolateField(IsolateFieldId::kContinuationPreservedEmbedderData),
3583 __ IsolateField(IsolateFieldId::kContinuationPreservedEmbedderData),
3597 IF (
__ Word32Equal(
__ Word32BitwiseAnd(right, msk), 0)) {
3599 GOTO(done,
__ Word32BitwiseAnd(left, msk));
3602 GOTO(done,
__ Uint32Mod(left, right));
3616 static constexpr auto zero_bitfield =
3620 auto bigint =
__ template Allocate<FreshlyAllocatedBigInt>(
3626 bitfield.
valid() ? bitfield :
__ Word32Constant(zero_bitfield));
3629#ifdef BIGINT_NEEDS_PADDING
3630 __ InitializeField(bigint, AccessBuilder::ForBigIntOptionalPadding(),
3631 __ Word32Constant(0));
3633 if (digit.
valid()) {
3650 GOTO(*done,
__ BitcastWord32ToSmi(
__ template Projection<0>(add)));
3655 return __ Word32Equal(
__ Word32Equal(value, 0), 0);
3659 return __ AllocateHeapNumberWithValue(value,
factory_);
3666 V<Map> map =
__ LoadMapField(heap_object);
3667 switch (input_kind) {
3675 __ TaggedEqual(map,
__ HeapConstant(
factory_->heap_number_map()));
3676 __ DeoptimizeIfNot(is_number, frame_state,
3677 DeoptimizeReason::kNotAHeapNumber, feedback);
3678 __ ChangeFloat64ToAdditiveSafeIntegerOrDeopt(
3685 __ TaggedEqual(map,
__ HeapConstant(
factory_->heap_number_map()));
3686 __ DeoptimizeIfNot(is_number, frame_state,
3687 DeoptimizeReason::kNotAHeapNumber, feedback);
3692#if V8_STATIC_ROOTS_BOOL
3695 static_assert(StaticReadOnlyRoot::kBooleanMap + Map::kSize ==
3696 StaticReadOnlyRoot::kHeapNumberMap);
3698 __ TruncateWordPtrToWord32(
__ BitcastHeapObjectToWordPtr(map));
3700 __ Word32Sub(map_int32,
3701 __ Word32Constant(StaticReadOnlyRoot::kBooleanMap)),
3702 __ Word32Constant(StaticReadOnlyRoot::kHeapNumberMap -
3703 StaticReadOnlyRoot::kBooleanMap));
3704 __ DeoptimizeIfNot(is_in_range, frame_state,
3705 DeoptimizeReason::kNotANumberOrBoolean, feedback);
3708 __ HeapConstant(
factory_->heap_number_map()))) {
3710 __ TaggedEqual(map,
__ HeapConstant(
factory_->boolean_map())),
3711 frame_state, DeoptimizeReason::kNotANumberOrBoolean, feedback);
3719#if V8_STATIC_ROOTS_BOOL
3720 constexpr auto kNumberOrOddballRange =
3721 InstanceTypeChecker::UniqueMapRangeOfInstanceTypeRange(
3722 HEAP_NUMBER_TYPE, ODDBALL_TYPE)
3725 __ TruncateWordPtrToWord32(
__ BitcastHeapObjectToWordPtr(map));
3727 __ Word32Sub(map_int32,
3728 __ Word32Constant(kNumberOrOddballRange.first)),
3729 __ Word32Constant(kNumberOrOddballRange.second -
3730 kNumberOrOddballRange.first));
3731 __ DeoptimizeIfNot(is_in_range, frame_state,
3732 DeoptimizeReason::kNotANumberOrOddball, feedback);
3735 __ HeapConstant(
factory_->heap_number_map()))) {
3738 V<Word32> instance_type =
__ LoadInstanceTypeField(map);
3739 __ DeoptimizeIfNot(
__ Word32Equal(instance_type, ODDBALL_TYPE),
3741 DeoptimizeReason::kNotANumberOrOddball, feedback);
3748 return __ template LoadField<Float64>(
3757 GOTO(done,
__ template LoadNonArrayBufferElement<Word32>(
3761 GOTO(done,
__ template LoadNonArrayBufferElement<Word32>(
3775 V<Word32> bitfield3 =
__ template LoadField<Word32>(
3778 __ Word32BitwiseAnd(bitfield3, Map::Bits3::IsDeprecatedBit::kMask);
3779 __ DeoptimizeIfNot(deprecated, frame_state, DeoptimizeReason::kWrongMap,
3782 isolate_,
__ NoContextConstant(), heap_object);
3785 DeoptimizeReason::kInstanceMigrationFailed, feedback);
3793 V<Word32> bitfield3 =
__ template LoadField<Word32>(
3796 __ Word32BitwiseAnd(bitfield3, Map::Bits3::IsDeprecatedBit::kMask);
3797 __ DeoptimizeIfNot(deprecated, frame_state, DeoptimizeReason::kWrongMap,
3799 __ CallRuntime_TryMigrateInstanceAndMarkMapAsMigrationTarget(
3800 isolate_,
__ NoContextConstant(), heap_object);
3805 std::initializer_list<OpIndex> arguments) {
3807 arguments.size() == 1);
3809 arguments.size() == 2);
3811 args.push_back(
__ NoContextConstant());
3827 return Builtin::kBigIntAddNoThrow;
3829 return Builtin::kBigIntSubtractNoThrow;
3831 return Builtin::kBigIntMultiplyNoThrow;
3833 return Builtin::kBigIntDivideNoThrow;
3835 return Builtin::kBigIntModulusNoThrow;
3837 return Builtin::kBigIntBitwiseAndNoThrow;
3839 return Builtin::kBigIntBitwiseOrNoThrow;
3841 return Builtin::kBigIntBitwiseXorNoThrow;
3843 return Builtin::kBigIntShiftLeftNoThrow;
3845 return Builtin::kBigIntShiftRightNoThrow;
3850 if (
__ matcher().MatchZero(
base))
return external;
3859 __ ChangeUint32ToUintPtr(
__ TruncateWordPtrToWord32(untagged_base));
3861 return __ WordPtrAdd(untagged_base, external);
3866 value =
__ Word32Add(
__ Word32BitwiseXor(value, 0xFFFFFFFF),
3867 __ Word32ShiftLeft(value, 15));
3868 value =
__ Word32BitwiseXor(value,
__ Word32ShiftRightLogical(value, 12));
3869 value =
__ Word32Add(value,
__ Word32ShiftLeft(value, 2));
3870 value =
__ Word32BitwiseXor(value,
__ Word32ShiftRightLogical(value, 4));
3871 value =
__ Word32Mul(value, 2057);
3872 value =
__ Word32BitwiseXor(value,
__ Word32ShiftRightLogical(value, 16));
3873 value =
__ Word32BitwiseAnd(value, 0x3FFFFFFF);
3884 __ HeapConstant(target_map));
3887 __ CallRuntime_TransitionElementsKind(
isolate_,
__ NoContextConstant(),
3888 array,
__ HeapConstant(target_map));
3894 if (maps.is_empty()) {
3895 return __ Word32Constant(0);
3898 for (
size_t i = 0;
i < maps.
size(); ++
i) {
3899 V<Map> map =
__ HeapConstant(maps[
i].
object());
3901 result =
__ TaggedEqual(heap_object_map, map);
3904 __ Word32BitwiseOr(
result,
__ TaggedEqual(heap_object_map, map));
#define REDUCE(operation)
#define BIND_LOOP(loop_label,...)
#define GOTO_IF_NOT(cond, label,...)
#define GOTO_IF(cond, label,...)
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
static constexpr U encode(T value)
static V8_NODISCARD constexpr U update(U previous, T value)
static constexpr int kShift
static uint32_t SizeFor(uint32_t length)
static V8_EXPORT_PRIVATE Callable CallableFor(Isolate *isolate, Builtin builtin)
int GetStackParameterCount() const
Handle< Code > code() const
CallInterfaceDescriptor descriptor() const
static constexpr int kFixedFrameSizeAboveFp
static V8_EXPORT_PRIVATE ExternalReference isolate_address()
v8::internal::Factory * factory()
static constexpr MachineType Float64()
static constexpr MachineType Pointer()
static constexpr MachineType Int32()
static constexpr MachineType AnyTagged()
static constexpr MachineType Uint32()
static constexpr MachineType TaggedSigned()
static constexpr MachineType TaggedPointer()
static constexpr int kEmptyHashField
static const int kEntrySize
static const int kNotFound
static constexpr int HashTableStartOffset()
static const int kChainOffset
static V8_INLINE constexpr int32_t SizeFor(int32_t length)
static V8_INLINE constexpr int32_t SizeFor(int32_t length)
static constexpr int kMaxValue
static constexpr int kArgCOffset
static const int32_t kMaxOneByteCharCode
static ElementAccess ForFixedArrayElement()
static ElementAccess ForSeqTwoByteStringCharacter()
static FieldAccess ForBigIntBitfield()
static FieldAccess ForMap(WriteBarrierKind write_barrier=kMapWriteBarrier)
static ElementAccess ForSeqOneByteStringCharacter()
static FieldAccess ForJSObjectPropertiesOrHashKnownPointer()
static FieldAccess ForThinStringActual()
static FieldAccess ForExternalIntPtr()
static FieldAccess ForExternalStringResourceData()
static FieldAccess ForSlicedStringParent()
static FieldAccess ForSlicedStringOffset()
static FieldAccess ForFixedArrayLength()
static FieldAccess ForStringLength()
static FieldAccess ForMapBitField2()
static FieldAccess ForJSArrayLength(ElementsKind elements_kind)
static FieldAccess ForOrderedHashMapOrSetNumberOfBuckets()
static FieldAccess ForJSFunctionFeedbackCell()
static ElementAccess ForFixedDoubleArrayElement()
static FieldAccess ForBigIntLeastSignificantDigit64()
static FieldAccess ForHeapNumberOrOddballOrHoleValue()
static FieldAccess ForConsStringFirst()
static FieldAccess ForJSTypedArrayByteLength()
static FieldAccess ForConsStringSecond()
static ElementAccess ForTypedArrayElement(ExternalArrayType type, bool is_external)
static FieldAccess ForMapBitField()
static FieldAccess ForMapBitField3()
static FieldAccess ForNameRawHashField()
static FieldAccess ForJSObjectElements()
bool DependOnNoUndetectableObjectsProtector()
V8_EXPORT_PRIVATE MapRef map(JSHeapBroker *broker) const
CompilationDependencies * dependencies() const
static CallDescriptor * GetSimplifiedCDescriptor(Zone *zone, const MachineSignature *sig, CallDescriptor::Flags flags=CallDescriptor::kNoFlags, Operator::Properties properties=Operator::kNoThrow)
static CallDescriptor * GetStubCallDescriptor(Zone *zone, const CallInterfaceDescriptor &descriptor, int stack_parameter_count, CallDescriptor::Flags flags, Operator::Properties properties=Operator::kNoProperties, StubCallMode stub_mode=StubCallMode::kCallCodeObject)
IndirectHandle< Map > object() const
bool IsOneByteRepresentation() const
static Type SignedSmall()
Map ForMap(WriteBarrierKind write_barrier=kMapWriteBarrier)
static ElementAccessTS< FixedArray, T > ForFixedArrayElement()
static constexpr FloatRepresentation Float32()
static constexpr FloatRepresentation Float64()
V< String > REDUCE StringSubstring(V< String > string, V< Word32 > start, V< Word32 > end)
Builtin GetBuiltinForBigIntBinop(BigIntBinopOp::Kind kind)
V< ConsString > REDUCE NewConsString(V< Word32 > length, V< String > first, V< String > second)
void TransitionElementsTo(V< JSArray > array, ElementsKind from, ElementsKind to, Handle< Map > target_map)
V< Word32 > REDUCE ObjectIs(V< Object > input, ObjectIsOp::Kind kind, ObjectIsOp::InputAssumptions input_assumptions)
V< None > REDUCE StoreMessage(V< WordPtr > offset, V< Object > object)
bool NeedsHeapObjectCheck(ObjectIsOp::InputAssumptions input_assumptions)
void TagSmiOrOverflow(V< Word32 > input, Label<> *overflow, Label< Number > *done)
V< Object > REDUCE Convert(V< Object > input, ConvertOp::Kind from, ConvertOp::Kind to)
V< String > REDUCE StringConcat(V< Smi > length, V< String > left, V< String > right)
V< String > REDUCE StringFromCodePointAt(V< String > string, V< WordPtr > index)
V< Object > REDUCE EnsureWritableFastElements(V< Object > object, V< Object > elements)
V< Any > REDUCE LoadTypedElement(OpIndex buffer, V< Object > base, V< WordPtr > external, V< WordPtr > index, ExternalArrayType array_type)
V< String > StringFromSingleCharCode(V< Word32 > code)
V< Word32 > JSAnyIsNotPrimitiveHeapObject(V< Object > value, V< Map > value_map=V< Map >::Invalid())
V< BigInt > REDUCE BigIntBinop(V< BigInt > left, V< BigInt > right, V< FrameState > frame_state, BigIntBinopOp::Kind kind)
V< AnyFixedArray > REDUCE NewArray(V< WordPtr > length, NewArrayOp::Kind kind, AllocationType allocation_type)
bool DependOnNoUndetectableObjectsProtector()
V< WordPtr > REDUCE TypedArrayLength(V< JSTypedArray > typed_array, ElementsKind elements_kind)
V< Object > REDUCE LoadStackArgument(V< WordPtr > base, V< WordPtr > index)
V< Word32 > REDUCE Float64Is(V< Float64 > value, NumericKind kind)
V< None > REDUCE CheckMaps(V< HeapObject > heap_object, V< FrameState > frame_state, OptionalV< Map > map, const ZoneRefSet< Map > &maps, CheckMapsFlags flags, const FeedbackSource &feedback)
V< Smi > REDUCE StringIndexOf(V< String > string, V< String > search, V< Smi > position)
V< Untagged > REDUCE ConvertJSPrimitiveToUntagged(V< JSPrimitive > object, ConvertJSPrimitiveToUntaggedOp::UntaggedKind kind, ConvertJSPrimitiveToUntaggedOp::InputAssumptions input_assumptions)
V< Untagged > REDUCE ChangeOrDeopt(V< Untagged > input, V< FrameState > frame_state, ChangeOrDeoptOp::Kind kind, CheckForMinusZeroMode minus_zero_mode, const FeedbackSource &feedback)
V< Number > REDUCE DoubleArrayMinMax(V< JSArray > array, DoubleArrayMinMaxOp::Kind kind)
StringEncoding GetStringEncoding(V< String > string)
V< Word32 > BuildUint32Mod(V< Word32 > left, V< Word32 > right)
V< Word > REDUCE TruncateJSPrimitiveToUntagged(V< JSPrimitive > object, TruncateJSPrimitiveToUntaggedOp::UntaggedKind kind, TruncateJSPrimitiveToUntaggedOp::InputAssumptions input_assumptions)
V< JSPrimitive > REDUCE ConvertUntaggedToJSPrimitive(V< Untagged > input, ConvertUntaggedToJSPrimitiveOp::JSPrimitiveKind kind, RegisterRepresentation input_rep, ConvertUntaggedToJSPrimitiveOp::InputInterpretation input_interpretation, CheckForMinusZeroMode minus_zero_mode)
std::optional< bool > undetectable_objects_protector_
V< String > StringFromSingleCodePoint(V< Word32 > codepoint, UnicodeEncoding encoding)
V< Word32 > CompareMapAgainstMultipleMaps(V< Map > heap_object_map, const ZoneRefSet< Map > &maps)
V< BigInt > REDUCE BigIntUnary(V< BigInt > input, BigIntUnaryOp::Kind kind)
void MigrateInstanceOrDeopt(V< HeapObject > heap_object, V< Map > heap_object_map, V< FrameState > frame_state, const FeedbackSource &feedback)
V< Boolean > REDUCE BigIntComparison(V< BigInt > left, V< BigInt > right, BigIntComparisonOp::Kind kind)
V< None > REDUCE StoreTypedElement(OpIndex buffer, V< Object > base, V< WordPtr > external, V< WordPtr > index, V< Any > value, ExternalArrayType array_type)
V< Word32 > LoadFromSeqString(V< Object > receiver, V< WordPtr > position, V< Word32 > onebyte)
OpIndex CallBuiltinForBigIntOp(Builtin builtin, std::initializer_list< OpIndex > arguments)
V< Word32 > REDUCE StringAt(V< String > string, V< WordPtr > pos, StringAtOp::Kind kind)
V< Object > REDUCE LoadMessage(V< WordPtr > offset)
V< Object > REDUCE LoadFieldByIndex(V< Object > object, V< Word32 > field_index)
V< HeapNumber > AllocateHeapNumber(V< Float64 > value)
V< Word32 > REDUCE ObjectIsNumericValue(V< Object > input, NumericKind kind, FloatRepresentation input_rep)
void TryMigrateInstanceAndMarkMapAsMigrationTarget(V< HeapObject > heap_object, V< Map > heap_object_map, V< FrameState > frame_state, const FeedbackSource &feedback)
V< None > REDUCE RuntimeAbort(AbortReason reason)
V< Word32 > IsNonZero(V< Word32 > value)
V< Float > REDUCE FloatUnary(V< Float > input, FloatUnaryOp::Kind kind, FloatRepresentation rep)
V< Word32 > ComputeUnseededHash(V< Word32 > value)
V< None > REDUCE CheckEqualsInternalizedString(V< Object > expected, V< Object > value, V< FrameState > frame_state)
V< Float64 > ConvertHeapObjectToFloat64OrDeopt(V< Object > heap_object, V< FrameState > frame_state, ConvertJSPrimitiveToUntaggedOrDeoptOp::JSPrimitiveKind input_kind, const FeedbackSource &feedback)
V< Boolean > REDUCE SameValue(V< Object > left, V< Object > right, SameValueOp::Mode mode)
V< Word32 > REDUCE CompareMaps(V< HeapObject > heap_object, OptionalV< Map > map, const ZoneRefSet< Map > &maps)
V< WordPtr > BuildTypedArrayDataPointer(V< Object > base, V< WordPtr > external)
V< None > REDUCE TransitionElementsKindOrCheckMap(V< HeapObject > object, V< Map > map, V< FrameState > frame_state, const ElementsTransitionWithMultipleSources &transition)
V< Word32 > REDUCE StringLength(V< String > string)
V< Smi > REDUCE ArgumentsLength(ArgumentsLengthOp::Kind kind, int formal_parameter_count)
V< None > REDUCE TransitionAndStoreArrayElement(V< JSArray > array, V< WordPtr > index, OpIndex value, TransitionAndStoreArrayElementOp::Kind kind, MaybeHandle< Map > fast_map, MaybeHandle< Map > double_map)
V< None > REDUCE DeoptimizeIf(V< Word32 > condition, V< FrameState > frame_state, bool negated, const DeoptimizeParameters *parameters)
V< Word32 > LoadSurrogatePairAt(V< String > string, OptionalV< WordPtr > length, V< WordPtr > index, UnicodeEncoding encoding)
V< Object > REDUCE ConvertJSPrimitiveToObject(V< JSPrimitive > value, V< Context > native_context, V< JSGlobalProxy > global_proxy, ConvertReceiverMode mode)
V< None > REDUCE TransitionElementsKind(V< HeapObject > object, const ElementsTransition &transition)
V< Untagged > REDUCE ConvertJSPrimitiveToUntaggedOrDeopt(V< Object > object, V< FrameState > frame_state, ConvertJSPrimitiveToUntaggedOrDeoptOp::JSPrimitiveKind from_kind, ConvertJSPrimitiveToUntaggedOrDeoptOp::UntaggedKind to_kind, CheckForMinusZeroMode minus_zero_mode, const FeedbackSource &feedback)
V< Word > REDUCE TruncateJSPrimitiveToUntaggedOrDeopt(V< JSPrimitive > input, V< FrameState > frame_state, TruncateJSPrimitiveToUntaggedOrDeoptOp::UntaggedKind kind, TruncateJSPrimitiveToUntaggedOrDeoptOp::InputRequirement input_requirement, const FeedbackSource &feedback)
V< Boolean > REDUCE StringComparison(V< String > left, V< String > right, StringComparisonOp::Kind kind)
V< Word32 > REDUCE Float64SameValue(V< Float64 > left, V< Float64 > right)
V< Object > REDUCE NewArgumentsElements(V< Smi > arguments_count, CreateArgumentsType type, int formal_parameter_count)
V< JSPrimitive > REDUCE ConvertUntaggedToJSPrimitiveOrDeopt(V< Untagged > input, V< FrameState > frame_state, ConvertUntaggedToJSPrimitiveOrDeoptOp::JSPrimitiveKind kind, RegisterRepresentation input_rep, ConvertUntaggedToJSPrimitiveOrDeoptOp::InputInterpretation input_interpretation, const FeedbackSource &feedback)
V< Object > REDUCE MaybeGrowFastElements(V< Object > object, V< Object > elements, V< Word32 > index, V< Word32 > elements_length, V< FrameState > frame_state, GrowFastElementsMode mode, const FeedbackSource &feedback)
V< Object > REDUCE CheckedClosure(V< Object > input, V< FrameState > frame_state, Handle< FeedbackCell > feedback_cell)
V< BigInt > AllocateBigInt(V< Word32 > bitfield, V< Word64 > digit)
V< Word > REDUCE WordBinopDeoptOnOverflow(V< Word > left, V< Word > right, V< FrameState > frame_state, WordBinopDeoptOnOverflowOp::Kind kind, WordRepresentation rep, FeedbackSource feedback, CheckForMinusZeroMode mode)
Uninitialized< SeqTwoByteString > AllocateSeqTwoByteString(uint32_t length, AllocationType type)
OpIndex REDUCE FindOrderedHashEntry(V< Object > data_structure, OpIndex key, FindOrderedHashEntryOp::Kind kind)
V< Word32 > REDUCE Word32SignHint(V< Word32 > input, Word32SignHintOp::Sign)
static constexpr MemoryRepresentation AnyTagged()
static constexpr MemoryRepresentation UncompressedTaggedPointer()
static constexpr MemoryRepresentation TaggedSigned()
static constexpr MemoryRepresentation Uint16()
static constexpr MemoryRepresentation TaggedPointer()
static constexpr MemoryRepresentation UintPtr()
static constexpr MemoryRepresentation Uint8()
constexpr bool valid() const
static constexpr RegisterRepresentation Word32()
static constexpr RegisterRepresentation Float64()
static constexpr RegisterRepresentation Word64()
static V< T > Cast(V< U > index)
static constexpr WordRepresentation Word32()
static constexpr WordRepresentation Word64()
#define COMPRESS_POINTERS_BOOL
constexpr int32_t kMinusZeroLoBits
constexpr int64_t kMinusZeroBits
constexpr int32_t kMinusZeroHiBits
#define TURBOSHAFT_REDUCER_BOILERPLATE(Name)
#define LABEL_BLOCK(label)
base::Vector< const DirectHandle< Object > > args
ZoneVector< RpoNumber > & result
constexpr int WhichPowerOfTwo(T value)
constexpr Vector< T > VectorOf(T *start, size_t size)
constexpr Tagged_t kNonJsReceiverMapLimit
V8_INLINE const Operation & Get(const Graph &graph, OpIndex index)
V8_EXPORT_PRIVATE bool ShouldSkipOptimizationStep()
@ kTryMigrateInstanceAndDeopt
template const Signature< wasm::ValueType > bool
TNode< Float64T > Float64Add(TNode< Float64T > a, TNode< Float64T > b)
static const Operator * IntPtrConstant(CommonOperatorBuilder *common, intptr_t value)
ref_traits< T >::ref_type MakeRef(JSHeapBroker *broker, Tagged< T > object)
const uint32_t kStringEncodingMask
bool TryCast(Tagged< From > value, Tagged< To > *out)
constexpr int kTaggedSize
constexpr double kMaxSafeInteger
constexpr intptr_t kObjectAlignment
bool Is(IndirectHandle< U > value)
const uint32_t kTwoByteStringTag
bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind, ElementsKind to_kind)
const uint32_t kUncachedExternalStringTag
bool IsRabGsabTypedArrayElementsKind(ElementsKind kind)
const uint32_t kUncachedExternalStringMask
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
const uint32_t kNotInternalizedTag
constexpr uint64_t kMaxSafeIntegerUint64
constexpr int kSystemPointerSizeLog2
@ SLOW_STRING_WRAPPER_ELEMENTS
@ FAST_STRING_WRAPPER_ELEMENTS
const uint32_t kStringTag
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
bool IsSimpleMapChangeTransition(ElementsKind from_kind, ElementsKind to_kind)
constexpr int kJSArgcReceiverSlots
const uint32_t kOneByteStringTag
constexpr int kSystemPointerSize
constexpr int kAdditiveSafeIntegerBitLength
constexpr int ElementsKindToShiftSize(ElementsKind elements_kind)
constexpr int kTaggedSizeLog2
DONT_OVERRIDE DISABLE_ALLOCATION_SITES HOLEY_ELEMENTS
constexpr bool SmiValuesAre31Bits()
const uint32_t kStringRepresentationMask
DONT_OVERRIDE DISABLE_ALLOCATION_SITES DISABLE_ALLOCATION_SITES HOLEY_DOUBLE_ELEMENTS
constexpr bool SmiValuesAre32Bits()
constexpr uint32_t kHoleNanUpper32
const uint32_t kInternalizedTag
const uint32_t kIsNotInternalizedMask
constexpr int kDoubleSizeLog2
const uint32_t kIsNotStringMask
constexpr int64_t kMinAdditiveSafeInteger
template const char * string
!IsContextMap !IsContextMap native_context
i::Address Load(i::Address address)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
@ kFloat64ToAdditiveSafeInteger
@ kFindOrderedHashMapEntryForInt32Key
@ kFindOrderedHashMapEntry
@ kFindOrderedHashSetEntry
static V8_EXPORT_PRIVATE bool IsSupported(Kind kind, FloatRepresentation rep)
static constexpr Kind TaggedBase()
static constexpr Kind RawAligned()
static constexpr Kind Aligned(BaseTaggedness base_is_tagged)
@ kReceiverOrNullOrUndefined
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)
#define OFFSET_OF_DATA_START(Type)
#define V8_LIKELY(condition)