5 #ifndef V8_REGEXP_ARM_REGEXP_MACRO_ASSEMBLER_ARM_H_ 6 #define V8_REGEXP_ARM_REGEXP_MACRO_ASSEMBLER_ARM_H_ 8 #include "src/arm/assembler-arm.h" 9 #include "src/macro-assembler.h" 10 #include "src/regexp/regexp-macro-assembler.h" 16 #ifndef V8_INTERPRETED_REGEXP 20 int registers_to_save);
22 virtual int stack_limit_slack();
23 virtual void AdvanceCurrentPosition(
int by);
24 virtual void AdvanceRegister(
int reg,
int by);
25 virtual void Backtrack();
26 virtual void Bind(
Label* label);
27 virtual void CheckAtStart(
Label* on_at_start);
28 virtual void CheckCharacter(
unsigned c,
Label* on_equal);
29 virtual void CheckCharacterAfterAnd(
unsigned c,
32 virtual void CheckCharacterGT(uc16 limit,
Label* on_greater);
33 virtual void CheckCharacterLT(uc16 limit,
Label* on_less);
36 virtual void CheckGreedyLoop(
Label* on_tos_equals_current_position);
37 virtual void CheckNotAtStart(
int cp_offset,
Label* on_not_at_start);
38 virtual void CheckNotBackReference(
int start_reg,
bool read_backward,
40 virtual void CheckNotBackReferenceIgnoreCase(
int start_reg,
41 bool read_backward,
bool unicode,
43 virtual void CheckNotCharacter(
unsigned c,
Label* on_not_equal);
44 virtual void CheckNotCharacterAfterAnd(
unsigned c,
47 virtual void CheckNotCharacterAfterMinusAnd(uc16 c,
51 virtual void CheckCharacterInRange(uc16 from,
54 virtual void CheckCharacterNotInRange(uc16 from,
56 Label* on_not_in_range);
61 virtual void CheckPosition(
int cp_offset,
Label* on_outside_input);
62 virtual bool CheckSpecialCharacterClass(uc16
type,
66 virtual void GoTo(
Label* label);
67 virtual void IfRegisterGE(
int reg,
int comparand,
Label* if_ge);
68 virtual void IfRegisterLT(
int reg,
int comparand,
Label* if_lt);
69 virtual void IfRegisterEqPos(
int reg,
Label* if_eq);
70 virtual IrregexpImplementation Implementation();
71 virtual void LoadCurrentCharacter(
int cp_offset,
72 Label* on_end_of_input,
73 bool check_bounds =
true,
75 virtual void PopCurrentPosition();
76 virtual void PopRegister(
int register_index);
77 virtual void PushBacktrack(
Label* label);
78 virtual void PushCurrentPosition();
79 virtual void PushRegister(
int register_index,
80 StackCheckFlag check_stack_limit);
81 virtual void ReadCurrentPositionFromRegister(
int reg);
82 virtual void ReadStackPointerFromRegister(
int reg);
83 virtual void SetCurrentPositionFromEnd(
int by);
84 virtual void SetRegister(
int register_index,
int to);
85 virtual bool Succeed();
86 virtual void WriteCurrentPositionToRegister(
int reg,
int cp_offset);
87 virtual void ClearRegisters(
int reg_from,
int reg_to);
88 virtual void WriteStackPointerToRegister(
int reg);
94 static int CheckStackGuardState(
Address* return_address,
Address raw_code,
99 static const int kFramePointer = 0;
103 static const int kStoredRegisters = kFramePointer;
105 static const int kReturnAddress = kStoredRegisters + 8 * kPointerSize;
107 static const int kRegisterOutput = kReturnAddress + kPointerSize;
108 static const int kNumOutputRegisters = kRegisterOutput + kPointerSize;
109 static const int kStackHighEnd = kNumOutputRegisters + kPointerSize;
110 static const int kDirectCall = kStackHighEnd + kPointerSize;
111 static const int kIsolate = kDirectCall + kPointerSize;
115 static const int kInputEnd = kFramePointer - kPointerSize;
116 static const int kInputStart = kInputEnd - kPointerSize;
117 static const int kStartIndex = kInputStart - kPointerSize;
118 static const int kInputString = kStartIndex - kPointerSize;
121 static const int kSuccessfulCaptures = kInputString - kPointerSize;
122 static const int kStringStartMinusOne = kSuccessfulCaptures - kPointerSize;
124 static const int kRegisterZero = kStringStartMinusOne - kPointerSize;
127 static const size_t kRegExpCodeSize = 1024;
129 static const int kBacktrackConstantPoolSize = 4;
133 void LoadCurrentCharacterUnchecked(
int cp_offset,
int character_count);
136 void CheckPreemption();
139 void CheckStackLimit();
143 void CallCheckStackGuardState();
146 MemOperand register_location(
int register_index);
150 inline Register current_input_offset() {
return r6; }
153 inline Register current_character() {
return r7; }
156 inline Register end_of_input_address() {
return r10; }
160 inline Register frame_pointer() {
return fp; }
164 inline Register backtrack_stackpointer() {
return r8; }
167 inline Register code_pointer() {
return r5; }
170 inline int char_size() {
return static_cast<int>(mode_); }
174 void BranchOrBacktrack(Condition condition,
Label* to);
178 inline void SafeCall(
Label* to, Condition cond = al);
179 inline void SafeReturn();
180 inline void SafeCallTarget(
Label* name);
190 Isolate* isolate()
const {
return masm_->isolate(); }
202 int num_saved_registers_;
207 Label success_label_;
208 Label backtrack_label_;
210 Label check_preempt_label_;
211 Label stack_overflow_label_;
214 #endif // V8_INTERPRETED_REGEXP 220 #endif // V8_REGEXP_ARM_REGEXP_MACRO_ASSEMBLER_ARM_H_