v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
regexp-macro-assembler-riscv.h
Go to the documentation of this file.
1// Copyright 2021 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_REGEXP_RISCV_REGEXP_MACRO_ASSEMBLER_RISCV_H_
6#define V8_REGEXP_RISCV_REGEXP_MACRO_ASSEMBLER_RISCV_H_
7
8#include "src/base/strings.h"
12
13namespace v8 {
14namespace internal {
15
18 public:
19 RegExpMacroAssemblerRISCV(Isolate* isolate, Zone* zone, Mode mode,
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;
26 void Bind(Label* label) 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;
31 void CheckCharacterGT(base::uc16 limit, Label* on_greater) override;
32 void CheckCharacterLT(base::uc16 limit, Label* on_less) override;
33 // A "greedy loop" is a loop that is both greedy and with a simple
34 // body. It has a particularly simple implementation.
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,
40 bool unicode,
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;
45 void CheckNotCharacterAfterMinusAnd(base::uc16 c, base::uc16 minus,
47 Label* on_not_equal) override;
48 void CheckCharacterInRange(base::uc16 from, base::uc16 to,
49 Label* on_in_range) override;
50 void CheckCharacterNotInRange(base::uc16 from, base::uc16 to,
51 Label* on_not_in_range) override;
52 bool CheckCharacterInRangeArray(const ZoneList<CharacterRange>* ranges,
53 Label* on_in_range) override;
54 bool CheckCharacterNotInRangeArray(const ZoneList<CharacterRange>* ranges,
55 Label* on_not_in_range) override;
56 void CheckBitInTable(Handle<ByteArray> table, Label* on_bit_set) override;
57 void SkipUntilBitInTable(int cp_offset, Handle<ByteArray> table,
58 Handle<ByteArray> nibble_table,
59 int advance_by) override;
60
61 // Checks whether the given offset from the current position is before
62 // the end of the string.
63 void CheckPosition(int cp_offset, Label* on_outside_input) override;
64 bool CheckSpecialClassRanges(StandardCharacterSet type,
65 Label* on_no_match) override;
66 void Fail() override;
68 RegExpFlags flags) override;
69 void GoTo(Label* label) 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;
73 IrregexpImplementation Implementation() override;
74 void LoadCurrentCharacterUnchecked(int cp_offset,
75 int character_count) override;
76 void PopCurrentPosition() override;
77 void PopRegister(int register_index) override;
78 void PushBacktrack(Label* label) override;
79 void PushCurrentPosition() override;
80 void PushRegister(int register_index,
81 StackCheckFlag check_stack_limit) override;
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;
92#endif
93 // Called from RegExp if the stack-guard is triggered.
94 // If the code object is relocated, the return address is fixed before
95 // returning.
96 // {raw_code} is an Address because this is called via ExternalReference.
97 static int64_t CheckStackGuardState(Address* return_address, Address raw_code,
98 Address re_frame, uintptr_t extra_space);
99
101
102 private:
103 // Offsets from frame_pointer() of function parameters and stored registers.
104 static constexpr int kFramePointerOffset = 0;
105
106 // Above the frame pointer - Stored registers and stack passed parameters.
107 // Registers s1 to s8, fp, and ra.
108 static constexpr int kStoredRegistersOffset = kFramePointerOffset;
109 // Return address (stored from link register, read into pc on return).
110
111 // This 9 is 8 s-regs (s1..s11) plus fp.
112 static constexpr int kNumCalleeRegsToRetain = 12;
113 static constexpr int kReturnAddressOffset =
114 kStoredRegistersOffset + kNumCalleeRegsToRetain * kSystemPointerSize;
115
116 // Stack frame header.
117 static constexpr int kStackFrameHeaderOffset = kReturnAddressOffset;
118 // Below the frame pointer - the stack frame type marker and locals.
119 static constexpr int kFrameTypeOffset =
120 kFramePointerOffset - kSystemPointerSize;
121 static_assert(kFrameTypeOffset ==
124 CommonFrameConstants::kContextOrFrameTypeOffset
125 : CommonFrameConstants::kContextOrFrameTypeOffset));
126 // Register parameters stored by setup code.
127 static constexpr int kIsolateOffset = kFrameTypeOffset - kSystemPointerSize;
128 static constexpr int kDirectCallOffset = kIsolateOffset - kSystemPointerSize;
129 static constexpr int kNumOutputRegistersOffset =
130 kDirectCallOffset - kSystemPointerSize;
131 static constexpr int kRegisterOutputOffset =
132 kNumOutputRegistersOffset - kSystemPointerSize;
133 static constexpr int kInputEndOffset =
134 kRegisterOutputOffset - kSystemPointerSize;
135 static constexpr int kInputStartOffset = kInputEndOffset - kSystemPointerSize;
136 static constexpr int kStartIndexOffset =
137 kInputStartOffset - kSystemPointerSize;
138 static constexpr int kInputStringOffset =
139 kStartIndexOffset - kSystemPointerSize;
140 // When adding local variables remember to push space for them in
141 // the frame in GetCode.
142 static constexpr int kSuccessfulCapturesOffset =
143 kInputStringOffset - kSystemPointerSize;
144 static constexpr int kStringStartMinusOneOffset =
145 kSuccessfulCapturesOffset - kSystemPointerSize;
146 static constexpr int kBacktrackCountOffset =
147 kStringStartMinusOneOffset - kSystemPointerSize;
148 // Stores the initial value of the regexp stack pointer in a
149 // position-independent representation (in case the regexp stack grows and
150 // thus moves).
151 static constexpr int kRegExpStackBasePointerOffset =
152 kBacktrackCountOffset - kSystemPointerSize;
153 static constexpr int kNumberOfStackLocals = 4;
154 // First register address. Following registers are below it on the stack.
155 static constexpr int kRegisterZeroOffset =
156 kRegExpStackBasePointerOffset - kSystemPointerSize;
157
158 // Initial size of code buffer.
159 static constexpr int kInitialBufferSize = 1024;
160
161 void CallCFunctionFromIrregexpCode(ExternalReference function,
162 int num_arguments);
165
166 // Check whether preemption has been requested.
167 void CheckPreemption();
168
169 // Check whether we are exceeding the stack limit on the backtrack stack.
170 void CheckStackLimit();
171 void AssertAboveStackLimitMinusSlack();
172
173 void CallCheckStackGuardState(Register scratch,
174 Operand extra_space_for_variables = Operand(0));
175 void CallIsCharacterInRangeArray(const ZoneList<CharacterRange>* ranges);
176
177 // The ebp-relative location of a regexp register.
178 MemOperand register_location(int register_index);
179
180 // Register holding the current input position as negative offset from
181 // the end of the string.
182 static constexpr Register current_input_offset() { return s2; }
183
184 // The register containing the current character after LoadCurrentCharacter.
185 static constexpr Register current_character() { return s5; }
186
187 // Register holding address of the end of the input string.
188 static constexpr Register end_of_input_address() { return s6; }
189
190 // Register holding the frame address. Local variables, parameters and
191 // regexp registers are addressed relative to this.
192 static constexpr Register frame_pointer() { return fp; }
193
194 // The register containing the backtrack stack top. Provides a meaningful
195 // name to the register.
196 // s7 should not be used here because baseline sparkplug uses s7 as context
197 // register.
198 static constexpr Register backtrack_stackpointer() { return s8; }
199
200 // Register holding pointer to the current code object.
201 static constexpr Register code_pointer() { return s1; }
202
203 // Byte size of chars in the string to match (decided by the Mode argument).
204 inline int char_size() const { return static_cast<int>(mode_); }
205
206 // Equivalent to a conditional branch to the label, unless the label
207 // is nullptr, in which case it is a conditional Backtrack.
208 void BranchOrBacktrack(Label* to, Condition condition, Register rs,
209 const Operand& rt);
210
211 // Call and return internally in the generated code in a way that
212 // is GC-safe (i.e., doesn't leave absolute code addresses on the stack)
213 inline void SafeCall(Label* to, Condition cond, Register rs,
214 const Operand& rt);
215 inline void SafeReturn();
216 inline void SafeCallTarget(Label* name);
217
218 // Pushes the value of a register on the backtrack stack. Decrements the
219 // stack pointer by a word size and stores the register's value there.
220 inline void Push(Register source);
221
222 // Pops a value from the backtrack stack. Reads the word at the stack pointer
223 // and increments it by a word size.
224 inline void Pop(Register target);
225
226 void LoadRegExpStackPointerFromMemory(Register dst);
227 void StoreRegExpStackPointerToMemory(Register src, Register scratch);
228 void PushRegExpBasePointer(Register stack_pointer, Register scratch);
229 void PopRegExpBasePointer(Register stack_pointer_out, Register scratch);
230
231 Isolate* isolate() const { return masm_->isolate(); }
232
233 const std::unique_ptr<MacroAssembler> masm_;
235
236 // Which mode to generate code for (Latin1 or UC16).
237 const Mode mode_;
238
239 // One greater than maximal register index actually used.
241
242 // Number of registers to output at the end (the saved registers
243 // are always 0..num_saved_registers_-1).
245
246 // Labels used internally.
256};
257
258} // namespace internal
259} // namespace v8
260
261#endif // V8_REGEXP_RISCV_REGEXP_MACRO_ASSEMBLER_RISCV_H_
const std::unique_ptr< MacroAssembler > masm_
RecordWriteMode const mode_
#define V8_EMBEDDED_CONSTANT_POOL_BOOL
Definition globals.h:81
Label label
LiftoffRegister reg
uint32_t const mask
MaglevAssembler *const masm_
uint16_t uc16
Definition strings.h:18
constexpr int kSystemPointerSize
Definition globals.h:410
#define V8_EXPORT_PRIVATE
Definition macros.h:460