| Index: src/ia32/code-stubs-ia32.cc
|
| diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
|
| index 85e74b85667ec4aaaf4e53406665817638a81216..f3eb09fa5150b49f756a4979128b3d6309bf8810 100644
|
| --- a/src/ia32/code-stubs-ia32.cc
|
| +++ b/src/ia32/code-stubs-ia32.cc
|
| @@ -4907,7 +4907,8 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) {
|
|
|
| // Check for 1-byte or 2-byte string.
|
| __ bind(&flat_string);
|
| - STATIC_ASSERT(kAsciiStringTag != 0);
|
| + STATIC_ASSERT((kStringEncodingMask & kAsciiStringTag) != 0);
|
| + STATIC_ASSERT((kStringEncodingMask & kTwoByteStringTag) == 0);
|
| __ test(result_, Immediate(kStringEncodingMask));
|
| __ j(not_zero, &ascii_string, Label::kNear);
|
|
|
| @@ -5178,8 +5179,9 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
| __ mov(edi, FieldOperand(edx, HeapObject::kMapOffset));
|
| __ movzx_b(edi, FieldOperand(edi, Map::kInstanceTypeOffset));
|
| __ and_(ecx, Operand(edi));
|
| - STATIC_ASSERT(kStringEncodingMask == kAsciiStringTag);
|
| - __ test(ecx, Immediate(kAsciiStringTag));
|
| + STATIC_ASSERT((kStringEncodingMask & kAsciiStringTag) != 0);
|
| + STATIC_ASSERT((kStringEncodingMask & kTwoByteStringTag) == 0);
|
| + __ test(ecx, Immediate(kStringEncodingMask));
|
| __ j(zero, &non_ascii);
|
| __ bind(&ascii_data);
|
| // Allocate an acsii cons string.
|
| @@ -5210,7 +5212,7 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
| __ cmp(edi, kAsciiStringTag | kAsciiDataHintTag);
|
| __ j(equal, &ascii_data);
|
| // Allocate a two byte cons string.
|
| - __ AllocateConsString(ecx, edi, no_reg, &string_add_runtime);
|
| + __ AllocateTwoByteConsString(ecx, edi, no_reg, &string_add_runtime);
|
| __ jmp(&allocated);
|
|
|
| // Handle creating a flat result. First check that both strings are not
|
| @@ -5236,12 +5238,13 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
| // ebx: length of resulting flat string as a smi
|
| // edx: second string
|
| Label non_ascii_string_add_flat_result;
|
| - STATIC_ASSERT(kStringEncodingMask == kAsciiStringTag);
|
| + STATIC_ASSERT((kStringEncodingMask & kAsciiStringTag) != 0);
|
| + STATIC_ASSERT((kStringEncodingMask & kTwoByteStringTag) == 0);
|
| __ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset));
|
| - __ test_b(FieldOperand(ecx, Map::kInstanceTypeOffset), kAsciiStringTag);
|
| + __ test_b(FieldOperand(ecx, Map::kInstanceTypeOffset), kStringEncodingMask);
|
| __ j(zero, &non_ascii_string_add_flat_result);
|
| __ mov(ecx, FieldOperand(edx, HeapObject::kMapOffset));
|
| - __ test_b(FieldOperand(ecx, Map::kInstanceTypeOffset), kAsciiStringTag);
|
| + __ test_b(FieldOperand(ecx, Map::kInstanceTypeOffset), kStringEncodingMask);
|
| __ j(zero, &string_add_runtime);
|
|
|
| // Both strings are ascii strings. As they are short they are both flat.
|
| @@ -5281,7 +5284,7 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
| // edx: second string
|
| __ bind(&non_ascii_string_add_flat_result);
|
| __ mov(ecx, FieldOperand(edx, HeapObject::kMapOffset));
|
| - __ test_b(FieldOperand(ecx, Map::kInstanceTypeOffset), kAsciiStringTag);
|
| + __ test_b(FieldOperand(ecx, Map::kInstanceTypeOffset), kStringEncodingMask);
|
| __ j(not_zero, &string_add_runtime);
|
| // Both strings are two byte strings. As they are short they are both
|
| // flat.
|
| @@ -5759,13 +5762,14 @@ void SubStringStub::Generate(MacroAssembler* masm) {
|
| // string's encoding is wrong because we always have to recheck encoding of
|
| // the newly created string's parent anyways due to externalized strings.
|
| Label two_byte_slice, set_slice_header;
|
| - STATIC_ASSERT(kAsciiStringTag != 0);
|
| - __ test(ebx, Immediate(kAsciiStringTag));
|
| + STATIC_ASSERT((kStringEncodingMask & kAsciiStringTag) != 0);
|
| + STATIC_ASSERT((kStringEncodingMask & kTwoByteStringTag) == 0);
|
| + __ test(ebx, Immediate(kStringEncodingMask));
|
| __ j(zero, &two_byte_slice, Label::kNear);
|
| __ AllocateAsciiSlicedString(eax, ebx, no_reg, &runtime);
|
| __ jmp(&set_slice_header, Label::kNear);
|
| __ bind(&two_byte_slice);
|
| - __ AllocateSlicedString(eax, ebx, no_reg, &runtime);
|
| + __ AllocateTwoByteSlicedString(eax, ebx, no_reg, &runtime);
|
| __ bind(&set_slice_header);
|
| __ mov(FieldOperand(eax, SlicedString::kOffsetOffset), edx);
|
| __ SmiTag(ecx);
|
|
|