5 #ifndef V8_REGEXP_MIPS64_REGEXP_MACRO_ASSEMBLER_MIPS64_H_ 6 #define V8_REGEXP_MIPS64_REGEXP_MACRO_ASSEMBLER_MIPS64_H_ 8 #include "src/macro-assembler.h" 9 #include "src/mips64/assembler-mips64.h" 10 #include "src/regexp/regexp-macro-assembler.h" 15 #ifndef V8_INTERPRETED_REGEXP 16 class RegExpMacroAssemblerMIPS:
public NativeRegExpMacroAssembler {
18 RegExpMacroAssemblerMIPS(Isolate* isolate, Zone* zone, Mode mode,
19 int registers_to_save);
20 virtual ~RegExpMacroAssemblerMIPS();
21 virtual int stack_limit_slack();
22 virtual void AdvanceCurrentPosition(
int by);
23 virtual void AdvanceRegister(
int reg,
int by);
24 virtual void Backtrack();
25 virtual void Bind(Label* label);
26 virtual void CheckAtStart(Label* on_at_start);
27 virtual void CheckCharacter(
uint32_t c, Label* on_equal);
28 virtual void CheckCharacterAfterAnd(
uint32_t c,
31 virtual void CheckCharacterGT(uc16 limit, Label* on_greater);
32 virtual void CheckCharacterLT(uc16 limit, Label* on_less);
35 virtual void CheckGreedyLoop(Label* on_tos_equals_current_position);
36 virtual void CheckNotAtStart(
int cp_offset, Label* on_not_at_start);
37 virtual void CheckNotBackReference(
int start_reg,
bool read_backward,
39 virtual void CheckNotBackReferenceIgnoreCase(
int start_reg,
40 bool read_backward,
bool unicode,
42 virtual void CheckNotCharacter(
uint32_t c, Label* on_not_equal);
43 virtual void CheckNotCharacterAfterAnd(
uint32_t c,
46 virtual void CheckNotCharacterAfterMinusAnd(uc16 c,
50 virtual void CheckCharacterInRange(uc16 from,
53 virtual void CheckCharacterNotInRange(uc16 from,
55 Label* on_not_in_range);
56 virtual void CheckBitInTable(Handle<ByteArray> table, Label* on_bit_set);
60 virtual void CheckPosition(
int cp_offset, Label* on_outside_input);
61 virtual bool CheckSpecialCharacterClass(uc16 type,
64 virtual Handle<HeapObject> GetCode(Handle<String> source);
65 virtual void GoTo(Label* label);
66 virtual void IfRegisterGE(
int reg,
int comparand, Label* if_ge);
67 virtual void IfRegisterLT(
int reg,
int comparand, Label* if_lt);
68 virtual void IfRegisterEqPos(
int reg, Label* if_eq);
69 virtual IrregexpImplementation Implementation();
70 virtual void LoadCurrentCharacter(
int cp_offset,
71 Label* on_end_of_input,
72 bool check_bounds =
true,
74 virtual void PopCurrentPosition();
75 virtual void PopRegister(
int register_index);
76 virtual void PushBacktrack(Label* label);
77 virtual void PushCurrentPosition();
78 virtual void PushRegister(
int register_index,
79 StackCheckFlag check_stack_limit);
80 virtual void ReadCurrentPositionFromRegister(
int reg);
81 virtual void ReadStackPointerFromRegister(
int reg);
82 virtual void SetCurrentPositionFromEnd(
int by);
83 virtual void SetRegister(
int register_index,
int to);
84 virtual bool Succeed();
85 virtual void WriteCurrentPositionToRegister(
int reg,
int cp_offset);
86 virtual void ClearRegisters(
int reg_from,
int reg_to);
87 virtual void WriteStackPointerToRegister(
int reg);
88 virtual bool CanReadUnaligned();
94 static int64_t CheckStackGuardState(Address* return_address, Address raw_code,
97 void print_regexp_frame_constants();
101 static const int kFramePointer = 0;
105 static const int kStoredRegisters = kFramePointer;
110 static const int kReturnAddress = kStoredRegisters + 9 * kPointerSize;
112 static const int kStackFrameHeader = kReturnAddress;
114 static const int kIsolate = kStackFrameHeader + kPointerSize;
118 static const int kDirectCall = kFramePointer - kPointerSize;
119 static const int kStackHighEnd = kDirectCall - kPointerSize;
120 static const int kNumOutputRegisters = kStackHighEnd - kPointerSize;
121 static const int kRegisterOutput = kNumOutputRegisters - kPointerSize;
122 static const int kInputEnd = kRegisterOutput - kPointerSize;
123 static const int kInputStart = kInputEnd - kPointerSize;
124 static const int kStartIndex = kInputStart - kPointerSize;
125 static const int kInputString = kStartIndex - kPointerSize;
128 static const int kSuccessfulCaptures = kInputString - kPointerSize;
129 static const int kStringStartMinusOne = kSuccessfulCaptures - kPointerSize;
131 static const int kRegisterZero = kStringStartMinusOne - kPointerSize;
134 static const size_t kRegExpCodeSize = 1024;
138 void LoadCurrentCharacterUnchecked(
int cp_offset,
int character_count);
141 void CheckPreemption();
144 void CheckStackLimit();
148 void CallCheckStackGuardState(Register scratch);
151 MemOperand register_location(
int register_index);
155 inline Register current_input_offset() {
return a6; }
158 inline Register current_character() {
return a7; }
161 inline Register end_of_input_address() {
return t2; }
165 inline Register frame_pointer() {
return fp; }
169 inline Register backtrack_stackpointer() {
return t0; }
172 inline Register code_pointer() {
return a5; }
175 inline int char_size() {
return static_cast<int>(mode_); }
179 void BranchOrBacktrack(Label* to,
186 inline void SafeCall(Label* to,
190 inline void SafeReturn();
191 inline void SafeCallTarget(Label* name);
195 inline void Push(Register source);
199 inline void Pop(Register target);
201 Isolate* isolate()
const {
return masm_->isolate(); }
203 MacroAssembler* masm_;
213 int num_saved_registers_;
218 Label success_label_;
219 Label backtrack_label_;
221 Label check_preempt_label_;
222 Label stack_overflow_label_;
223 Label internal_failure_label_;
226 #endif // V8_INTERPRETED_REGEXP 232 #endif // V8_REGEXP_MIPS64_REGEXP_MACRO_ASSEMBLER_MIPS64_H_