69 public TorqueGeneratedExportedMacrosAssembler {
100 return TaggedIndexToIntPtr(value);
107 template <
typename TIndex>
111 if (TryToIntPtrConstant(node, out)) {
119 if (TryToIntPtrConstant(node, &constant)) {
126#if defined(BINT_IS_SMI)
128 TNode<IntPtrT> BIntToIntPtr(TNode<BInt> source) {
129 return SmiToIntPtr(source);
131 TNode<BInt> SmiToBInt(TNode<Smi> source) {
return source; }
132 TNode<BInt> IntPtrToBInt(TNode<IntPtrT> source) {
133 return SmiFromIntPtr(source);
135#elif defined(BINT_IS_INTPTR)
136 TNode<Smi> BIntToSmi(TNode<BInt> source) {
return SmiFromIntPtr(source); }
137 TNode<IntPtrT> BIntToIntPtr(TNode<BInt> source) {
return source; }
138 TNode<BInt> SmiToBInt(TNode<Smi> source) {
return SmiToIntPtr(source); }
139 TNode<BInt> IntPtrToBInt(TNode<IntPtrT> source) {
return source; }
141#error Unknown architecture.
144 TNode<IntPtrT> TaggedIndexToIntPtr(TNode<TaggedIndex> value);
145 TNode<TaggedIndex> IntPtrToTaggedIndex(TNode<IntPtrT> value);
147 TNode<Smi> TaggedIndexToSmi(TNode<TaggedIndex> value);
148 TNode<TaggedIndex> SmiToTaggedIndex(TNode<Smi> value);
153 TNode<Smi> NormalizeSmiIndex(TNode<Smi> smi_index);
156 GotoIf(TaggedIsNotSmi(value), fail);
157 return UncheckedCast<Smi>(value);
161 GotoIfNot(TaggedIsPositiveSmi(value), fail);
162 return UncheckedCast<Smi>(value);
168 GotoIf(TaggedIsSmi(value), fail);
169 return UncheckedCast<HeapObject>(value);
173 return UncheckedCast<Uint16T>(Int32Constant(t));
178 GotoIfNot(IsJSDataView(heap_object), fail);
179 return CAST(heap_object);
184 GotoIfNot(IsJSProxy(heap_object), fail);
185 return CAST(heap_object);
190 GotoIfNot(IsJSStringIterator(heap_object), fail);
191 return CAST(heap_object);
196 GotoIfNot(IsCallable(heap_object), fail);
197 return CAST(heap_object);
201 GotoIfNot(IsString(heap_object), fail);
202 return CAST(heap_object);
207 GotoIfNot(IsConstructor(heap_object), fail);
208 return CAST(heap_object);
213 GotoIfNot(IsJSFunctionWithPrototypeSlot(heap_object), fail);
214 return CAST(heap_object);
217 template <
typename T>
222#define PARAMETER_BINOP(OpName, IntPtrOpName, SmiOpName) \
223 TNode<Smi> OpName(TNode<Smi> a, TNode<Smi> b) { return SmiOpName(a, b); } \
224 TNode<IntPtrT> OpName(TNode<IntPtrT> a, TNode<IntPtrT> b) { \
225 return IntPtrOpName(a, b); \
227 TNode<UintPtrT> OpName(TNode<UintPtrT> a, TNode<UintPtrT> b) { \
228 return Unsigned(IntPtrOpName(Signed(a), Signed(b))); \
230 TNode<RawPtrT> OpName(TNode<RawPtrT> a, TNode<RawPtrT> b) { \
231 return ReinterpretCast<RawPtrT>(IntPtrOpName( \
232 ReinterpretCast<IntPtrT>(a), ReinterpretCast<IntPtrT>(b))); \
237#undef PARAMETER_BINOP
239#define PARAMETER_BINOP(OpName, IntPtrOpName, SmiOpName) \
240 TNode<BoolT> OpName(TNode<Smi> a, TNode<Smi> b) { return SmiOpName(a, b); } \
241 TNode<BoolT> OpName(TNode<IntPtrT> a, TNode<IntPtrT> b) { \
242 return IntPtrOpName(a, b); \
246 TNode<BoolT> OpName(TNode<UintPtrT> a, TNode<UintPtrT> b) { UNREACHABLE(); } \
247 TNode<BoolT> OpName(TNode<RawPtrT> a, TNode<RawPtrT> b) { UNREACHABLE(); }
254 PARAMETER_BINOP(IntPtrOrSmiGreaterThan, IntPtrGreaterThan, SmiGreaterThan)
255#undef PARAMETER_BINOP
257#define PARAMETER_BINOP(OpName, UintPtrOpName, SmiOpName) \
258 TNode<BoolT> OpName(TNode<Smi> a, TNode<Smi> b) { return SmiOpName(a, b); } \
259 TNode<BoolT> OpName(TNode<IntPtrT> a, TNode<IntPtrT> b) { \
260 return UintPtrOpName(Unsigned(a), Unsigned(b)); \
262 TNode<BoolT> OpName(TNode<UintPtrT> a, TNode<UintPtrT> b) { \
263 return UintPtrOpName(a, b); \
265 TNode<BoolT> OpName(TNode<RawPtrT> a, TNode<RawPtrT> b) { \
266 return UintPtrOpName(a, b); \
277#undef PARAMETER_BINOP
279 uintptr_t ConstexprUintPtrShl(uintptr_t a, int32_t b) {
return a <<
b; }
288 return Word32Equal(ReinterpretCast<Word32T>(a),
289 ReinterpretCast<Word32T>(b));
291 return WordEqual(ReinterpretCast<WordT>(a), ReinterpretCast<WordT>(b));
296 return Word32BinaryNot(TaggedEqual(a, b));
305#if V8_TARGET_ARCH_ARM64
306 return UniqueIntPtrConstant(16);
312#define HEAP_CONSTANT_ACCESSOR(rootIndexName, rootAccessorName, name) \
313 TNode<RemoveTagged< \
314 decltype(std::declval<ReadOnlyRoots>().rootAccessorName())>::type> \
317#undef HEAP_CONSTANT_ACCESSOR
319#define HEAP_CONSTANT_ACCESSOR(rootIndexName, rootAccessorName, name) \
320 TNode<RemoveTagged<decltype(std::declval<Heap>().rootAccessorName())>::type> \
323#undef HEAP_CONSTANT_ACCESSOR
325#define HEAP_CONSTANT_TEST(rootIndexName, rootAccessorName, name) \
326 TNode<BoolT> Is##name(TNode<Object> value); \
327 TNode<BoolT> IsNot##name(TNode<Object> value);
329#undef HEAP_CONSTANT_TEST
331 TNode<BInt> BIntConstant(
int value);
333 template <
typename TIndex>
336 bool TryGetIntPtrOrSmiConstantValue(
TNode<Smi> maybe_constant,
int* value);
337 bool TryGetIntPtrOrSmiConstantValue(
TNode<IntPtrT> maybe_constant,
358 double max_relative_error = 0.0000001);
390#define SMI_ARITHMETIC_BINOP(SmiOpName, IntPtrOpName, Int32OpName) \
391 TNode<Smi> SmiOpName(TNode<Smi> a, TNode<Smi> b) { \
392 if (SmiValuesAre32Bits()) { \
393 return BitcastWordToTaggedSigned( \
394 IntPtrOpName(BitcastTaggedToWordForTagAndSmiBits(a), \
395 BitcastTaggedToWordForTagAndSmiBits(b))); \
397 DCHECK(SmiValuesAre31Bits()); \
398 return BitcastWordToTaggedSigned(ChangeInt32ToIntPtr(Int32OpName( \
399 TruncateIntPtrToInt32(BitcastTaggedToWordForTagAndSmiBits(a)), \
400 TruncateIntPtrToInt32(BitcastTaggedToWordForTagAndSmiBits(b))))); \
408#undef SMI_ARITHMETIC_BINOP
410 TNode<IntPtrT> TryIntPtrAdd(TNode<IntPtrT> a, TNode<IntPtrT> b,
412 TNode<IntPtrT> TryIntPtrSub(TNode<IntPtrT> a, TNode<IntPtrT> b,
414 TNode<IntPtrT> TryIntPtrMul(TNode<IntPtrT> a, TNode<IntPtrT> b,
416 TNode<IntPtrT> TryIntPtrDiv(TNode<IntPtrT> a, TNode<IntPtrT> b,
418 TNode<IntPtrT> TryIntPtrMod(TNode<IntPtrT> a, TNode<IntPtrT> b,
420 TNode<Int32T> TryInt32Mul(TNode<Int32T> a, TNode<Int32T> b,
422 TNode<Smi> TrySmiAdd(TNode<Smi> a, TNode<Smi> b, Label* if_overflow);
423 TNode<Smi> TrySmiSub(TNode<Smi> a, TNode<Smi> b, Label* if_overflow);
424 TNode<Smi> TrySmiAbs(TNode<Smi> a, Label* if_overflow);
428 return BitcastWordToTaggedSigned(
429 WordShl(BitcastTaggedToWordForTagAndSmiBits(a), shift));
432 return BitcastWordToTaggedSigned(ChangeInt32ToIntPtr(Word32Shl(
433 TruncateIntPtrToInt32(BitcastTaggedToWordForTagAndSmiBits(a)),
434 Int32Constant(shift))));
443 this, TaggedEqual(
result, BitwiseOp(SmiToInt32(a), Int32Constant(shift),
444 Operation::kShiftLeft)));
451 result = BitcastWordToTaggedSigned(
452 WordAnd(WordShr(BitcastTaggedToWordForTagAndSmiBits(a), shift),
453 BitcastTaggedToWordForTagAndSmiBits(SmiConstant(-1))));
458 result = BitcastWordToTaggedSigned(WordAnd(
459 ChangeInt32ToIntPtr(Word32Shr(
460 TruncateWordToInt32(BitcastTaggedToWordForTagAndSmiBits(a)),
462 BitcastTaggedToWordForTagAndSmiBits(SmiConstant(-1))));
467 this, TaggedEqual(
result, BitwiseOp(SmiToInt32(a), Int32Constant(shift),
468 Operation::kShiftRightLogical)));
477 return BitcastWordToTaggedSigned(
478 WordAnd(WordSar(BitcastTaggedToWordForTagAndSmiBits(a), shift),
479 BitcastTaggedToWordForTagAndSmiBits(SmiConstant(-1))));
484 return BitcastWordToTaggedSigned(WordAnd(
485 ChangeInt32ToIntPtr(Word32Sar(
486 TruncateWordToInt32(BitcastTaggedToWordForTagAndSmiBits(a)),
488 BitcastTaggedToWordForTagAndSmiBits(SmiConstant(-1))));
495 return WordShr(a, shift);
498#define SMI_COMPARISON_OP(SmiOpName, IntPtrOpName, Int32OpName) \
499 TNode<BoolT> SmiOpName(TNode<Smi> a, TNode<Smi> b) { \
500 if (kTaggedSize == kInt64Size) { \
501 return IntPtrOpName(BitcastTaggedToWordForTagAndSmiBits(a), \
502 BitcastTaggedToWordForTagAndSmiBits(b)); \
504 DCHECK_EQ(kTaggedSize, kInt32Size); \
505 DCHECK(SmiValuesAre31Bits()); \
506 return Int32OpName( \
507 TruncateIntPtrToInt32(BitcastTaggedToWordForTagAndSmiBits(a)), \
508 TruncateIntPtrToInt32(BitcastTaggedToWordForTagAndSmiBits(b))); \
515 Uint32GreaterThanOrEqual)
518 Uint32LessThanOrEqual)
521 Int32LessThanOrEqual)
524 Int32GreaterThanOrEqual)
525#undef SMI_COMPARISON_OP
547#define BINT_COMPARISON_OP(BIntOpName, SmiOpName, IntPtrOpName) \
548 TNode<BoolT> BIntOpName(TNode<BInt> a, TNode<BInt> b) { \
549 return SmiOpName(a, b); \
552#define BINT_COMPARISON_OP(BIntOpName, SmiOpName, IntPtrOpName) \
553 TNode<BoolT> BIntOpName(TNode<BInt> a, TNode<BInt> b) { \
554 return IntPtrOpName(a, b); \
561 UintPtrGreaterThanOrEqual)
565 IntPtrLessThanOrEqual)
568 IntPtrGreaterThanOrEqual)
569#undef BINT_COMPARISON_OP
607 template <
typename T>
609 using ExtraNode = std::pair<TNode<Object>,
const char*>;
612 const char* file,
int line,
613 std::initializer_list<ExtraNode> extra_nodes = {},
615 void Dcheck(
const NodeGenerator<BoolT>& condition_body,
const char* message,
616 const char* file,
int line,
617 std::initializer_list<ExtraNode> extra_nodes = {},
619 void Dcheck(TNode<Word32T> condition_node,
const char* message,
620 const char* file,
int line,
621 std::initializer_list<ExtraNode> extra_nodes = {},
622 const SourceLocation& loc = SourceLocation::Current());
623 void Check(
const BranchGenerator& branch,
const char* message,
624 const char* file,
int line,
625 std::initializer_list<ExtraNode> extra_nodes = {},
627 void Check(
const NodeGenerator<BoolT>& condition_body,
const char* message,
628 const char* file,
int line,
629 std::initializer_list<ExtraNode> extra_nodes = {},
631 void Check(TNode<Word32T> condition_node,
const char* message,
632 const char* file,
int line,
633 std::initializer_list<ExtraNode> extra_nodes = {},
635 void FailAssert(
const char* message,
636 const std::vector<FileAndLine>& files_and_lines,
637 std::initializer_list<ExtraNode> extra_nodes = {},
642 TNode<RawPtrT> LoadCodeInstructionStart(TNode<Code> code,
643 CodeEntrypointTag tag);
644 TNode<BoolT> IsMarkedForDeoptimization(TNode<Code> code);
646 void DCheckReceiver(ConvertReceiverMode mode, TNode<JSAny>
receiver);
651 template <
typename TCallable,
class... TArgs>
652 inline TNode<JSAny> Call(TNode<Context> context, TNode<TCallable> callable,
653 ConvertReceiverMode mode, TNode<JSAny>
receiver,
655 template <
typename TCallable,
class... TArgs>
656 inline TNode<JSAny> Call(TNode<Context> context, TNode<TCallable> callable,
658 template <
typename TCallable,
class... TArgs>
659 inline TNode<JSAny> Call(TNode<Context> context, TNode<TCallable> callable,
661 template <
class... TArgs>
662 inline TNode<JSAny> CallFunction(TNode<Context> context,
663 TNode<JSFunction> callable,
664 ConvertReceiverMode mode,
666 template <
class... TArgs>
667 inline TNode<JSAny> CallFunction(TNode<Context> context,
668 TNode<JSFunction> callable,
670 template <
class... TArgs>
671 inline TNode<JSAny> CallFunction(TNode<Context> context,
672 TNode<JSFunction> callable,
693 template <
class... TArgs>
698 return CAST(ConstructJS(Builtin::kConstruct, context, target,
new_target,
701 template <
class... TArgs>
707 template <
typename T>
712 Label vtrue(
this), vfalse(
this),
end(
this);
713 Branch(
condition, &vtrue, &vfalse, branch_hint);
722 value = false_body();
727 return value.value();
734 condition, [=] {
return true_value; }, [=] {
return false_value; });
746 return SelectSmiConstant(
condition, Smi::FromInt(true_value), false_value);
750 return SelectSmiConstant(
condition, true_value, Smi::FromInt(false_value));
754 return SelectSmiConstant(
condition, Smi::FromInt(true_value),
755 Smi::FromInt(false_value));
760 DCHECK_LE(single_char[0], String::kMaxOneByteCharCode);
761 return HeapConstantNoHole(
762 isolate()->factory()->LookupSingleCharacterStringFromCode(
784 template <
typename U>
788 if (lower_limit == 0) {
789 return Uint32LessThanOrEqual(value, Int32Constant(higher_limit));
791 return Uint32LessThanOrEqual(Int32Sub(value, Int32Constant(lower_limit)),
792 Int32Constant(higher_limit - lower_limit));
797 CSA_DCHECK(
this, UintPtrLessThanOrEqual(lower_limit, higher_limit));
798 return UintPtrLessThanOrEqual(UintPtrSub(value, lower_limit),
799 UintPtrSub(higher_limit, lower_limit));
803 intptr_t higher_limit) {
805 if (lower_limit == 0) {
806 return UintPtrLessThanOrEqual(value, IntPtrConstant(higher_limit));
808 return UintPtrLessThanOrEqual(IntPtrSub(value, IntPtrConstant(lower_limit)),
809 IntPtrConstant(higher_limit - lower_limit));
817 template <
class... T>
820 CodeAssembler::Bind(
label, phis...);
825 Branch(SmiEqual(a, b), if_true, if_false);
830 Branch(SmiLessThan(a, b), if_true, if_false);
835 Branch(SmiLessThanOrEqual(a, b), if_true, if_false);
840 Branch(Float64Equal(value, value), if_false, if_true);
852 BranchIfToBooleanIsTrue(value, if_true, if_false);
863 void GotoIfForceSlowPath(
Label* if_true);
872 return LoadSandboxedPointerFromObject(
object, IntPtrConstant(
offset));
881 StoreSandboxedPointerToObject(
object, IntPtrConstant(
offset), pointer);
897 return LoadBoundedSizeFromObject(
object, IntPtrConstant(
offset));
906 StoreBoundedSizeToObject(
object, IntPtrConstant(
offset), value);
920 return LoadExternalPointerFromObject(
object, IntPtrConstant(
offset),
932 StoreExternalPointerToObject(
object, IntPtrConstant(
offset), pointer, tag);
952#ifdef V8_ENABLE_SANDBOX
985 return LoadCodeEntrypointViaCodePointerField(
object, IntPtrConstant(
offset),
988 TNode<RawPtrT> LoadCodeEntrypointViaCodePointerField(TNode<HeapObject>
object,
990 CodeEntrypointTag tag);
991 TNode<RawPtrT> LoadCodeEntryFromIndirectPointerHandle(
992 TNode<IndirectPointerHandleT> handle, CodeEntrypointTag tag);
997 TNode<RawPtrT> LoadCodePointerTableBase();
1001 TNode<JSDispatchHandleT> InvalidDispatchHandleConstant();
1005 return CAST(LoadProtectedPointerFromObject(
1010 return CAST(LoadProtectedPointerFromObject(
1016 return LoadExternalPointerFromObject(
object, Foreign::kForeignAddressOffset,
1022 return LoadExternalPointerFromObject(
1023 object, FunctionTemplateInfo::kMaybeRedirectedCallbackOffset,
1028 return LoadExternalPointerFromObject(
object,
1038 Word32And(LoadInstanceType(
object),
1041 return LoadExternalPointerFromObject(
1047 return ReinterpretCast<RawPtr<Uint64T>>(
1048 ExternalConstant(ExternalReference::address_of_log10_offset_table()));
1051#if V8_ENABLE_WEBASSEMBLY
1055 return LoadProtectedPointerField(
1056 import_data, WasmImportData::kProtectedInstanceDataOffset);
1060 TNode<Union<WasmImportData, WasmTrustedInstanceData>>
1061 LoadImplicitArgFromWasmInternalFunction(TNode<WasmInternalFunction>
object) {
1062 TNode<Object> obj = LoadProtectedPointerField(
1063 object, WasmInternalFunction::kProtectedImplicitArgOffset);
1065 TNode<HeapObject> implicit_arg =
CAST(obj);
1068 Word32Or(HasInstanceType(implicit_arg, WASM_TRUSTED_INSTANCE_DATA_TYPE),
1069 HasInstanceType(implicit_arg, WASM_IMPORT_DATA_TYPE)));
1070 return CAST(implicit_arg);
1073 TNode<WasmInternalFunction> LoadWasmInternalFunctionFromFuncRef(
1074 TNode<WasmFuncRef> func_ref) {
1075 return CAST(LoadTrustedPointerFromObject(
1076 func_ref, WasmFuncRef::kTrustedInternalOffset,
1077 kWasmInternalFunctionIndirectPointerTag));
1080 TNode<WasmInternalFunction> LoadWasmInternalFunctionFromFunctionData(
1081 TNode<WasmFunctionData> data) {
1082 return CAST(LoadProtectedPointerField(
1083 data, WasmFunctionData::kProtectedInternalOffset));
1086 TNode<WasmTrustedInstanceData>
1087 LoadWasmTrustedInstanceDataFromWasmExportedFunctionData(
1088 TNode<WasmExportedFunctionData> data) {
1089 return CAST(LoadProtectedPointerField(
1090 data, WasmExportedFunctionData::kProtectedInstanceDataOffset));
1094 TNode<RawPtrT> AllocateBuffer(TNode<IntPtrT> size);
1099 return LoadSandboxedPointerFromObject(holder,
1100 JSTypedArray::kExternalPointerOffset);
1105 StoreSandboxedPointerToObject(holder, JSTypedArray::kExternalPointerOffset,
1111 auto zero_constant =
1112#ifdef V8_COMPRESS_POINTERS
1117 StoreObjectFieldNoWriteBarrier(
1118 holder, JSAPIObjectWithEmbedderSlots::kCppHeapWrappableOffset,
1127 return LoadFullTagged(buffer, IntPtrConstant(
offset));
1129 template <
typename T>
1131 return UncheckedCast<T>(
1135 return LoadBufferData<RawPtrT>(buffer,
offset);
1138 return CAST(LoadBufferObject(buffer,
offset));
1141 return LoadBufferData<IntPtrT>(buffer,
offset);
1147 template <
typename T>
1151 if constexpr (is_subtype_v<T, UntaggedT>) {
1153 return UncheckedCast<T>(LoadFromObject(machine_type,
object, raw_offset));
1155 static_assert(is_subtype_v<T, Object>);
1157 if constexpr (is_subtype_v<T, Map>) {
1159 if (
offset == HeapObject::kMapOffset) {
1160 machine_type = MachineType::MapInHeader();
1163 return CAST(LoadFromObject(machine_type,
object, raw_offset));
1167 return UncheckedCast<Object>(
1168 LoadFromObject(MachineType::AnyTagged(),
object,
1173 return UncheckedCast<Object>(
1174 LoadFromObject(MachineType::AnyTagged(),
object,
1181 return UncheckedCast<T>(
1194 return UncheckedCast<MaybeObject>(LoadObjectField(
object,
offset));
1198 return LoadObjectField(map,
1199 Map::kConstructorOrBackPointerOrNativeContextOffset);
1203 return Load<Simd128T>(ptr);
1220 return std::make_tuple(
object,
offset);
1228 if (IsMapOffsetConstant(reference.offset)) {
1230 DCHECK((std::is_base_of<T, Map>::value));
1231 return ReinterpretCast<T>(map);
1236 CSA_DCHECK(
this, TaggedIsNotSmi(reference.object));
1245 DCHECK(!IsMapOffsetConstant(reference.offset));
1248 return UncheckedCast<T>(
1255 if (IsMapOffsetConstant(reference.offset)) {
1256 DCHECK((std::is_base_of<T, Map>::value));
1257 return StoreMap(
CAST(reference.object), ReinterpretCast<Map>(value));
1261 if (std::is_same_v<T, Smi>) {
1262 write_barrier = StoreToObjectWriteBarrier::kNone;
1263 }
else if (std::is_same_v<T, Map>) {
1264 write_barrier = StoreToObjectWriteBarrier::kMap;
1268 CSA_DCHECK(
this, TaggedIsNotSmi(reference.object));
1269 StoreToObject(rep, reference.object,
offset, value, write_barrier);
1275 DCHECK(!IsMapOffsetConstant(reference.offset));
1279 value, StoreToObjectWriteBarrier::kNone);
1284 return ReinterpretCast<RawPtrT>(
1285 IntPtrAdd(BitcastTaggedToWord(
object),
1310 bool skip_empty_check =
false);
1313 return LoadJSObjectElements(
object);
1322 template <
typename Array>
1324 return LoadObjectField<Smi>(array, offsetof(
Array,
length_));
1378 Label* if_no_hash =
nullptr);
1392 Label* if_hash_not_computed =
nullptr);
1423 Label* if_not_strong);
1425 Label* if_not_strong);
1431 return Word32BinaryNot(IsCleared(value));
1454 int additional_offset);
1456 int additional_offset) {
1457 FixedArrayBoundsCheck(UncheckedCast<FixedArrayBase>(array), index,
1462 int additional_offset);
1464 int additional_offset) {
1465 FixedArrayBoundsCheck(UncheckedCast<FixedArrayBase>(array), index,
1470 int additional_offset) {
1471 FixedArrayBoundsCheck(array, Signed(index), additional_offset);
1477 int additional_offset) {
1478 FixedArrayBoundsCheck(UncheckedCast<FixedArrayBase>(array), index,
1484 template <
typename Array>
1489 template <
typename Array,
typename TIndex,
typename TValue = MaybeObject>
1492 int additional_offset = 0);
1493 template <
typename Array,
typename TIndex>
1496 return LoadArrayElement<Array, TIndex, typename Array::Shape::ElementT>(
1500 template <
typename TIndex>
1509 int additional_offset = 0) {
1510 return LoadFixedArrayElement(
object, index, additional_offset,
1511 CheckBounds::kDebugOnly);
1515 int additional_offset = 0) {
1516 return LoadFixedArrayElement(
object, IntPtrConstant(index),
1522 int additional_offset = 0) {
1523 return LoadFixedArrayElement(
object, IntPtrConstant(index),
1524 additional_offset, CheckBounds::kDebugOnly);
1534 template <
typename Array>
1536 int array_header_size,
1538 int additional_offset = 0);
1543 int additional_offset = 0);
1548 int additional_offset = 0);
1553 Label* if_hole =
nullptr,
1554 MachineType machine_type = MachineType::Float64());
1555#ifdef V8_ENABLE_EXPERIMENTAL_UNDEFINED_DOUBLE
1572 template <
typename TIndex>
1575 int additional_offset = 0);
1580 Label* if_hole =
nullptr);
1583#ifdef V8_ENABLE_EXPERIMENTAL_UNDEFINED_DOUBLE
1592 MachineType machine_type = MachineType::Float64());
1593#ifdef V8_ENABLE_EXPERIMENTAL_UNDEFINED_DOUBLE
1623 void StoreContextElementNoWriteBarrier(
TNode<Context> context,
int slot_index,
1633 int slot_index,
Label* if_equal) {
1634 GotoIf(TaggedEqual(value, LoadContextElement(
native_context, slot_index)),
1640 TNode<Map> LoadSlowObjectWithNullPrototypeMap(
1677#ifdef V8_ENABLE_WEBASSEMBLY
1688 TNode<Int32T> LoadBytecodeArrayParameterCountWithoutReceiver(
1714 void StoreIndirectPointerFieldNoWriteBarrier(
1724 void StoreTrustedPointerFieldNoWriteBarrier(
1735 StoreTrustedPointerField(
object,
offset, kCodeIndirectPointerTag, value);
1739 StoreTrustedPointerFieldNoWriteBarrier(
object,
offset,
1740 kCodeIndirectPointerTag, value);
1747 if (TryToInt32Constant(
offset, &const_offset)) {
1748 return StoreObjectFieldNoWriteBarrier<T>(
object, const_offset, value);
1781 CheckBounds check_bounds = CheckBounds::kAlways) {
1782 return StoreFixedArrayElement(
object, IntPtrConstant(index), value,
1783 barrier_mode, 0, check_bounds);
1788 CheckBounds check_bounds = CheckBounds::kAlways) {
1789 return StoreFixedArrayElement(
object, IntPtrConstant(index),
1794 template <
typename TIndex>
1798 int additional_offset = 0,
1799 CheckBounds check_bounds = CheckBounds::kAlways) {
1801 static_assert(std::is_same<TIndex, Smi>::value ||
1802 std::is_same<TIndex, UintPtrT>::value ||
1803 std::is_same<TIndex, IntPtrT>::value,
1804 "Only Smi, UintPtrT or IntPtrT index is allowed");
1806 FixedArrayBoundsCheck(array, index, additional_offset);
1808 StoreFixedArrayOrPropertyArrayElement(array, index, value, barrier_mode,
1812 template <
typename TIndex>
1814 TNode<Smi> value,
int additional_offset = 0) {
1815 static_assert(std::is_same<TIndex, Smi>::value ||
1816 std::is_same<TIndex, IntPtrT>::value,
1817 "Only Smi or IntPtrT indeces is allowed");
1827 return StoreFixedArrayElement(
object, IntPtrConstant(index), value,
1828 barrier_mode, 0, CheckBounds::kDebugOnly);
1830 template <
typename Array>
1841 int offset = Array::OffsetOfElementAt(index);
1843 UnsafeStoreObjectFieldNoWriteBarrier(
object,
offset, value);
1845 StoreObjectFieldNoWriteBarrier(
object,
offset, value);
1847 StoreObjectField(
object,
offset, value);
1852 template <
typename Array>
1865 StoreObjectFieldNoWriteBarrier(
object,
offset, value);
1867 StoreObjectField(
object,
offset, value);
1875 return StoreFixedArrayElement(
object, IntPtrConstant(index), value,
1877 CheckBounds::kDebugOnly);
1883 int additional_offset = 0) {
1884 return StoreFixedArrayElement(array, index, value, barrier_mode,
1885 additional_offset, CheckBounds::kDebugOnly);
1890 int additional_offset) {
1891 return StoreFixedArrayElement(array, index, value,
1893 CheckBounds::kDebugOnly);
1898 StoreFixedArrayOrPropertyArrayElement(array, index, value,
1902 template <
typename TIndex>
1903 void StoreFixedDoubleArrayElement(
1908#ifdef V8_ENABLE_EXPERIMENTAL_UNDEFINED_DOUBLE
1913#ifdef V8_ENABLE_EXPERIMENTAL_UNDEFINED_DOUBLE
1917 void StoreFeedbackVectorSlot(
1921 int additional_offset = 0);
1929 StoreFixedArrayOrPropertyArrayElement(array, index, value);
1974 return AllocateHeapNumberWithValue(Float64Constant(value));
1984 void StoreBigIntDigit(
TNode<BigInt> bigint, intptr_t digit_index,
2005 using TorqueGeneratedExportedMacrosAssembler::AllocateSeqOneByteString;
2010 using TorqueGeneratedExportedMacrosAssembler::AllocateSeqTwoByteString;
2039 Label* large_object_fallback);
2057 SlackTrackingMode slack_tracking_mode = kNoSlackTracking);
2059 void InitializeJSObjectFromMap(
2063 SlackTrackingMode slack_tracking_mode = kNoSlackTracking);
2068 void InitializeJSObjectBodyNoSlackTracking(
2070 int start_offset = JSObject::kHeaderSize);
2078 AllocateUninitializedJSArrayWithElements(
2083 int array_header_size = JSArray::kHeaderSize);
2094 return AllocateJSArray(
kind, array_map, PositiveSmiUntag(capacity), length,
2095 allocation_site, allocation_flags);
2101 return AllocateJSArray(
kind, array_map, PositiveSmiUntag(capacity), length,
2102 std::nullopt, allocation_flags);
2108 return AllocateJSArray(
kind, array_map, capacity, length, std::nullopt,
2116 int array_header_size = JSArray::kHeaderSize);
2132 HoleConversionMode convert_holes = HoleConversionMode::kDontConvert);
2138 template <
typename TIndex>
2142 std::optional<
TNode<Map>> fixed_array_map = std::nullopt);
2144 template <
typename Function>
2147 const Function& materialize_target,
2148 bool target_is_new);
2161 Label* found_default_base_ctor,
2162 Label* found_something_else);
2167 return UncheckedCast<FixedArray>(AllocateFixedArray(
2182 FillEntireFixedDoubleArrayWithZero(
result, capacity);
2191 capacity, RootIndex::kTheHoleValue);
2200 capacity, RootIndex::kTheHoleValue);
2225 template <
typename TIndex>
2229 template <
typename TIndex>
2233 FillFixedArrayWithValue(
kind, UncheckedCast<FixedArrayBase>(array),
2234 from_index, to_index, value_root_index);
2244 WordEqual(length, LoadAndUntagFixedArrayBaseLength(array)));
2245 FillFixedArrayWithSmiZero(
kind, array, IntPtrConstant(0), length);
2254 WordEqual(length, LoadAndUntagFixedArrayBaseLength(array)));
2255 FillFixedDoubleArrayWithZero(array, IntPtrConstant(0), length);
2280 DestroySource destroy_source);
2284 template <
typename TIndex>
2290 IntPtrOrSmiConstant<TIndex>(0), length, length,
2297 template <
typename TIndex>
2303 CopyFixedArrayElements(from_kind, from_array, to_kind,
to_array,
2304 IntPtrOrSmiConstant<TIndex>(0), element_count,
2305 capacity, barrier_mode);
2316 template <
typename TIndex>
2317 void CopyFixedArrayElements(
2323 HoleConversionMode convert_holes = HoleConversionMode::kDontConvert,
2359 GotoIf(TaggedNotEqual(LoadMap(
base), FixedDoubleArrayMapConstant()),
2361 return UncheckedCast<FixedDoubleArray>(
base);
2375 template <
typename T>
2380 template <
typename T>
2388 kFixedDoubleArrays = 2,
2390 kAllFixedArrays = kFixedArrays | kFixedDoubleArrays,
2391 kAllFixedArraysDontCopyCOW = kAllFixedArrays | kDontCopyCOW
2424 template <
typename TIndex>
2430 ExtractFixedArrayFlag::kAllFixedArrays,
2432 std::optional<
TNode<Int32T>> source_elements_kind = std::nullopt);
2459 template <
typename TIndex>
2466 std::optional<
TNode<Int32T>> source_runtime_kind = std::nullopt);
2484 template <
typename TIndex>
2505 ExtractFixedArrayFlag::kAllFixedArraysDontCopyCOW);
2511 template <
typename TResult>
2518 template <
typename TIndex>
2531 template <
typename TIndex>
2540 template <
typename TIndex>
2560 Label* if_not_possible);
2562#ifdef V8_ENABLE_EXPERIMENTAL_UNDEFINED_DOUBLE
2563 Label* if_valueisundefined,
2565 Label* if_valueisnotnumber);
2586 void TaggedPointerToWord32OrBigIntWithFeedback(
2667 char const* method_name) {
2668 return ToThisString(context, value, StringConstant(method_name));
2676 char const* method_name);
2682 char const* method_name);
2686 const char* method_name);
2688 const char* method_name);
2695 char const* arg0 =
nullptr,
char const* arg1 =
nullptr);
2708 void SetContinuationPreservedEmbedderData(
TNode<Object> value);
2867 TNode<BoolT> IsIsConcatSpreadableProtectorCellInvalid();
2868 TNode<BoolT> IsTypedArraySpeciesProtectorCellInvalid();
2871 TNode<BoolT> IsNumberStringNotRegexpLikeProtectorCellInvalid();
2874 void InvalidateStringWrapperToPrimitiveProtector();
2880 Load(MachineType::Uint8(), ExternalConstant(address_of_flag)));
2881 return Word32NotEqual(Word32And(flag_value, Int32Constant(0xFF)),
2886 return LoadRuntimeFlag(
2887 ExternalReference::address_of_mock_arraybuffer_allocator_flag());
2891 return LoadRuntimeFlag(
2892 ExternalReference::address_of_builtin_subclassing_flag());
2896 return LoadRuntimeFlag(
2897 ExternalReference::address_of_shared_string_table_flag());
2901 return LoadRuntimeFlag(
2902 ExternalReference::script_context_mutable_heap_number_flag());
2906#ifdef SUPPORT_SCRIPT_CONTEXT_MUTABLE_HEAP_INT32
2907 return LoadRuntimeFlag(
2908 ExternalReference::script_context_mutable_heap_int32_flag());
2910 return BoolConstant(
false);
2916 return LoadRuntimeFlag(
2917 ExternalReference::additive_safe_int_feedback_flag());
2919 return BoolConstant(
false);
2950 template <
typename TIndex>
2956 return Word32Equal(a, b);
2967 TNode<BoolT> IsFastOrNonExtensibleOrSealedElementsKind(
2991 return IsInRange(target_kind, lower_reference_kind, higher_reference_kind);
3012 BigIntHandling bigint_handling = BigIntHandling::kThrow);
3022 BigIntHandling bigint_handling = BigIntHandling::kThrow);
3027 BigIntHandling bigint_handling = BigIntHandling::kThrow);
3046 CSA_DCHECK(
this, Int32GreaterThanOrEqual(input, Int32Constant(0)));
3047 return Signed(ChangeUint32ToWord(input));
3068 template <
typename BitField>
3070 return DecodeWord32(word32, BitField::kShift, BitField::kMask);
3075 template <
typename BitField>
3077 return DecodeWord(word, BitField::kShift, BitField::kMask);
3082 template <
typename BitField>
3084 return DecodeWord<BitField>(ChangeUint32ToWord(word32));
3089 template <
typename BitField>
3091 return UncheckedCast<Uint32T>(
3092 TruncateIntPtrToInt32(Signed(DecodeWord<BitField>(word))));
3103 template <
typename BitField>
3105 bool starts_as_zero =
false) {
3106 return UpdateWord32(word, value, BitField::kShift, BitField::kMask,
3111 template <
typename BitField>
3113 bool starts_as_zero =
false) {
3114 return UpdateWord(word, value, BitField::kShift, BitField::kMask,
3119 template <
typename BitField>
3121 bool starts_as_zero =
false) {
3122 return UncheckedCast<Uint32T>(
3123 TruncateIntPtrToInt32(Signed(UpdateWord<BitField>(
3124 ChangeUint32ToWord(word), value, starts_as_zero))));
3128 template <
typename BitField>
3130 bool starts_as_zero =
false) {
3131 return UpdateWord<BitField>(word, ChangeUint32ToWord(value),
3138 uint32_t shift, uint32_t
mask,
3139 bool starts_as_zero =
false);
3144 uint32_t shift, uintptr_t
mask,
3145 bool starts_as_zero =
false);
3148 template <
typename T>
3150 return IsSetWord32(word32, T::kMask);
3154 template <
typename T>
3156 return IsNotSetWord32(word32, T::kMask);
3161 return Word32NotEqual(Word32And(word32, Int32Constant(
mask)),
3167 return Word32Equal(Word32And(word32, Int32Constant(
mask)),
3174 return Word32Equal(Word32And(word32, const_mask), const_mask);
3179 template <
typename BitField>
3181 typename BitField::FieldType value) {
3183 Word32And(word32, Int32Constant(BitField::kMask));
3184 return Word32Equal(masked_word32, Int32Constant(BitField::encode(value)));
3188 template <
typename BitField1,
typename BitField2>
3190 typename BitField1::FieldType value1,
3191 typename BitField2::FieldType value2) {
3192 static_assert((BitField1::kMask & BitField2::kMask) == 0);
3194 Word32And(word32, Int32Constant(BitField1::kMask | BitField2::kMask));
3196 Int32Constant(BitField1::encode(value1) | BitField2::encode(value2));
3197 return Word32Equal(combined_masked_word32, combined_value);
3202 template <
typename BitField>
3204 typename BitField::FieldType value) {
3205 return Word32BinaryNot(IsEqualInWord32<BitField>(word32, value));
3209 template <
typename T>
3211 return IsSetWord(word, T::kMask);
3216 return WordNotEqual(WordAnd(word, IntPtrConstant(
mask)), IntPtrConstant(0));
3222 intptr_t mask_word = base::bit_cast<intptr_t>(Smi::FromInt(untagged_mask));
3223 return WordNotEqual(WordAnd(BitcastTaggedToWordForTagAndSmiBits(smi),
3224 IntPtrConstant(mask_word)),
3229 template <
typename T>
3231 return IsClearWord32(word32, T::kMask);
3236 return Word32Equal(Word32And(word32, Int32Constant(
mask)),
3241 template <
typename T>
3243 return IsClearWord(word, T::kMask);
3248 return IntPtrEqual(WordAnd(word, IntPtrConstant(
mask)), IntPtrConstant(0));
3252 void IncrementCounter(
StatsCounter* counter,
int delta);
3253 void DecrementCounter(
StatsCounter* counter,
int delta);
3255 template <
typename TIndex>
3258 template <
typename TIndex>
3260 Increment(variable, -value);
3277 Label* if_notinternalized =
nullptr);
3305 Label* if_internalized,
3307 Label* if_not_internalized,
Label* if_bailout);
3311 template <
typename Dictionary>
3313 template <
typename Dictionary>
3315 return EntryToIndex<Dictionary>(entry, Dictionary::kEntryKeyIndex);
3320 template <
class ContainerType>
3326 template <
class ContainerType>
3332 template <
class ContainerType>
3337 template <
class ContainerType>
3338 void StoreValueByKeyIndex(
3349 template <
class Dictionary>
3354 return GetNumberOfElements<NumberDictionary>(dictionary);
3357 template <
class Dictionary>
3361 static_assert(!(std::is_same<Dictionary, SwissNameDictionary>::value));
3363 StoreFixedArrayElement(dictionary, Dictionary::kNumberOfElementsIndex,
3367 template <
class Dictionary>
3370 static_assert(!(std::is_same<Dictionary, SwissNameDictionary>::value));
3372 return CAST(LoadFixedArrayElement(
3373 dictionary, Dictionary::kNumberOfDeletedElementsIndex));
3376 template <
class Dictionary>
3380 static_assert(!(std::is_same<Dictionary, SwissNameDictionary>::value));
3382 StoreFixedArrayElement(dictionary,
3383 Dictionary::kNumberOfDeletedElementsIndex,
3387 template <
class Dictionary>
3390 static_assert(!(std::is_same<Dictionary, SwissNameDictionary>::value));
3393 UnsafeLoadFixedArrayElement(dictionary, Dictionary::kCapacityIndex));
3396 template <
class Dictionary>
3398 return CAST(LoadFixedArrayElement(dictionary,
3399 Dictionary::kNextEnumerationIndexIndex));
3402 template <
class Dictionary>
3405 StoreFixedArrayElement(dictionary, Dictionary::kNextEnumerationIndexIndex,
3409 template <
class Dictionary>
3411 template <
class Dictionary>
3417 kFindExistingOrInsertionIndex
3420 template <
typename Dictionary>
3430 template <
typename Dictionary>
3434 Label* if_not_found,
3438 template <
typename Dictionary>
3443 Label* if_not_found,
3455 Label* if_not_found);
3461 template <
class Dictionary>
3465 template <
class Dictionary>
3470 template <
class Dictionary>
3471 void AddToDictionary(
3511 void TryGetOwnProperty(
3516 ExpectedReceiverMode expected_receiver_mode = kExpectingAnyReceiver);
3517 void TryGetOwnProperty(
3522 Label* if_not_found,
Label* if_bailout, GetOwnPropertyMode mode,
3523 ExpectedReceiverMode expected_receiver_mode = kExpectingAnyReceiver);
3527 void InitializePropertyDescriptorObject(
3533 return GetProperty(context,
receiver, HeapConstantNoHole(name));
3538 return CallBuiltin<JSAny>(Builtin::kGetProperty, context,
receiver, name);
3553 return CallBuiltin(Builtin::kSetProperty, context,
receiver,
key, value);
3559 return CallBuiltin(Builtin::kCreateDataProperty, context,
receiver,
key,
3568 Label* if_iteratorundefined);
3587 template <
typename Dictionary>
3613 Label* if_found_global,
3624 Label* if_found_fast,
3625 Label* if_found_dict,
3645 Label* if_maybe_special_index,
3646 Label* if_not_special_index);
3653 Label* if_bailout)>;
3660 Label* if_bailout)>;
3669 void TryPrototypeChainLookup(
3673 Label* if_bailout,
Label* if_proxy,
bool handle_private_names =
false);
3705 Label* if_no_feedback_vector);
3724 void MaybeUpdateFeedback(
TNode<Smi> feedback,
3735 void CombineFeedback(
TVariable<Smi>* existing_feedback,
int feedback);
3740 void OverwriteFeedback(
TVariable<Smi>* existing_feedback,
int new_feedback);
3755 template <
typename T>
3764 template <
typename TIndex,
typename TValue>
3775#if V8_ENABLE_WEBASSEMBLY
3776 TorqueStructInt64AsInt32Pair BigIntToRawBytes(
TNode<BigInt> value);
3825 return LoadObjectField<Object>(accessor_pair,
3829 return LoadObjectField<Object>(accessor_pair,
3837 template <
typename TIndex>
3840 template <
typename TIndex>
3848 template <
typename TIndex>
3855 template <
typename TIndex>
3860 BuildFastLoop(
VariableList(0, zone()), var_index, start_index, end_index,
3861 body,
increment, unrolling_mode, advance_mode);
3864 template <
typename TIndex>
3870 BuildFastLoop(vars, var_index, start_index, end_index, body,
increment,
3871 unrolling_mode, advance_mode);
3874 template <
typename TIndex>
3879 BuildFastLoop(
VariableList(0, zone()), start_index, end_index, body,
3880 increment, unrolling_mode, advance_mode);
3888 template <
typename TIndex>
3896 template <
typename TIndex>
3899 return ElementOffsetFromIndex(element_count,
kind, header_size);
3902 template <
typename TIndex>
3905 return GetArrayAllocationSize(element_count,
kind,
3911 PropertyArray::kHeaderSize);
3914 template <
typename TIndex>
3915 void GotoIfFixedArraySizeDoesntFitInNewSpace(
TNode<TIndex> element_count,
3934 return RelationalComparison(
3935 op, left, right, [=]() {
return context; }, var_type_feedback);
3940 const LazyNode<Context>& context,
3949 BranchIfNumberRelationalComparison(Operation::kEqual, left, right, if_true,
3955 BranchIfNumberEqual(left, right, if_false, if_true);
3960 BranchIfNumberRelationalComparison(Operation::kLessThan, left, right,
3966 BranchIfNumberRelationalComparison(Operation::kLessThanOrEqual, left, right,
3972 BranchIfNumberRelationalComparison(Operation::kGreaterThan, left, right,
3978 BranchIfNumberRelationalComparison(Operation::kGreaterThanOrEqual, left,
3979 right, if_true, if_false);
3983 Label* if_not_accessor_pair) {
3984 GotoIf(TaggedIsSmi(value), if_not_accessor_pair);
3985 Branch(IsAccessorPair(
CAST(value)), if_accessor_pair, if_not_accessor_pair);
3995 lhs, rhs, [=]() {
return context; }, var_type_feedback);
3998 const LazyNode<Context>& context,
4006 Label if_false(
this);
4011 BranchIfStringEqual(lhs, lhs_length, rhs, rhs_length, if_true, &if_false,
4020 return BranchIfStringEqual(lhs, LoadStringLengthAsWord(lhs), rhs,
4021 LoadStringLengthAsWord(rhs), if_true, if_false,
4036 SameValueMode mode = SameValueMode::kFull);
4052 return HasProperty(context,
object,
key,
4053 HasPropertyLookupMode::kHasProperty);
4064 std::optional<TNode<HeapObject>> maybe_feedback_vector = {});
4066 TNode<HeapObject> GetSuperConstructor(TNode<JSFunction> active_function);
4068 TNode<JSReceiver> SpeciesConstructor(TNode<Context> context,
4069 TNode<JSAny>
object,
4070 TNode<JSReceiver> default_constructor);
4072 TNode<Boolean> InstanceOf(TNode<Object>
object, TNode<JSAny> callable,
4073 TNode<Context> context);
4076 TNode<BoolT> IsDebugActive();
4079 TNode<UintPtrT> LoadJSArrayBufferByteLength(
4080 TNode<JSArrayBuffer> array_buffer);
4081 TNode<UintPtrT> LoadJSArrayBufferMaxByteLength(
4082 TNode<JSArrayBuffer> array_buffer);
4083 TNode<RawPtrT> LoadJSArrayBufferBackingStorePtr(
4084 TNode<JSArrayBuffer> array_buffer);
4085 void ThrowIfArrayBufferIsDetached(TNode<Context> context,
4086 TNode<JSArrayBuffer> array_buffer,
4087 const char* method_name);
4090 TNode<JSArrayBuffer> LoadJSArrayBufferViewBuffer(
4091 TNode<JSArrayBufferView> array_buffer_view);
4092 TNode<UintPtrT> LoadJSArrayBufferViewByteLength(
4093 TNode<JSArrayBufferView> array_buffer_view);
4094 void StoreJSArrayBufferViewByteLength(
4095 TNode<JSArrayBufferView> array_buffer_view, TNode<UintPtrT> value);
4096 TNode<UintPtrT> LoadJSArrayBufferViewByteOffset(
4097 TNode<JSArrayBufferView> array_buffer_view);
4098 void StoreJSArrayBufferViewByteOffset(
4099 TNode<JSArrayBufferView> array_buffer_view, TNode<UintPtrT> value);
4100 void ThrowIfArrayBufferViewBufferIsDetached(
4101 TNode<Context> context, TNode<JSArrayBufferView> array_buffer_view,
4102 const char* method_name);
4105 TNode<UintPtrT> LoadJSTypedArrayLength(TNode<JSTypedArray> typed_array);
4106 void StoreJSTypedArrayLength(TNode<JSTypedArray> typed_array,
4107 TNode<UintPtrT> value);
4108 TNode<UintPtrT> LoadJSTypedArrayLengthAndCheckDetached(
4109 TNode<JSTypedArray> typed_array, Label* detached);
4112 TNode<UintPtrT> LoadVariableLengthJSTypedArrayLength(
4113 TNode<JSTypedArray> array, TNode<JSArrayBuffer> buffer,
4114 Label* detached_or_out_of_bounds);
4117 TNode<UintPtrT> LoadVariableLengthJSTypedArrayByteLength(
4118 TNode<Context> context, TNode<JSTypedArray> array,
4119 TNode<JSArrayBuffer> buffer);
4120 TNode<UintPtrT> LoadVariableLengthJSArrayBufferViewByteLength(
4121 TNode<JSArrayBufferView> array, TNode<JSArrayBuffer> buffer,
4122 Label* detached_or_out_of_bounds);
4124 void IsJSArrayBufferViewDetachedOrOutOfBounds(
4125 TNode<JSArrayBufferView> array_buffer_view, Label* detached_or_oob,
4126 Label* not_detached_nor_oob);
4128 TNode<BoolT> IsJSArrayBufferViewDetachedOrOutOfBoundsBoolean(
4129 TNode<JSArrayBufferView> array_buffer_view);
4131 void CheckJSTypedArrayIndex(TNode<JSTypedArray> typed_array,
4132 TNode<UintPtrT> index,
4133 Label* detached_or_out_of_bounds);
4135 TNode<IntPtrT> RabGsabElementsKindToElementByteSize(
4136 TNode<Int32T> elementsKind);
4137 TNode<RawPtrT> LoadJSTypedArrayDataPtr(TNode<JSTypedArray> typed_array);
4138 TNode<JSArrayBuffer> GetTypedArrayBuffer(TNode<Context> context,
4139 TNode<JSTypedArray> array);
4141 template <
typename TIndex>
4142 TNode<IntPtrT> ElementOffsetFromIndex(TNode<TIndex> index, ElementsKind
kind,
4144 template <
typename Array,
typename TIndex>
4146 static_assert(Array::kElementSize ==
kTaggedSize);
4159#ifdef V8_ENABLE_LEAPTIERING
4161#if V8_STATIC_DISPATCH_HANDLES_BOOL
4163 JSBuiltinDispatchHandleRoot::Idx dispatch_root_idx);
4194 void SetSupportsDynamicParameterCount(
4206 Label* if_compile_lazy =
nullptr);
4215 return AllocateRootFunctionWithContext(
static_cast<RootIndex>(function),
4222#ifdef V8_ENABLE_JAVASCRIPT_PROMISE_HOOKS
4228 return IsAnyPromiseHookEnabled(PromiseHookFlags());
4230 TNode<BoolT> IsIsolatePromiseHookEnabledOrHasAsyncEventDelegate(
4233 return IsIsolatePromiseHookEnabledOrHasAsyncEventDelegate(
4234 PromiseHookFlags());
4237 IsIsolatePromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate(
4241 return IsIsolatePromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate(
4242 PromiseHookFlags());
4247 return NeedsAnyPromiseHooks(PromiseHookFlags());
4264 kCountIncludesReceiver,
4265 kCountExcludesReceiver
4268 TorqueStructArguments GetFrameArguments(
4270 FrameArgumentsArgcType argc_type =
4271 FrameArgumentsArgcType::kCountExcludesReceiver);
4281 void Print(
const char* s);
4284 return Print(
nullptr, tagged_value);
4288 void PrintErr(
const char* s);
4291 return PrintErr(
nullptr, tagged_value);
4293 void PrintToStream(
const char* s,
int stream);
4296 void PrintToStream(
const char* prefix,
TNode<UintPtrT> value,
int stream);
4297 void PrintToStream(
const char* prefix,
TNode<Float64T> value,
int stream);
4299 template <
class... TArgs>
4302 static_assert(
sizeof...(TArgs) <= 3);
4304 SmiConstant(message),
args...));
4308 CallRuntime(Runtime::kAbort, NoContextConstant(), SmiConstant(reason));
4317 return i.To<int32_t>();
4320 return i.To<uint32_t>();
4323 return i.To<int8_t>();
4326 return i.To<uint8_t>();
4329 return i.To<int64_t>();
4332 return i.To<uint64_t>();
4335 return i.To<intptr_t>();
4338 return i.To<uintptr_t>();
4341 int64_t i_value =
i.To<int64_t>();
4342 double d_value =
static_cast<double>(i_value);
4343 CHECK_EQ(i_value,
static_cast<int64_t
>(d_value));
4370 CHECK(!base::bits::SignedAddOverflow32(a, b, &val));
4375 CHECK(!base::bits::SignedMulOverflow32(a, b, &val));
4388#if defined(V8_HOST_ARCH_64_BIT)
4407 Label* if_not_found);
4415 Label* if_not_found);
4418 template <
typename Array>
4424 template <
typename Array>
4430 template <
typename Array>
4436 template <
typename Array>
4440 template <
typename Array>
4444 template <
typename Array>
4515 return IntPtrConstant(FeedbackIterator::kEntrySize);
4519 return IntPtrConstant(FeedbackIterator::kHandlerOffset);
4525 int at_least_space_for);
4535 TNode<IntPtrT> SwissNameDictionaryOffsetIntoPropertyDetailsTableMT(
4562 void StoreSwissNameDictionaryEnumToEntryMapping(
4602 Label* needs_resize);
4612 Load(MachineType::Pointer(), header,
4613 IntPtrConstant(MemoryChunk::FlagsOffset())));
4614 return WordNotEqual(WordAnd(flags, IntPtrConstant(
mask)),
4621 Load(MachineType::Pointer(), header,
4622 IntPtrConstant(MemoryChunk::FlagsOffset())));
4623 return WordEqual(WordAnd(flags, IntPtrConstant(
mask)), IntPtrConstant(0));
4631 Label* return_false);
4633 void HandleBreakOnNode();
4656 template <
typename CollectionType>
4660 template <
typename CollectionType>
4676 template <
typename Array>
4679 template <
typename Array>
4683 template <
typename Array>
4692 static const int kElementLoopUnrollThreshold = 8;
4700 template <Object::Conversion conversion>
4701 void TaggedToWord32OrBigIntImpl(
4705 const FeedbackValues& feedback,
Label* if_bigint =
nullptr,
4706 Label* if_bigint64 =
nullptr,
4710 template <
typename T>
4713 int additional_offset);
4720 return CodeAssembler::LoadRoot(root_index);
4724 return CodeAssembler::LoadRootMapWord(root_index);
4727 template <
typename TIndex>
4728 void StoreFixedArrayOrPropertyArrayElement(
4731 int additional_offset = 0);
4733 template <
typename TIndex>
4737 template <
typename TIndex>
4747 template <
typename TArray,
typename TIndex,
typename TValue>
4751 template <
typename TIndex>
4755 template <
typename TIndex>
4768 template <
typename TValue>
4776 template <
typename TValue>