85#define __ ACCESS_MASM(masm_)
89 int registers_to_save)
94 no_root_array_scope_(
masm_.get()),
96 num_registers_(registers_to_save),
97 num_saved_registers_(registers_to_save),
103 internal_failure_label_() {
185 Label* on_at_start) {
193 Label* on_not_at_start) {
206 Label backtrack_non_equal;
211 __ bind(&backtrack_non_equal);
217 static const int kNumArguments = 3;
218 __ PrepareCallCFunction(kNumArguments, a0);
228 ExternalReference::re_is_character_in_range_array(), kNumArguments);
248 int start_reg,
bool read_backward,
bool unicode,
Label* on_no_match) {
253 __ SubWord(a1, a1, a0);
258 __ BranchShort(&fallthrough,
eq, a1,
Operand(zero_reg));
262 __ AddWord(t1, t1, a1);
310 __ bind(&loop_check);
331 int argument_count = 4;
332 __ PrepareCallCFunction(argument_count, a2);
362 ? ExternalReference::re_case_insensitive_compare_unicode()
363 : ExternalReference::re_case_insensitive_compare_non_unicode();
377 __ bind(&fallthrough);
382 Label* on_no_match) {
388 __ SubWord(a1, a1, a0);
393 __ BranchShort(&fallthrough,
eq, a1,
Operand(zero_reg));
397 __ AddWord(t1, t1, a1);
440 __ bind(&fallthrough);
444 Label* on_not_equal) {
458 Label* on_not_equal) {
474 Label* on_in_range) {
492 __ AddWord(a0, a0, a1);
557 __ SubWord(a0, a0,
Operand(0x2028 - 0x0B));
575 __ SubWord(a0, a0,
Operand(0x2028 - 0x0B));
626 ExternalReference::address_of_regexp_stack_stack_pointer(
isolate());
634 ExternalReference::address_of_regexp_stack_stack_pointer(
isolate());
642 ExternalReference::address_of_regexp_stack_memory_top_address(
isolate());
645 __ SubWord(scratch, stack_pointer, scratch);
646 __ StoreWord(scratch,
653 ExternalReference::address_of_regexp_stack_memory_top_address(
isolate());
654 __ LoadWord(stack_pointer_out,
658 __ AddWord(stack_pointer_out, stack_pointer_out, scratch);
665 if (
masm_->has_exception()) {
689 RegList registers_to_retain = {fp, s1, s2, s3, s4, s5,
690 s6, s7, s8, s9, s10, s11};
705 RegList argument_registers = {a0, a1, a2, a3, a4, a5, a6, a7};
709 __ MultiPush(
RegList{ra} | registers_to_retain);
717 __ MultiPush(argument_registers);
742 Label stack_limit_hit, stack_ok;
745 ExternalReference::address_of_jslimit(
masm_->isolate());
748 __ SubWord(a0, sp, a0);
751 __ Branch(&stack_limit_hit,
le, a0,
Operand(zero_reg));
754 __ Branch(&stack_ok,
uge, a0, extra_space_for_variables);
760 __ bind(&stack_limit_hit);
782 __ SubWord(a0, a0, t1);
790 Label load_char_start_regexp;
794 __ Branch(&load_char_start_regexp,
ne, a1,
Operand(zero_reg));
796 __ jmp(&start_regexp);
799 __ bind(&load_char_start_regexp);
802 __ bind(&start_regexp);
858 __ AddWord(a2, a2, a1);
860 __ AddWord(a3, a3, a1);
879 __ AddWord(a0, a0, 1);
898 Label reload_string_start_minus_one;
917 __ bind(&reload_string_start_minus_one);
923 __ Branch(&load_char_start_regexp);
942 __ MultiPop(registers_to_retain | ra);
952 Label exit_with_exception;
976 static constexpr int kNumArguments = 1;
977 __ PrepareCallCFunction(kNumArguments, 0, a0);
983 __ BranchShort(&exit_with_exception,
eq, a0,
Operand(zero_reg));
992 __ bind(&exit_with_exception);
1018 if (to ==
nullptr) {
1045 return kRISCVImplementation;
1058 if (
label->is_bound()) {
1059 int target =
label->pos();
1064 Label after_constant;
1065 __ BranchShort(&after_constant);
1070 __ bind(&after_constant);
1071 if (is_int16(cp_offset)) {
1091 if (check_stack_limit) {
1104 ExternalReference::address_of_regexp_stack_memory_top_address(
isolate());
1113 ExternalReference::address_of_regexp_stack_memory_top_address(
isolate());
1121 Label after_position;
1129 __ bind(&after_position);
1145 if (cp_offset == 0) {
1154 DCHECK(reg_from <= reg_to);
1156 for (
int reg = reg_from;
reg <= reg_to;
reg++) {
1160#ifdef RISCV_HAS_NO_UNALIGNED
1168 DCHECK(!
masm_->options().isolate_independent_code);
1176 __ And(sp, sp,
Operand(-stack_alignment));
1179 __ li(a3, extra_space);
1186 __ SubWord(sp, sp,
Operand(stack_alignment));
1202 ExternalReference::re_check_stack_guard_state();
1207 Address entry = d.InstructionStartOf(Builtin::kDirectCEntry);
1228template <
typename T>
1230 return reinterpret_cast<T&
>(Memory<int32_t>(re_frame + frame_offset));
1233template <
typename T>
1235 return reinterpret_cast<T*
>(re_frame + frame_offset);
1241 uintptr_t extra_space) {
1249 return_address, re_code,
1257 DCHECK(register_index < (1 << 30));
1266 Label* on_outside_input) {
1267 if (cp_offset >= 0) {
1282 if (to ==
nullptr) {
1289 if (to ==
nullptr) {
1298 __ BranchAndLink(to, cond, rs, rt);
1329 ExternalReference::address_of_jslimit(
masm_->isolate());
1337 ExternalReference::address_of_regexp_stack_limit_address(
1355 Label no_stack_overflow;
1357 auto l = ExternalReference::address_of_regexp_stack_limit_address(
isolate());
1364 __ bind(&no_stack_overflow);
1370 if (cp_offset != 0) {
1384 if (characters == 4) {
1387 }
else if (characters == 2) {
1397 if (characters == 2) {
static int ActivationFrameAlignment()
static constexpr bool IsIsolateIndependent(Builtin builtin)
static EmbeddedData FromBlob()
static V8_EXPORT_PRIVATE ExternalReference isolate_address()
V8_WARN_UNUSED_RESULT Handle< Code > Build()
CodeBuilder & set_empty_source_position_table()
CodeBuilder & set_self_reference(Handle< Object > self_reference)
static constexpr int kHeaderSize
V8_INLINE bool is_linked() const
Handle< ByteArray > GetOrAddRangeArray(const ZoneList< CharacterRange > *ranges)
@ FALLBACK_TO_EXPERIMENTAL
bool CanReadUnaligned() const override
static int CheckStackGuardState(Isolate *isolate, int start_index, RegExp::CallOrigin call_origin, Address *return_address, Tagged< InstructionStream > re_code, Address *subject, const uint8_t **input_start, const uint8_t **input_end, uintptr_t gap)
void ReadCurrentPositionFromRegister(int reg) override
static constexpr int kStringStartMinusOneOffset
void CheckCharacterLT(base::uc16 limit, Label *on_less) override
void WriteCurrentPositionToRegister(int reg, int cp_offset) override
static constexpr Register code_pointer()
void CheckPosition(int cp_offset, Label *on_outside_input) override
void CheckCharacterInRange(base::uc16 from, base::uc16 to, Label *on_in_range) override
void CheckNotBackReferenceIgnoreCase(int start_reg, bool read_backward, bool unicode, Label *on_no_match) override
void AssertAboveStackLimitMinusSlack()
Label check_preempt_label_
const std::unique_ptr< MacroAssembler > masm_
static constexpr int kBacktrackCountOffset
static constexpr Register end_of_input_address()
static constexpr int kNumOutputRegistersOffset
static constexpr int kInputStartOffset
static constexpr int kInputEndOffset
Label internal_failure_label_
void CheckNotCharacterAfterAnd(uint32_t c, uint32_t mask, Label *on_not_equal) override
void CheckGreedyLoop(Label *on_tos_equals_current_position) override
bool CheckCharacterInRangeArray(const ZoneList< CharacterRange > *ranges, Label *on_in_range) override
void LoadCurrentCharacterUnchecked(int cp_offset, int character_count) override
void Bind(Label *label) override
void SafeCallTarget(Label *name)
static int64_t CheckStackGuardState(Address *return_address, Address raw_code, Address re_frame, uintptr_t extra_space)
void CallIsCharacterInRangeArray(const ZoneList< CharacterRange > *ranges)
void CheckCharacterGT(base::uc16 limit, Label *on_greater) override
void CheckCharacter(uint32_t c, Label *on_equal) override
void AdvanceCurrentPosition(int by) override
RegExpMacroAssemblerRISCV(Isolate *isolate, Zone *zone, Mode mode, int registers_to_save)
void CallCFunctionFromIrregexpCode(ExternalReference function, int num_arguments)
void PopRegExpBasePointer(Register stack_pointer_out, Register scratch)
int stack_limit_slack_slot_count() override
void PushRegister(int register_index, StackCheckFlag check_stack_limit) override
void BranchOrBacktrack(Label *to, Condition condition, Register rs, const Operand &rt)
static constexpr int kRegisterZeroOffset
void Push(Register source)
void ClearRegisters(int reg_from, int reg_to) override
void LoadRegExpStackPointerFromMemory(Register dst)
static constexpr int kNumCalleeRegsToRetain
void CheckNotAtStart(int cp_offset, Label *on_not_at_start) override
void SetRegister(int register_index, int to) override
void StoreRegExpStackPointerToMemory(Register src, Register scratch)
static constexpr Register frame_pointer()
static constexpr int kIsolateOffset
void CheckCharacterNotInRange(base::uc16 from, base::uc16 to, Label *on_not_in_range) override
MemOperand register_location(int register_index)
void CallCheckStackGuardState(Register scratch, Operand extra_space_for_variables=Operand(0))
void ReadStackPointerFromRegister(int reg) override
bool CheckCharacterNotInRangeArray(const ZoneList< CharacterRange > *ranges, Label *on_not_in_range) override
void CheckNotCharacter(uint32_t c, Label *on_not_equal) override
static constexpr Register current_input_offset()
void Pop(Register target)
void CheckNotBackReference(int start_reg, bool read_backward, Label *on_no_match) override
const int num_saved_registers_
static constexpr int kRegExpStackBasePointerOffset
void Backtrack() override
void CheckBitInTable(Handle< ByteArray > table, Label *on_bit_set) override
static constexpr Register current_character()
void CheckNotCharacterAfterMinusAnd(base::uc16 c, base::uc16 minus, base::uc16 mask, Label *on_not_equal) override
void GoTo(Label *label) override
void CheckAtStart(int cp_offset, Label *on_at_start) override
bool CheckSpecialClassRanges(StandardCharacterSet type, Label *on_no_match) override
void PopCurrentPosition() override
static constexpr int kDirectCallOffset
Isolate * isolate() const
static constexpr int kStartIndexOffset
static constexpr int kFrameTypeOffset
~RegExpMacroAssemblerRISCV() override
void WriteStackPointerToRegister(int reg) override
DirectHandle< HeapObject > GetCode(DirectHandle< String > source, RegExpFlags flags) override
static constexpr int kInputStringOffset
IrregexpImplementation Implementation() override
void AdvanceRegister(int reg, int by) override
void IfRegisterEqPos(int reg, Label *if_eq) override
void PushCurrentPosition() override
void IfRegisterLT(int reg, int comparand, Label *if_lt) override
void PushBacktrack(Label *label) override
void SetCurrentPositionFromEnd(int by) override
void SkipUntilBitInTable(int cp_offset, Handle< ByteArray > table, Handle< ByteArray > nibble_table, int advance_by) override
void CheckCharacterAfterAnd(uint32_t c, uint32_t mask, Label *on_equal) override
static constexpr int kSuccessfulCapturesOffset
void PopRegister(int register_index) override
void SafeCall(Label *to, Condition cond, Register rs, const Operand &rt)
void IfRegisterGE(int reg, int comparand, Label *if_ge) override
static constexpr Register backtrack_stackpointer()
static constexpr int kRegisterOutputOffset
Label stack_overflow_label_
void PushRegExpBasePointer(Register stack_pointer, Register scratch)
static constexpr int kTableSize
bool has_backtrack_limit() const
void CheckNotInSurrogatePair(int cp_offset, Label *on_failure)
bool can_fallback() const
static constexpr int kTableMask
virtual bool CanReadUnaligned() const =0
V8_EXPORT_PRIVATE void LoadCurrentCharacter(int cp_offset, Label *on_end_of_input, bool check_bounds=true, int characters=1, int eats_at_least=kUseCharactersValue)
uint32_t backtrack_limit() const
bool global_unicode() const
bool global_with_zero_length_check() const
static constexpr int kStackLimitSlackSlotCount
static constexpr int kStackLimitSlackSize
constexpr unsigned Count() const
static constexpr int32_t TypeToMarker(Type type)
static const int32_t kMaxOneByteCharCode
static const int kMaxUtf16CodeUnit
RecordWriteMode const mode_
const CodeDesc * code_desc
#define ASM_CODE_COMMENT_STRING(asm,...)
#define LOG(isolate, Call)
MaglevAssembler *const masm_
constexpr bool IsPowerOfTwo(T value)
constexpr Register kScratchReg2
constexpr Register kScratchReg
MemOperand FieldMemOperand(Register object, int offset)
constexpr int kSystemPointerSize
std::unique_ptr< AssemblerBuffer > NewAssemblerBuffer(int size)
const int kCArgsSlotsSize
V8_EXPORT_PRIVATE FlagValues v8_flags
static T & frame_entry(Address re_frame, int frame_offset)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static T * frame_entry_address(Address re_frame, int frame_offset)
#define DCHECK_LE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
constexpr bool IsAligned(T value, U alignment)
#define OFFSET_OF_DATA_START(Type)
#define V8_UNLIKELY(condition)