Index: src/ia32/codegen-ia32.cc |
=================================================================== |
--- src/ia32/codegen-ia32.cc (revision 4853) |
+++ src/ia32/codegen-ia32.cc (working copy) |
@@ -11305,58 +11305,58 @@ |
// ecx: RegExp data (FixedArray) |
// Check the representation and encoding of the subject string. |
- Label seq_string, seq_two_byte_string, check_code; |
- const int kStringRepresentationEncodingMask = |
- kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask; |
+ Label seq_ascii_string, seq_two_byte_string, check_code; |
__ mov(eax, Operand(esp, kSubjectOffset)); |
__ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); |
__ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); |
- __ and_(ebx, kStringRepresentationEncodingMask); |
- // First check for sequential string. |
- ASSERT_EQ(0, kStringTag); |
- ASSERT_EQ(0, kSeqStringTag); |
+ // First check for flat two byte string. |
+ __ and_(ebx, |
+ kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask); |
+ ASSERT_EQ(0, kStringTag | kSeqStringTag | kTwoByteStringTag); |
+ __ j(zero, &seq_two_byte_string); |
+ // Any other flat string must be a flat ascii string. |
__ test(Operand(ebx), |
Immediate(kIsNotStringMask | kStringRepresentationMask)); |
- __ j(zero, &seq_string); |
+ __ j(zero, &seq_ascii_string); |
// Check for flat cons string. |
// A flat cons string is a cons string where the second part is the empty |
// string. In that case the subject string is just the first part of the cons |
// string. Also in this case the first part of the cons string is known to be |
// a sequential string or an external string. |
- __ and_(ebx, kStringRepresentationMask); |
- __ cmp(ebx, kConsStringTag); |
- __ j(not_equal, &runtime); |
+ ASSERT(kExternalStringTag !=0); |
+ ASSERT_EQ(0, kConsStringTag & kExternalStringTag); |
+ __ test(Operand(ebx), |
+ Immediate(kIsNotStringMask | kExternalStringTag)); |
+ __ j(not_zero, &runtime); |
+ // String is a cons string. |
__ mov(edx, FieldOperand(eax, ConsString::kSecondOffset)); |
__ cmp(Operand(edx), Factory::empty_string()); |
__ j(not_equal, &runtime); |
__ mov(eax, FieldOperand(eax, ConsString::kFirstOffset)); |
__ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); |
- __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); |
- ASSERT_EQ(0, kSeqStringTag); |
- __ test(ebx, Immediate(kStringRepresentationMask)); |
+ // String is a cons string with empty second part. |
+ // eax: first part of cons string. |
+ // ebx: map of first part of cons string. |
+ // Is first part a flat two byte string? |
+ __ test_b(FieldOperand(ebx, Map::kInstanceTypeOffset), |
+ kStringRepresentationMask | kStringEncodingMask); |
+ ASSERT_EQ(0, kSeqStringTag | kTwoByteStringTag); |
+ __ j(zero, &seq_two_byte_string); |
+ // Any other flat string must be ascii. |
+ __ test_b(FieldOperand(ebx, Map::kInstanceTypeOffset), |
+ kStringRepresentationMask); |
__ j(not_zero, &runtime); |
- __ and_(ebx, kStringRepresentationEncodingMask); |
- __ bind(&seq_string); |
- // eax: subject string (sequential either ascii to two byte) |
- // ebx: suject string type & kStringRepresentationEncodingMask |
+ __ bind(&seq_ascii_string); |
+ // eax: subject string (flat ascii) |
// ecx: RegExp data (FixedArray) |
- // Check that the irregexp code has been generated for an ascii string. If |
- // it has, the field contains a code object otherwise it contains the hole. |
- const int kSeqTwoByteString = kStringTag | kSeqStringTag | kTwoByteStringTag; |
- __ cmp(ebx, kSeqTwoByteString); |
- __ j(equal, &seq_two_byte_string); |
- if (FLAG_debug_code) { |
- __ cmp(ebx, kStringTag | kSeqStringTag | kAsciiStringTag); |
- __ Check(equal, "Expected sequential ascii string"); |
- } |
__ mov(edx, FieldOperand(ecx, JSRegExp::kDataAsciiCodeOffset)); |
__ Set(edi, Immediate(1)); // Type is ascii. |
__ jmp(&check_code); |
__ bind(&seq_two_byte_string); |
- // eax: subject string |
+ // eax: subject string (flat two byte) |
// ecx: RegExp data (FixedArray) |
__ mov(edx, FieldOperand(ecx, JSRegExp::kDataUC16CodeOffset)); |
__ Set(edi, Immediate(0)); // Type is two byte. |
@@ -12897,7 +12897,7 @@ |
__ j(zero, &string_add_runtime); |
__ bind(&make_flat_ascii_string); |
- // Both strings are ascii strings. As they are short they are both flat. |
+ // Both strings are ascii strings. As they are short they are both flat. |
// ebx: length of resulting flat string as a smi |
__ SmiUntag(ebx); |
__ AllocateAsciiString(eax, ebx, ecx, edx, edi, &string_add_runtime); |