Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1279)

Unified Diff: src/regexp/mips64/regexp-macro-assembler-mips64.cc

Issue 1451373003: Revert of Experimental support for RegExp lookbehind. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/regexp/mips64/regexp-macro-assembler-mips64.h ('k') | src/regexp/regexp-macro-assembler.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/regexp/mips64/regexp-macro-assembler-mips64.cc
diff --git a/src/regexp/mips64/regexp-macro-assembler-mips64.cc b/src/regexp/mips64/regexp-macro-assembler-mips64.cc
index d774b14016b7fcf35eccfd1cb0864446235f982a..869cbc4f2e20398595bb421ad65d6e8c1517685b 100644
--- a/src/regexp/mips64/regexp-macro-assembler-mips64.cc
+++ b/src/regexp/mips64/regexp-macro-assembler-mips64.cc
@@ -61,7 +61,7 @@
* - fp[-16] void* input_string (location of a handle containing the string).
* - fp[-20] success counter (only for global regexps to count matches).
* - fp[-24] Offset of location before start of input (effectively character
- * string start - 1). Used to initialize capture registers to a
+ * position -1). Used to initialize capture registers to a
* non-position.
* - fp[-28] At start (if 1, we are starting at the start of the
* string, otherwise 0)
@@ -91,7 +91,7 @@
* - fp[-56] start index (character index of start). kStartIndex
* - fp[-64] void* input_string (location of a handle containing the string). kInputString
* - fp[-72] success counter (only for global regexps to count matches). kSuccessfulCaptures
- * - fp[-80] Offset of location before start of input (effectively character kStringStartMinusOne
+ * - fp[-80] Offset of location before start of input (effectively character kInputStartMinusOne
* position -1). Used to initialize capture registers to a
* non-position.
* --------- The following output registers are 32-bit values. ---------
@@ -217,17 +217,26 @@
void RegExpMacroAssemblerMIPS::CheckAtStart(Label* on_at_start) {
- __ ld(a1, MemOperand(frame_pointer(), kStringStartMinusOne));
- __ Daddu(a0, current_input_offset(), Operand(-char_size()));
+ Label not_at_start;
+ // Did we start the match at the start of the string at all?
+ __ ld(a0, MemOperand(frame_pointer(), kStartIndex));
+ BranchOrBacktrack(&not_at_start, ne, a0, Operand(zero_reg));
+
+ // If we did, are we still at the start of the input?
+ __ ld(a1, MemOperand(frame_pointer(), kInputStart));
+ __ Daddu(a0, end_of_input_address(), Operand(current_input_offset()));
BranchOrBacktrack(on_at_start, eq, a0, Operand(a1));
-}
-
-
-void RegExpMacroAssemblerMIPS::CheckNotAtStart(int cp_offset,
- Label* on_not_at_start) {
- __ ld(a1, MemOperand(frame_pointer(), kStringStartMinusOne));
- __ Daddu(a0, current_input_offset(),
- Operand(-char_size() + cp_offset * char_size()));
+ __ bind(&not_at_start);
+}
+
+
+void RegExpMacroAssemblerMIPS::CheckNotAtStart(Label* on_not_at_start) {
+ // Did we start the match at the start of the string at all?
+ __ ld(a0, MemOperand(frame_pointer(), kStartIndex));
+ BranchOrBacktrack(on_not_at_start, ne, a0, Operand(zero_reg));
+ // If we did, are we still at the start of the input?
+ __ ld(a1, MemOperand(frame_pointer(), kInputStart));
+ __ Daddu(a0, end_of_input_address(), Operand(current_input_offset()));
BranchOrBacktrack(on_not_at_start, ne, a0, Operand(a1));
}
@@ -250,26 +259,20 @@
void RegExpMacroAssemblerMIPS::CheckNotBackReferenceIgnoreCase(
- int start_reg, bool read_backward, Label* on_no_match) {
+ int start_reg,
+ Label* on_no_match) {
Label fallthrough;
__ ld(a0, register_location(start_reg)); // Index of start of capture.
__ ld(a1, register_location(start_reg + 1)); // Index of end of capture.
__ Dsubu(a1, a1, a0); // Length of capture.
- // At this point, the capture registers are either both set or both cleared.
- // If the capture length is zero, then the capture is either empty or cleared.
- // Fall through in both cases.
+ // If length is zero, either the capture is empty or it is not participating.
+ // In either case succeed immediately.
__ Branch(&fallthrough, eq, a1, Operand(zero_reg));
- if (read_backward) {
- __ ld(t1, MemOperand(frame_pointer(), kStringStartMinusOne));
- __ Daddu(t1, t1, a1);
- BranchOrBacktrack(on_no_match, le, current_input_offset(), Operand(t1));
- } else {
- __ Daddu(t1, a1, current_input_offset());
- // Check that there are enough characters left in the input.
- BranchOrBacktrack(on_no_match, gt, t1, Operand(zero_reg));
- }
+ __ Daddu(t1, a1, current_input_offset());
+ // Check that there are enough characters left in the input.
+ BranchOrBacktrack(on_no_match, gt, t1, Operand(zero_reg));
if (mode_ == LATIN1) {
Label success;
@@ -280,9 +283,6 @@
// a1 - length of capture.
__ Daddu(a0, a0, Operand(end_of_input_address()));
__ Daddu(a2, end_of_input_address(), Operand(current_input_offset()));
- if (read_backward) {
- __ Dsubu(a2, a2, Operand(a1));
- }
__ Daddu(a1, a0, Operand(a1));
// a0 - Address of start of capture.
@@ -321,12 +321,6 @@
__ bind(&success);
// Compute new value of character position after the matched part.
__ Dsubu(current_input_offset(), a2, end_of_input_address());
- if (read_backward) {
- __ ld(t1, register_location(start_reg)); // Index of start of capture.
- __ ld(a2, register_location(start_reg + 1)); // Index of end of capture.
- __ Daddu(current_input_offset(), current_input_offset(), Operand(t1));
- __ Dsubu(current_input_offset(), current_input_offset(), Operand(a2));
- }
} else {
DCHECK(mode_ == UC16);
// Put regexp engine registers on stack.
@@ -355,9 +349,6 @@
__ mov(s3, a1);
// Address of current input position.
__ Daddu(a1, current_input_offset(), Operand(end_of_input_address()));
- if (read_backward) {
- __ Dsubu(a1, a1, Operand(s3));
- }
// Isolate.
__ li(a3, Operand(ExternalReference::isolate_address(masm_->isolate())));
@@ -376,20 +367,16 @@
// Check if function returned non-zero for success or zero for failure.
BranchOrBacktrack(on_no_match, eq, v0, Operand(zero_reg));
// On success, increment position by length of capture.
- if (read_backward) {
- __ Dsubu(current_input_offset(), current_input_offset(), Operand(s3));
- } else {
- __ Daddu(current_input_offset(), current_input_offset(), Operand(s3));
- }
+ __ Daddu(current_input_offset(), current_input_offset(), Operand(s3));
}
__ bind(&fallthrough);
}
-void RegExpMacroAssemblerMIPS::CheckNotBackReference(int start_reg,
- bool read_backward,
- Label* on_no_match) {
+void RegExpMacroAssemblerMIPS::CheckNotBackReference(
+ int start_reg,
+ Label* on_no_match) {
Label fallthrough;
Label success;
@@ -397,28 +384,16 @@
__ ld(a0, register_location(start_reg));
__ ld(a1, register_location(start_reg + 1));
__ Dsubu(a1, a1, a0); // Length to check.
-
- // At this point, the capture registers are either both set or both cleared.
- // If the capture length is zero, then the capture is either empty or cleared.
- // Fall through in both cases.
+ // Succeed on empty capture (including no capture).
__ Branch(&fallthrough, eq, a1, Operand(zero_reg));
- if (read_backward) {
- __ ld(t1, MemOperand(frame_pointer(), kStringStartMinusOne));
- __ Daddu(t1, t1, a1);
- BranchOrBacktrack(on_no_match, le, current_input_offset(), Operand(t1));
- } else {
- __ Daddu(t1, a1, current_input_offset());
- // Check that there are enough characters left in the input.
- BranchOrBacktrack(on_no_match, gt, t1, Operand(zero_reg));
- }
+ __ Daddu(t1, a1, current_input_offset());
+ // Check that there are enough characters left in the input.
+ BranchOrBacktrack(on_no_match, gt, t1, Operand(zero_reg));
// Compute pointers to match string and capture string.
__ Daddu(a0, a0, Operand(end_of_input_address()));
__ Daddu(a2, end_of_input_address(), Operand(current_input_offset()));
- if (read_backward) {
- __ Dsubu(a2, a2, Operand(a1));
- }
__ Daddu(a1, a1, Operand(a0));
Label loop;
@@ -440,12 +415,6 @@
// Move current character position to position after match.
__ Dsubu(current_input_offset(), a2, end_of_input_address());
- if (read_backward) {
- __ ld(t1, register_location(start_reg)); // Index of start of capture.
- __ ld(a2, register_location(start_reg + 1)); // Index of end of capture.
- __ Daddu(current_input_offset(), current_input_offset(), Operand(t1));
- __ Dsubu(current_input_offset(), current_input_offset(), Operand(a2));
- }
__ bind(&fallthrough);
}
@@ -675,7 +644,7 @@
__ Daddu(frame_pointer(), sp, Operand(8 * kPointerSize));
__ mov(a0, zero_reg);
__ push(a0); // Make room for success counter and initialize it to 0.
- __ push(a0); // Make room for "string start - 1" constant.
+ __ push(a0); // Make room for "position - 1" constant (value irrelevant).
// Check if we have space on the stack for registers.
Label stack_limit_hit;
@@ -718,7 +687,7 @@
__ Dsubu(a0, a0, t1);
// Store this value in a local variable, for use when clearing
// position registers.
- __ sd(a0, MemOperand(frame_pointer(), kStringStartMinusOne));
+ __ sd(a0, MemOperand(frame_pointer(), kInputStartMinusOne));
// Initialize code pointer register
__ li(code_pointer(), Operand(masm_->CodeObject()), CONSTANT_SIZE);
@@ -828,7 +797,7 @@
__ sd(a2, MemOperand(frame_pointer(), kRegisterOutput));
// Prepare a0 to initialize registers with its value in the next run.
- __ ld(a0, MemOperand(frame_pointer(), kStringStartMinusOne));
+ __ ld(a0, MemOperand(frame_pointer(), kInputStartMinusOne));
if (global_with_zero_length_check()) {
// Special case for zero-length matches.
@@ -982,13 +951,10 @@
Label* on_end_of_input,
bool check_bounds,
int characters) {
+ DCHECK(cp_offset >= -1); // ^ and \b can look behind one character.
DCHECK(cp_offset < (1<<30)); // Be sane! (And ensure negation works).
if (check_bounds) {
- if (cp_offset >= 0) {
- CheckPosition(cp_offset + characters - 1, on_end_of_input);
- } else {
- CheckPosition(cp_offset, on_end_of_input);
- }
+ CheckPosition(cp_offset + characters - 1, on_end_of_input);
}
LoadCurrentCharacterUnchecked(cp_offset, characters);
}
@@ -1096,7 +1062,7 @@
void RegExpMacroAssemblerMIPS::ClearRegisters(int reg_from, int reg_to) {
DCHECK(reg_from <= reg_to);
- __ ld(a0, MemOperand(frame_pointer(), kStringStartMinusOne));
+ __ ld(a0, MemOperand(frame_pointer(), kInputStartMinusOne));
for (int reg = reg_from; reg <= reg_to; reg++) {
__ sd(a0, register_location(reg));
}
@@ -1209,14 +1175,10 @@
void RegExpMacroAssemblerMIPS::CheckPosition(int cp_offset,
Label* on_outside_input) {
- if (cp_offset >= 0) {
- BranchOrBacktrack(on_outside_input, ge, current_input_offset(),
- Operand(-cp_offset * char_size()));
- } else {
- __ ld(a1, MemOperand(frame_pointer(), kStringStartMinusOne));
- __ Daddu(a0, current_input_offset(), Operand(cp_offset * char_size()));
- BranchOrBacktrack(on_outside_input, le, a0, Operand(a1));
- }
+ BranchOrBacktrack(on_outside_input,
+ ge,
+ current_input_offset(),
+ Operand(-cp_offset * char_size()));
}
« no previous file with comments | « src/regexp/mips64/regexp-macro-assembler-mips64.h ('k') | src/regexp/regexp-macro-assembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698