18using namespace compiler::turboshaft;
20template <
typename Next>
28 String::Encoding dst_encoding,
32 __ CodeComment(
"CopyStringCharacters ",
33 src_one_byte ?
"ONE_BYTE_ENCODING" :
"TWO_BYTE_ENCODING",
35 dst_one_byte ?
"ONE_BYTE_ENCODING" :
"TWO_BYTE_ENCODING");
42 const int dst_stride = dst_one_byte ? 1 : 2;
46 __ WordPtrAdd(
__ BitcastTaggedToWordPtr(dst_string),
48 __ WordPtrMul(dst_begin, dst_stride)));
50 StringView src_view(no_gc, src_string, src_encoding, src_begin,
53 Zip(src_view,
Sequence(dst_begin_offset, dst_stride))) {
57 if (
v8_flags.debug_code && !src_one_byte && dst_one_byte) {
58 TSA_DCHECK(
this,
__ Uint32LessThanOrEqual(src_char, 0xFF));
67 __ CodeComment(
"AllocateSeqOneByteString");
77 __ template Allocate<SeqOneByteString>(aligned_size,
80 __ SeqOneByteStringMapConstant());
82 __ InitializeField(new_string, AccessBuilderTS::ForStringLength(),
83 __ TruncateWordPtrToWord32(length));
84 __ InitializeField(new_string, AccessBuilderTS::ForNameRawHashField(),
89 __ WordPtrAdd(
__ BitcastTaggedToWordPtr(
string), aligned_size),
93 __ Store(raw_padding_begin, {},
__ SmiConstant(0),
103 __ CodeComment(
"AllocateSeqTwoByteString");
105 GOTO_IF(
__ WordPtrEqual(length, 0), done,
113 __ template Allocate<SeqTwoByteString>(aligned_size,
116 __ SeqTwoByteStringMapConstant());
118 __ InitializeField(new_string, AccessBuilderTS::ForStringLength(),
119 __ TruncateWordPtrToWord32(length));
120 __ InitializeField(new_string, AccessBuilderTS::ForNameRawHashField(),
125 __ WordPtrAdd(
__ BitcastTaggedToWordPtr(
string), aligned_size),
129 __ Store(raw_padding_begin, {},
__ SmiConstant(0),
152#ifdef V8_ENABLE_EXPERIMENTAL_TSA_BUILTINS
154TS_BUILTIN(StringFromCodePointAt, StringBuiltinsAssemblerTS) {
155 auto receiver = Parameter<String>(Descriptor::kReceiver);
156 auto position = Parameter<WordPtr>(Descriptor::kPosition);
168TS_BUILTIN(StringFromCharCode, StringBuiltinsAssemblerTS) {
169 V<Context> context = Parameter<Context>(Descriptor::kContext);
170 V<Word32> argc = Parameter<Word32>(Descriptor::kJSActualArgumentsCount);
171 BuiltinArgumentsTS arguments(
this, argc);
173 V<WordPtr> character_count = arguments.GetLengthWithoutReceiver();
176 IF (WordPtrEqual(arguments.GetLengthWithoutReceiver(), 1)) {
181 V<Word32> code32 = TruncateTaggedToWord32(context, code);
184 PopAndReturn(arguments,
result);
186 Label<> contains_two_byte_characters(
this);
190 AllocateSeqOneByteString(character_count);
192 ScopedVar<WordPtr> var_max_index(
this, 0);
196 FOREACH(arg, arguments.Range()) {
197 V<Word32> code32 = TruncateTaggedToWord32(context, arg);
205 AllocateSeqTwoByteString(character_count);
214 StoreElement(two_byte_result,
215 AccessBuilderTS::ForSeqTwoByteStringCharacter(),
216 var_max_index, code16);
217 var_max_index = WordPtrAdd(var_max_index, 1);
222 FOREACH(arg, arguments.Range(var_max_index)) {
223 V<Word32> code32 = TruncateTaggedToWord32(context, arg);
227 StoreElement(two_byte_result,
228 AccessBuilderTS::ForSeqTwoByteStringCharacter(),
229 var_max_index, code16);
230 var_max_index = WordPtrAdd(var_max_index, 1);
232 PopAndReturn(arguments, two_byte_result);
236 StoreElement(one_byte_result,
237 AccessBuilderTS::ForSeqOneByteStringCharacter(),
238 var_max_index, code16);
239 var_max_index = WordPtrAdd(var_max_index, 1);
241 PopAndReturn(arguments, one_byte_result);
#define TSA_DCHECK(assembler, condition)
#define GOTO_IF(cond, label,...)
#define TS_BUILTIN(Name, BaseAssembler)
static constexpr int kEmptyHashField
StringBuiltinsAssemblerTS(compiler::turboshaft::PipelineData *data, compiler::turboshaft::Graph &graph, Zone *phase_zone)
V< SeqOneByteString > AllocateSeqOneByteString(V< WordPtr > length)
void CopyStringCharacters(V< String > src_string, ConstOrV< WordPtr > src_begin, String::Encoding src_encoding, V< String > dst_string, ConstOrV< WordPtr > dst_begin, String::Encoding dst_encoding, ConstOrV< WordPtr > character_count)
V< SeqTwoByteString > AllocateSeqTwoByteString(V< WordPtr > length)
static const int32_t kMaxOneByteCharCode
static const int kMaxUtf16CodeUnit
Map ForMap(WriteBarrierKind write_barrier=kMapWriteBarrier)
static constexpr MemoryRepresentation TaggedSigned()
static constexpr MemoryRepresentation Uint16()
constexpr uint8_t SizeInBytes() const
static constexpr MemoryRepresentation Uint8()
ZoneVector< RpoNumber > & result
Zip(Iterables... iterables) -> Zip< Iterables... >
std::conditional_t< Is64(), Word64, Word32 > WordPtr
Sequence(V< T >, V< T >) -> Sequence< T >
constexpr intptr_t kObjectAlignment
V8_EXPORT_PRIVATE FlagValues v8_flags
static constexpr Kind RawAligned()
#define OFFSET_OF_DATA_START(Type)
#define BUILTIN_REDUCER(name)