Index: src/ia32/regexp-macro-assembler-ia32.cc |
diff --git a/src/ia32/regexp-macro-assembler-ia32.cc b/src/ia32/regexp-macro-assembler-ia32.cc |
index e41f9c3f0c2321291a5b832982ff79c27f7a69b3..7d6056de5f94f80a701d00dddfe97d9ff423e3d0 100644 |
--- a/src/ia32/regexp-macro-assembler-ia32.cc |
+++ b/src/ia32/regexp-macro-assembler-ia32.cc |
@@ -539,46 +539,33 @@ bool RegExpMacroAssemblerIA32::CheckSpecialCharacterClass(uc16 type, |
return true; |
} |
case 'w': { |
- Label done, check_digits; |
- __ cmp(Operand(current_character()), Immediate('9')); |
- __ j(less_equal, &check_digits); |
- __ cmp(Operand(current_character()), Immediate('_')); |
- __ j(equal, &done); |
- // Convert to lower case if letter. |
- __ mov(Operand(eax), current_character()); |
- __ or_(eax, 0x20); |
- // check current character in range ['a'..'z'], nondestructively. |
- __ sub(Operand(eax), Immediate('a')); |
- __ cmp(Operand(eax), Immediate('z' - 'a')); |
- BranchOrBacktrack(above, on_no_match); |
- __ jmp(&done); |
- __ bind(&check_digits); |
- // Check current character in range ['0'..'9']. |
- __ cmp(Operand(current_character()), Immediate('0')); |
- BranchOrBacktrack(below, on_no_match); |
- __ bind(&done); |
- |
+ if (mode_ != ASCII) { |
+ // Table is 128 bits, so all ASCII characters can be tested. |
Erik Corry
2010/01/15 12:02:09
bytes.
|
+ __ cmp(Operand(current_character()), Immediate('z')); |
+ BranchOrBacktrack(above, on_no_match); |
+ } |
+ ASSERT_EQ(0, word_character_map[0]); // Character '\0' is not a word char. |
Erik Corry
2010/01/15 12:02:09
Perhaps also assert that word_character_map['a'] i
Lasse Reichstein
2010/01/18 09:56:52
I'll put it in the comment at the table declaratio
|
+ ExternalReference word_map = ExternalReference::re_word_character_map(); |
+ __ test_b(current_character(), |
+ Operand::StaticArray(current_character(), times_1, word_map)); |
+ BranchOrBacktrack(zero, on_no_match); |
return true; |
} |
case 'W': { |
- Label done, check_digits; |
- __ cmp(Operand(current_character()), Immediate('9')); |
- __ j(less_equal, &check_digits); |
- __ cmp(Operand(current_character()), Immediate('_')); |
- BranchOrBacktrack(equal, on_no_match); |
- // Convert to lower case if letter. |
- __ mov(Operand(eax), current_character()); |
- __ or_(eax, 0x20); |
- // check current character in range ['a'..'z'], nondestructively. |
- __ sub(Operand(eax), Immediate('a')); |
- __ cmp(Operand(eax), Immediate('z' - 'a')); |
- BranchOrBacktrack(below_equal, on_no_match); |
- __ jmp(&done); |
- __ bind(&check_digits); |
- // Check current character in range ['0'..'9']. |
- __ cmp(Operand(current_character()), Immediate('0')); |
- BranchOrBacktrack(above_equal, on_no_match); |
- __ bind(&done); |
+ Label done; |
+ if (mode_ != ASCII) { |
+ // Table is 128 bits, so all ASCII characters can be tested. |
Erik Corry
2010/01/15 12:02:09
bytes
|
+ __ cmp(Operand(current_character()), Immediate('z')); |
+ __ j(above, &done); |
+ } |
+ ASSERT_EQ(0, word_character_map[0]); // Character '\0' is not a word char. |
+ ExternalReference word_map = ExternalReference::re_word_character_map(); |
+ __ test_b(current_character(), |
+ Operand::StaticArray(current_character(), times_1, word_map)); |
+ BranchOrBacktrack(not_zero, on_no_match); |
+ if (mode_ != ASCII) { |
+ __ bind(&done); |
+ } |
return true; |
} |
// Non-standard classes (with no syntactic shorthand) used internally. |