20 int registers_to_save);
22 int stack_limit_slack_slot_count()
override;
23 void AdvanceCurrentPosition(
int by)
override;
24 void AdvanceRegister(
int reg,
int by)
override;
25 void Backtrack()
override;
27 void CheckAtStart(
int cp_offset,
Label* on_at_start)
override;
28 void CheckCharacter(uint32_t c,
Label* on_equal)
override;
29 void CheckCharacterAfterAnd(uint32_t c, uint32_t
mask,
30 Label* on_equal)
override;
35 void CheckGreedyLoop(
Label* on_tos_equals_current_position)
override;
36 void CheckNotAtStart(
int cp_offset,
Label* on_not_at_start)
override;
37 void CheckNotBackReference(
int start_reg,
bool read_backward,
38 Label* on_no_match)
override;
39 void CheckNotBackReferenceIgnoreCase(
int start_reg,
bool read_backward,
41 Label* on_no_match)
override;
42 void CheckNotCharacter(uint32_t c,
Label* on_not_equal)
override;
43 void CheckNotCharacterAfterAnd(uint32_t c, uint32_t
mask,
44 Label* on_not_equal)
override;
47 Label* on_not_equal)
override;
49 Label* on_in_range)
override;
51 Label* on_not_in_range)
override;
53 Label* on_in_range)
override;
55 Label* on_not_in_range)
override;
59 int advance_by)
override;
63 void CheckPosition(
int cp_offset,
Label* on_outside_input)
override;
65 Label* on_no_match)
override;
70 void IfRegisterGE(
int reg,
int comparand,
Label* if_ge)
override;
71 void IfRegisterLT(
int reg,
int comparand,
Label* if_lt)
override;
72 void IfRegisterEqPos(
int reg,
Label* if_eq)
override;
74 void LoadCurrentCharacterUnchecked(
int cp_offset,
75 int character_count)
override;
76 void PopCurrentPosition()
override;
77 void PopRegister(
int register_index)
override;
79 void PushCurrentPosition()
override;
80 void PushRegister(
int register_index,
82 void ReadCurrentPositionFromRegister(
int reg)
override;
83 void ReadStackPointerFromRegister(
int reg)
override;
84 void SetCurrentPositionFromEnd(
int by)
override;
85 void SetRegister(
int register_index,
int to)
override;
86 bool Succeed()
override;
87 void WriteCurrentPositionToRegister(
int reg,
int cp_offset)
override;
88 void ClearRegisters(
int reg_from,
int reg_to)
override;
89 void WriteStackPointerToRegister(
int reg)
override;
90#ifdef RISCV_HAS_NO_UNALIGNED
91 bool CanReadUnaligned()
const override;
97 static int64_t CheckStackGuardState(Address* return_address, Address raw_code,
98 Address re_frame, uintptr_t extra_space);
104 static constexpr int kFramePointerOffset = 0;
108 static constexpr int kStoredRegistersOffset = kFramePointerOffset;
112 static constexpr int kNumCalleeRegsToRetain = 12;
113 static constexpr int kReturnAddressOffset =
117 static constexpr int kStackFrameHeaderOffset = kReturnAddressOffset;
119 static constexpr int kFrameTypeOffset =
121 static_assert(kFrameTypeOffset ==
124 CommonFrameConstants::kContextOrFrameTypeOffset
125 : CommonFrameConstants::kContextOrFrameTypeOffset));
129 static constexpr int kNumOutputRegistersOffset =
131 static constexpr int kRegisterOutputOffset =
133 static constexpr int kInputEndOffset =
136 static constexpr int kStartIndexOffset =
138 static constexpr int kInputStringOffset =
142 static constexpr int kSuccessfulCapturesOffset =
144 static constexpr int kStringStartMinusOneOffset =
146 static constexpr int kBacktrackCountOffset =
151 static constexpr int kRegExpStackBasePointerOffset =
153 static constexpr int kNumberOfStackLocals = 4;
155 static constexpr int kRegisterZeroOffset =
159 static constexpr int kInitialBufferSize = 1024;
167 void CheckPreemption();
170 void CheckStackLimit();
171 void AssertAboveStackLimitMinusSlack();
173 void CallCheckStackGuardState(
Register scratch,
178 MemOperand register_location(
int register_index);
215 inline void SafeReturn();
216 inline void SafeCallTarget(
Label* name);
226 void LoadRegExpStackPointerFromMemory(
Register dst);
233 const std::unique_ptr<MacroAssembler>
masm_;