OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_REGEXP_PPC_REGEXP_MACRO_ASSEMBLER_PPC_H_ | 5 #ifndef V8_S390_REGEXP_MACRO_ASSEMBLER_S390_H_ |
6 #define V8_REGEXP_PPC_REGEXP_MACRO_ASSEMBLER_PPC_H_ | 6 #define V8_S390_REGEXP_MACRO_ASSEMBLER_S390_H_ |
7 | 7 |
8 #include "src/macro-assembler.h" | 8 #include "src/macro-assembler.h" |
9 #include "src/ppc/assembler-ppc.h" | |
10 #include "src/ppc/frames-ppc.h" | |
11 #include "src/regexp/regexp-macro-assembler.h" | 9 #include "src/regexp/regexp-macro-assembler.h" |
| 10 #include "src/s390/assembler-s390.h" |
| 11 #include "src/s390/frames-s390.h" |
12 | 12 |
13 namespace v8 { | 13 namespace v8 { |
14 namespace internal { | 14 namespace internal { |
15 | 15 |
16 | |
17 #ifndef V8_INTERPRETED_REGEXP | 16 #ifndef V8_INTERPRETED_REGEXP |
18 class RegExpMacroAssemblerPPC : public NativeRegExpMacroAssembler { | 17 class RegExpMacroAssemblerS390 : public NativeRegExpMacroAssembler { |
19 public: | 18 public: |
20 RegExpMacroAssemblerPPC(Isolate* isolate, Zone* zone, Mode mode, | 19 RegExpMacroAssemblerS390(Isolate* isolate, Zone* zone, Mode mode, |
21 int registers_to_save); | 20 int registers_to_save); |
22 virtual ~RegExpMacroAssemblerPPC(); | 21 virtual ~RegExpMacroAssemblerS390(); |
23 virtual int stack_limit_slack(); | 22 virtual int stack_limit_slack(); |
24 virtual void AdvanceCurrentPosition(int by); | 23 virtual void AdvanceCurrentPosition(int by); |
25 virtual void AdvanceRegister(int reg, int by); | 24 virtual void AdvanceRegister(int reg, int by); |
26 virtual void Backtrack(); | 25 virtual void Backtrack(); |
27 virtual void Bind(Label* label); | 26 virtual void Bind(Label* label); |
28 virtual void CheckAtStart(Label* on_at_start); | 27 virtual void CheckAtStart(Label* on_at_start); |
29 virtual void CheckCharacter(unsigned c, Label* on_equal); | 28 virtual void CheckCharacter(unsigned c, Label* on_equal); |
30 virtual void CheckCharacterAfterAnd(unsigned c, unsigned mask, | 29 virtual void CheckCharacterAfterAnd(unsigned c, unsigned mask, |
31 Label* on_equal); | 30 Label* on_equal); |
32 virtual void CheckCharacterGT(uc16 limit, Label* on_greater); | 31 virtual void CheckCharacterGT(uc16 limit, Label* on_greater); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 // If the code object is relocated, the return address is fixed before | 83 // If the code object is relocated, the return address is fixed before |
85 // returning. | 84 // returning. |
86 static int CheckStackGuardState(Address* return_address, Code* re_code, | 85 static int CheckStackGuardState(Address* return_address, Code* re_code, |
87 Address re_frame); | 86 Address re_frame); |
88 | 87 |
89 private: | 88 private: |
90 // Offsets from frame_pointer() of function parameters and stored registers. | 89 // Offsets from frame_pointer() of function parameters and stored registers. |
91 static const int kFramePointer = 0; | 90 static const int kFramePointer = 0; |
92 | 91 |
93 // Above the frame pointer - Stored registers and stack passed parameters. | 92 // Above the frame pointer - Stored registers and stack passed parameters. |
94 // Register 25..31. | 93 // Register 6-15(sp) |
95 static const int kStoredRegisters = kFramePointer; | 94 static const int kStoredRegisters = kFramePointer; |
96 // Return address (stored from link register, read into pc on return). | 95 static const int kCallerFrame = |
97 static const int kReturnAddress = kStoredRegisters + 7 * kPointerSize; | 96 kStoredRegisters + kCalleeRegisterSaveAreaSize; |
98 static const int kCallerFrame = kReturnAddress + kPointerSize; | |
99 // Stack parameters placed by caller. | 97 // Stack parameters placed by caller. |
100 static const int kSecondaryReturnAddress = | 98 static const int kCaptureArraySize = kCallerFrame; |
101 kCallerFrame + kStackFrameExtraParamSlot * kPointerSize; | 99 static const int kStackAreaBase = kCallerFrame + kPointerSize; |
| 100 // kDirectCall again |
| 101 static const int kSecondaryReturnAddress = kStackAreaBase + 2 * kPointerSize; |
102 static const int kIsolate = kSecondaryReturnAddress + kPointerSize; | 102 static const int kIsolate = kSecondaryReturnAddress + kPointerSize; |
103 | 103 |
104 // Below the frame pointer. | 104 // Below the frame pointer. |
105 // Register parameters stored by setup code. | 105 // Register parameters stored by setup code. |
106 static const int kDirectCall = kFramePointer - kPointerSize; | 106 static const int kDirectCall = kFramePointer - kPointerSize; |
107 static const int kStackHighEnd = kDirectCall - kPointerSize; | 107 static const int kStackHighEnd = kDirectCall - kPointerSize; |
108 static const int kNumOutputRegisters = kStackHighEnd - kPointerSize; | 108 static const int kNumOutputRegisters = kStackHighEnd - kPointerSize; |
109 static const int kRegisterOutput = kNumOutputRegisters - kPointerSize; | 109 static const int kRegisterOutput = kNumOutputRegisters - kPointerSize; |
110 static const int kInputEnd = kRegisterOutput - kPointerSize; | 110 static const int kInputEnd = kRegisterOutput - kPointerSize; |
111 static const int kInputStart = kInputEnd - kPointerSize; | 111 static const int kInputStart = kInputEnd - kPointerSize; |
(...skipping 11 matching lines...) Expand all Loading... |
123 | 123 |
124 // Load a number of characters at the given offset from the | 124 // Load a number of characters at the given offset from the |
125 // current position, into the current-character register. | 125 // current position, into the current-character register. |
126 void LoadCurrentCharacterUnchecked(int cp_offset, int character_count); | 126 void LoadCurrentCharacterUnchecked(int cp_offset, int character_count); |
127 | 127 |
128 // Check whether preemption has been requested. | 128 // Check whether preemption has been requested. |
129 void CheckPreemption(); | 129 void CheckPreemption(); |
130 | 130 |
131 // Check whether we are exceeding the stack limit on the backtrack stack. | 131 // Check whether we are exceeding the stack limit on the backtrack stack. |
132 void CheckStackLimit(); | 132 void CheckStackLimit(); |
133 | 133 void CallCFunctionUsingStub(ExternalReference function, int num_arguments); |
134 | 134 |
135 // Generate a call to CheckStackGuardState. | 135 // Generate a call to CheckStackGuardState. |
136 void CallCheckStackGuardState(Register scratch); | 136 void CallCheckStackGuardState(Register scratch); |
137 | 137 |
138 // The ebp-relative location of a regexp register. | 138 // The ebp-relative location of a regexp register. |
139 MemOperand register_location(int register_index); | 139 MemOperand register_location(int register_index); |
140 | 140 |
141 // Register holding the current input position as negative offset from | 141 // Register holding the current input position as negative offset from |
142 // the end of the string. | 142 // the end of the string. |
143 inline Register current_input_offset() { return r27; } | 143 inline Register current_input_offset() { return r8; } |
144 | 144 |
145 // The register containing the current character after LoadCurrentCharacter. | 145 // The register containing the current character after LoadCurrentCharacter. |
146 inline Register current_character() { return r28; } | 146 inline Register current_character() { return r9; } |
147 | 147 |
148 // Register holding address of the end of the input string. | 148 // Register holding address of the end of the input string. |
149 inline Register end_of_input_address() { return r30; } | 149 inline Register end_of_input_address() { return r10; } |
150 | 150 |
151 // Register holding the frame address. Local variables, parameters and | 151 // Register holding the frame address. Local variables, parameters and |
152 // regexp registers are addressed relative to this. | 152 // regexp registers are addressed relative to this. |
153 inline Register frame_pointer() { return fp; } | 153 inline Register frame_pointer() { return fp; } |
154 | 154 |
155 // The register containing the backtrack stack top. Provides a meaningful | 155 // The register containing the backtrack stack top. Provides a meaningful |
156 // name to the register. | 156 // name to the register. |
157 inline Register backtrack_stackpointer() { return r29; } | 157 inline Register backtrack_stackpointer() { return r13; } |
158 | 158 |
159 // Register holding pointer to the current code object. | 159 // Register holding pointer to the current code object. |
160 inline Register code_pointer() { return r26; } | 160 inline Register code_pointer() { return r7; } |
161 | 161 |
162 // Byte size of chars in the string to match (decided by the Mode argument) | 162 // Byte size of chars in the string to match (decided by the Mode argument) |
163 inline int char_size() { return static_cast<int>(mode_); } | 163 inline int char_size() { return static_cast<int>(mode_); } |
164 | 164 |
165 // Equivalent to a conditional branch to the label, unless the label | 165 // Equivalent to a conditional branch to the label, unless the label |
166 // is NULL, in which case it is a conditional Backtrack. | 166 // is NULL, in which case it is a conditional Backtrack. |
167 void BranchOrBacktrack(Condition condition, Label* to, CRegister cr = cr7); | 167 void BranchOrBacktrack(Condition condition, Label* to, CRegister cr = cr7); |
168 | 168 |
169 // Call and return internally in the generated code in a way that | 169 // Call and return internally in the generated code in a way that |
170 // is GC-safe (i.e., doesn't leave absolute code addresses on the stack) | 170 // is GC-safe (i.e., doesn't leave absolute code addresses on the stack) |
(...skipping 29 matching lines...) Expand all Loading... |
200 Label success_label_; | 200 Label success_label_; |
201 Label backtrack_label_; | 201 Label backtrack_label_; |
202 Label exit_label_; | 202 Label exit_label_; |
203 Label check_preempt_label_; | 203 Label check_preempt_label_; |
204 Label stack_overflow_label_; | 204 Label stack_overflow_label_; |
205 Label internal_failure_label_; | 205 Label internal_failure_label_; |
206 }; | 206 }; |
207 | 207 |
208 // Set of non-volatile registers saved/restored by generated regexp code. | 208 // Set of non-volatile registers saved/restored by generated regexp code. |
209 const RegList kRegExpCalleeSaved = | 209 const RegList kRegExpCalleeSaved = |
210 1 << 25 | 1 << 26 | 1 << 27 | 1 << 28 | 1 << 29 | 1 << 30 | 1 << 31; | 210 1 << 6 | 1 << 7 | 1 << 8 | 1 << 9 | 1 << 10 | 1 << 11 | 1 << 13; |
211 | 211 |
212 #endif // V8_INTERPRETED_REGEXP | 212 #endif // V8_INTERPRETED_REGEXP |
213 } // namespace internal | 213 } // namespace internal |
214 } // namespace v8 | 214 } // namespace v8 |
215 | 215 |
216 #endif // V8_REGEXP_PPC_REGEXP_MACRO_ASSEMBLER_PPC_H_ | 216 #endif // V8_S390_REGEXP_MACRO_ASSEMBLER_S390_H_ |
OLD | NEW |