OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #if V8_TARGET_ARCH_ARM | 5 #if V8_TARGET_ARCH_ARM |
6 | 6 |
7 #include "src/regexp/arm/regexp-macro-assembler-arm.h" | 7 #include "src/regexp/arm/regexp-macro-assembler-arm.h" |
8 | 8 |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/log.h" | 10 #include "src/log.h" |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 void RegExpMacroAssemblerARM::CheckGreedyLoop(Label* on_equal) { | 203 void RegExpMacroAssemblerARM::CheckGreedyLoop(Label* on_equal) { |
204 __ ldr(r0, MemOperand(backtrack_stackpointer(), 0)); | 204 __ ldr(r0, MemOperand(backtrack_stackpointer(), 0)); |
205 __ cmp(current_input_offset(), r0); | 205 __ cmp(current_input_offset(), r0); |
206 __ add(backtrack_stackpointer(), | 206 __ add(backtrack_stackpointer(), |
207 backtrack_stackpointer(), Operand(kPointerSize), LeaveCC, eq); | 207 backtrack_stackpointer(), Operand(kPointerSize), LeaveCC, eq); |
208 BranchOrBacktrack(eq, on_equal); | 208 BranchOrBacktrack(eq, on_equal); |
209 } | 209 } |
210 | 210 |
211 | 211 |
212 void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase( | 212 void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase( |
213 int start_reg, bool read_backward, Label* on_no_match) { | 213 int start_reg, bool read_backward, bool unicode, Label* on_no_match) { |
214 Label fallthrough; | 214 Label fallthrough; |
215 __ ldr(r0, register_location(start_reg)); // Index of start of capture | 215 __ ldr(r0, register_location(start_reg)); // Index of start of capture |
216 __ ldr(r1, register_location(start_reg + 1)); // Index of end of capture | 216 __ ldr(r1, register_location(start_reg + 1)); // Index of end of capture |
217 __ sub(r1, r1, r0, SetCC); // Length of capture. | 217 __ sub(r1, r1, r0, SetCC); // Length of capture. |
218 | 218 |
219 // At this point, the capture registers are either both set or both cleared. | 219 // At this point, the capture registers are either both set or both cleared. |
220 // If the capture length is zero, then the capture is either empty or cleared. | 220 // If the capture length is zero, then the capture is either empty or cleared. |
221 // Fall through in both cases. | 221 // Fall through in both cases. |
222 __ b(eq, &fallthrough); | 222 __ b(eq, &fallthrough); |
223 | 223 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
295 __ PrepareCallCFunction(argument_count, r2); | 295 __ PrepareCallCFunction(argument_count, r2); |
296 | 296 |
297 // r0 - offset of start of capture | 297 // r0 - offset of start of capture |
298 // r1 - length of capture | 298 // r1 - length of capture |
299 | 299 |
300 // Put arguments into arguments registers. | 300 // Put arguments into arguments registers. |
301 // Parameters are | 301 // Parameters are |
302 // r0: Address byte_offset1 - Address captured substring's start. | 302 // r0: Address byte_offset1 - Address captured substring's start. |
303 // r1: Address byte_offset2 - Address of current character position. | 303 // r1: Address byte_offset2 - Address of current character position. |
304 // r2: size_t byte_length - length of capture in bytes(!) | 304 // r2: size_t byte_length - length of capture in bytes(!) |
305 // r3: Isolate* isolate | 305 // r3: Isolate* isolate or 0 if unicode flag. |
306 | 306 |
307 // Address of start of capture. | 307 // Address of start of capture. |
308 __ add(r0, r0, Operand(end_of_input_address())); | 308 __ add(r0, r0, Operand(end_of_input_address())); |
309 // Length of capture. | 309 // Length of capture. |
310 __ mov(r2, Operand(r1)); | 310 __ mov(r2, Operand(r1)); |
311 // Save length in callee-save register for use on return. | 311 // Save length in callee-save register for use on return. |
312 __ mov(r4, Operand(r1)); | 312 __ mov(r4, Operand(r1)); |
313 // Address of current input position. | 313 // Address of current input position. |
314 __ add(r1, current_input_offset(), end_of_input_address()); | 314 __ add(r1, current_input_offset(), end_of_input_address()); |
315 if (read_backward) { | 315 if (read_backward) { |
316 __ sub(r1, r1, r4); | 316 __ sub(r1, r1, r4); |
317 } | 317 } |
318 // Isolate. | 318 // Isolate. |
319 __ mov(r3, Operand(ExternalReference::isolate_address(isolate()))); | 319 #ifdef V8_I18N_SUPPORT |
| 320 if (unicode) { |
| 321 __ mov(r3, Operand(0)); |
| 322 } else // NOLINT |
| 323 #endif // V8_I18N_SUPPORT |
| 324 { |
| 325 __ mov(r3, Operand(ExternalReference::isolate_address(isolate()))); |
| 326 } |
320 | 327 |
321 { | 328 { |
322 AllowExternalCallThatCantCauseGC scope(masm_); | 329 AllowExternalCallThatCantCauseGC scope(masm_); |
323 ExternalReference function = | 330 ExternalReference function = |
324 ExternalReference::re_case_insensitive_compare_uc16(isolate()); | 331 ExternalReference::re_case_insensitive_compare_uc16(isolate()); |
325 __ CallCFunction(function, argument_count); | 332 __ CallCFunction(function, argument_count); |
326 } | 333 } |
327 | 334 |
328 // Check if function returned non-zero for success or zero for failure. | 335 // Check if function returned non-zero for success or zero for failure. |
329 __ cmp(r0, Operand::Zero()); | 336 __ cmp(r0, Operand::Zero()); |
(...skipping 903 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1233 | 1240 |
1234 | 1241 |
1235 #undef __ | 1242 #undef __ |
1236 | 1243 |
1237 #endif // V8_INTERPRETED_REGEXP | 1244 #endif // V8_INTERPRETED_REGEXP |
1238 | 1245 |
1239 } // namespace internal | 1246 } // namespace internal |
1240 } // namespace v8 | 1247 } // namespace v8 |
1241 | 1248 |
1242 #endif // V8_TARGET_ARCH_ARM | 1249 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |