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)