5 #ifndef V8_REGEXP_S390_REGEXP_MACRO_ASSEMBLER_S390_H_ 6 #define V8_REGEXP_S390_REGEXP_MACRO_ASSEMBLER_S390_H_ 8 #include "src/macro-assembler.h" 9 #include "src/regexp/regexp-macro-assembler.h" 10 #include "src/s390/assembler-s390.h" 15 #ifndef V8_INTERPRETED_REGEXP 19 int registers_to_save);
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(
unsigned c,
Label* on_equal);
28 virtual void CheckCharacterAfterAnd(
unsigned c,
unsigned mask,
30 virtual void CheckCharacterGT(uc16 limit,
Label* on_greater);
31 virtual void CheckCharacterLT(uc16 limit,
Label* on_less);
34 virtual void CheckGreedyLoop(
Label* on_tos_equals_current_position);
35 virtual void CheckNotAtStart(
int cp_offset,
Label* on_not_at_start);
36 virtual void CheckNotBackReference(
int start_reg,
bool read_backward,
38 virtual void CheckNotBackReferenceIgnoreCase(
int start_reg,
39 bool read_backward,
bool unicode,
41 virtual void CheckNotCharacter(
unsigned c,
Label* on_not_equal);
42 virtual void CheckNotCharacterAfterAnd(
unsigned c,
unsigned mask,
44 virtual void CheckNotCharacterAfterMinusAnd(uc16 c, uc16 minus, uc16 mask,
46 virtual void CheckCharacterInRange(uc16 from, uc16 to,
Label* on_in_range);
47 virtual void CheckCharacterNotInRange(uc16 from, uc16 to,
48 Label* on_not_in_range);
53 virtual void CheckPosition(
int cp_offset,
Label* on_outside_input);
54 virtual bool CheckSpecialCharacterClass(uc16
type,
Label* on_no_match);
57 virtual void GoTo(
Label* label);
58 virtual void IfRegisterGE(
int reg,
int comparand,
Label* if_ge);
59 virtual void IfRegisterLT(
int reg,
int comparand,
Label* if_lt);
60 virtual void IfRegisterEqPos(
int reg,
Label* if_eq);
61 virtual IrregexpImplementation Implementation();
62 virtual void LoadCurrentCharacter(
int cp_offset,
Label* on_end_of_input,
63 bool check_bounds =
true,
65 virtual void PopCurrentPosition();
66 virtual void PopRegister(
int register_index);
67 virtual void PushBacktrack(
Label* label);
68 virtual void PushCurrentPosition();
69 virtual void PushRegister(
int register_index,
70 StackCheckFlag check_stack_limit);
71 virtual void ReadCurrentPositionFromRegister(
int reg);
72 virtual void ReadStackPointerFromRegister(
int reg);
73 virtual void SetCurrentPositionFromEnd(
int by);
74 virtual void SetRegister(
int register_index,
int to);
75 virtual bool Succeed();
76 virtual void WriteCurrentPositionToRegister(
int reg,
int cp_offset);
77 virtual void ClearRegisters(
int reg_from,
int reg_to);
78 virtual void WriteStackPointerToRegister(
int reg);
84 static int CheckStackGuardState(
Address* return_address,
Address raw_code,
89 static const int kFramePointer = 0;
93 static const int kStoredRegisters = kFramePointer;
94 static const int kCallerFrame =
95 kStoredRegisters + kCalleeRegisterSaveAreaSize;
97 static const int kCaptureArraySize = kCallerFrame;
98 static const int kStackAreaBase = kCallerFrame + kPointerSize;
100 static const int kIsolate = kStackAreaBase + 2 * kPointerSize;
104 static const int kDirectCall = kFramePointer - kPointerSize;
105 static const int kStackHighEnd = kDirectCall - kPointerSize;
106 static const int kNumOutputRegisters = kStackHighEnd - kPointerSize;
107 static const int kRegisterOutput = kNumOutputRegisters - kPointerSize;
108 static const int kInputEnd = kRegisterOutput - kPointerSize;
109 static const int kInputStart = kInputEnd - kPointerSize;
110 static const int kStartIndex = kInputStart - kPointerSize;
111 static const int kInputString = kStartIndex - kPointerSize;
114 static const int kSuccessfulCaptures = kInputString - kPointerSize;
115 static const int kStringStartMinusOne = kSuccessfulCaptures - kPointerSize;
117 static const int kRegisterZero = kStringStartMinusOne - kPointerSize;
120 static const size_t kRegExpCodeSize = 1024;
124 void LoadCurrentCharacterUnchecked(
int cp_offset,
int character_count);
127 void CheckPreemption();
130 void CheckStackLimit();
134 void CallCheckStackGuardState(
Register scratch);
137 MemOperand register_location(
int register_index);
141 inline Register current_input_offset() {
return r8; }
144 inline Register current_character() {
return r9; }
147 inline Register end_of_input_address() {
return r10; }
151 inline Register frame_pointer() {
return fp; }
155 inline Register backtrack_stackpointer() {
return r13; }
158 inline Register code_pointer() {
return r7; }
161 inline int char_size() {
return static_cast<int>(mode_); }
165 void BranchOrBacktrack(Condition condition,
Label* to,
CRegister cr = cr7);
169 inline void SafeCall(
Label* to, Condition cond = al,
CRegister cr = cr7);
170 inline void SafeReturn();
171 inline void SafeCallTarget(
Label* name);
181 Isolate* isolate()
const {
return masm_->isolate(); }
193 int num_saved_registers_;
198 Label success_label_;
199 Label backtrack_label_;
201 Label check_preempt_label_;
202 Label stack_overflow_label_;
203 Label internal_failure_label_;
207 const RegList kRegExpCalleeSaved =
208 1 << 6 | 1 << 7 | 1 << 8 | 1 << 9 | 1 << 10 | 1 << 11 | 1 << 13;
210 #endif // V8_INTERPRETED_REGEXP 214 #endif // V8_REGEXP_S390_REGEXP_MACRO_ASSEMBLER_S390_H_