| 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);
|
|
|