Index: src/regexp-macro-assembler-ia32.cc |
=================================================================== |
--- src/regexp-macro-assembler-ia32.cc (revision 1004) |
+++ src/regexp-macro-assembler-ia32.cc (working copy) |
@@ -154,7 +154,7 @@ |
} |
-void RegExpMacroAssemblerIA32::CheckCharacter(uc16 c, Label* on_equal) { |
+void RegExpMacroAssemblerIA32::CheckCharacter(uint32_t c, Label* on_equal) { |
__ cmp(current_character(), c); |
BranchOrBacktrack(equal, on_equal); |
} |
@@ -365,28 +365,41 @@ |
} |
-void RegExpMacroAssemblerIA32::CheckNotCharacter(uc16 c, Label* on_not_equal) { |
+void RegExpMacroAssemblerIA32::CheckNotCharacter(uint32_t c, |
+ Label* on_not_equal) { |
__ cmp(current_character(), c); |
BranchOrBacktrack(not_equal, on_not_equal); |
} |
-void RegExpMacroAssemblerIA32::CheckNotCharacterAfterOr(uc16 c, |
- uc16 mask, |
- Label* on_not_equal) { |
+void RegExpMacroAssemblerIA32::CheckCharacterAfterAnd(uint32_t c, |
+ uint32_t mask, |
+ Label* on_equal) { |
__ mov(eax, current_character()); |
- __ or_(eax, mask); |
+ __ and_(eax, mask); |
__ cmp(eax, c); |
+ BranchOrBacktrack(equal, on_equal); |
+} |
+ |
+ |
+void RegExpMacroAssemblerIA32::CheckNotCharacterAfterAnd(uint32_t c, |
+ uint32_t mask, |
+ Label* on_not_equal) { |
+ __ mov(eax, current_character()); |
+ __ and_(eax, mask); |
+ __ cmp(eax, c); |
BranchOrBacktrack(not_equal, on_not_equal); |
} |
-void RegExpMacroAssemblerIA32::CheckNotCharacterAfterMinusOr( |
+void RegExpMacroAssemblerIA32::CheckNotCharacterAfterMinusAnd( |
uc16 c, |
+ uc16 minus, |
uc16 mask, |
Label* on_not_equal) { |
- __ lea(eax, Operand(current_character(), -mask)); |
- __ or_(eax, mask); |
+ ASSERT(minus < String::kMaxUC16CharCode); |
+ __ lea(eax, Operand(current_character(), -minus)); |
+ __ and_(eax, mask); |
__ cmp(eax, c); |
BranchOrBacktrack(not_equal, on_not_equal); |
} |
@@ -516,7 +529,7 @@ |
Label at_start; |
__ cmp(Operand(ebp, kAtStart), Immediate(0)); |
__ j(not_equal, &at_start); |
- LoadCurrentCharacterUnchecked(-1); // Load previous char. |
+ LoadCurrentCharacterUnchecked(-1, 1); // Load previous char. |
__ jmp(&start_label_); |
__ bind(&at_start); |
__ mov(current_character(), '\n'); |
@@ -631,12 +644,16 @@ |
void RegExpMacroAssemblerIA32::LoadCurrentCharacter(int cp_offset, |
- Label* on_end_of_input) { |
+ Label* on_end_of_input, |
+ bool check_bounds, |
+ int characters) { |
ASSERT(cp_offset >= 0); |
ASSERT(cp_offset < (1<<30)); // Be sane! (And ensure negation works) |
- __ cmp(edi, -cp_offset * char_size()); |
- BranchOrBacktrack(greater_equal, on_end_of_input); |
- LoadCurrentCharacterUnchecked(cp_offset); |
+ if (check_bounds) { |
+ __ cmp(edi, -(cp_offset + characters) * char_size()); |
+ BranchOrBacktrack(greater, on_end_of_input); |
+ } |
+ LoadCurrentCharacterUnchecked(cp_offset, characters); |
} |
@@ -871,13 +888,27 @@ |
} |
-void RegExpMacroAssemblerIA32::LoadCurrentCharacterUnchecked(int cp_offset) { |
+void RegExpMacroAssemblerIA32::LoadCurrentCharacterUnchecked(int cp_offset, |
+ int characters) { |
if (mode_ == ASCII) { |
- __ movzx_b(current_character(), Operand(esi, edi, times_1, cp_offset)); |
+ if (characters == 4) { |
+ __ mov(current_character(), Operand(esi, edi, times_1, cp_offset)); |
+ } else if (characters == 2) { |
+ __ movzx_w(current_character(), Operand(esi, edi, times_1, cp_offset)); |
+ } else { |
+ ASSERT(characters == 1); |
+ __ movzx_b(current_character(), Operand(esi, edi, times_1, cp_offset)); |
+ } |
} else { |
ASSERT(mode_ == UC16); |
- __ movzx_w(current_character(), |
- Operand(esi, edi, times_1, cp_offset * sizeof(uc16))); |
+ if (characters == 2) { |
+ __ mov(current_character(), |
+ Operand(esi, edi, times_1, cp_offset * sizeof(uc16))); |
+ } else { |
+ ASSERT(characters == 1); |
+ __ movzx_w(current_character(), |
+ Operand(esi, edi, times_1, cp_offset * sizeof(uc16))); |
+ } |
} |
} |