Commit 89bef51a authored by yangguo@chromium.org's avatar yangguo@chromium.org

Remove move ascii data hint for one byte strings

This is mostly a rollback of r12966
[Make kAsciiDataHintTag have correct semantics for all both 1 and 2 byte string types.]

R=yangguo@chromium.org
BUG=

Review URL: https://chromiumcodereview.appspot.com/11857015
Patch from Dan Carney <dcarney@google.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13375 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 1ac3949a
...@@ -6607,6 +6607,11 @@ void StringAddStub::Generate(MacroAssembler* masm) { ...@@ -6607,6 +6607,11 @@ void StringAddStub::Generate(MacroAssembler* masm) {
__ tst(r4, Operand(kAsciiDataHintMask)); __ tst(r4, Operand(kAsciiDataHintMask));
__ tst(r5, Operand(kAsciiDataHintMask), ne); __ tst(r5, Operand(kAsciiDataHintMask), ne);
__ b(ne, &ascii_data); __ b(ne, &ascii_data);
__ eor(r4, r4, Operand(r5));
STATIC_ASSERT(kOneByteStringTag != 0 && kAsciiDataHintTag != 0);
__ and_(r4, r4, Operand(kOneByteStringTag | kAsciiDataHintTag));
__ cmp(r4, Operand(kOneByteStringTag | kAsciiDataHintTag));
__ b(eq, &ascii_data);
// Allocate a two byte cons string. // Allocate a two byte cons string.
__ AllocateTwoByteConsString(r7, r6, r4, r5, &call_runtime); __ AllocateTwoByteConsString(r7, r6, r4, r5, &call_runtime);
......
...@@ -3399,10 +3399,8 @@ void MacroAssembler::JumpIfBothInstanceTypesAreNotSequentialAscii( ...@@ -3399,10 +3399,8 @@ void MacroAssembler::JumpIfBothInstanceTypesAreNotSequentialAscii(
Register scratch2, Register scratch2,
Label* failure) { Label* failure) {
int kFlatAsciiStringMask = int kFlatAsciiStringMask =
kIsNotStringMask | kStringEncodingMask | kAsciiDataHintMask | kIsNotStringMask | kStringEncodingMask | kStringRepresentationMask;
kStringRepresentationMask;
int kFlatAsciiStringTag = ASCII_STRING_TYPE; int kFlatAsciiStringTag = ASCII_STRING_TYPE;
ASSERT_EQ(ASCII_STRING_TYPE, ASCII_STRING_TYPE & kFlatAsciiStringMask);
and_(scratch1, first, Operand(kFlatAsciiStringMask)); and_(scratch1, first, Operand(kFlatAsciiStringMask));
and_(scratch2, second, Operand(kFlatAsciiStringMask)); and_(scratch2, second, Operand(kFlatAsciiStringMask));
cmp(scratch1, Operand(kFlatAsciiStringTag)); cmp(scratch1, Operand(kFlatAsciiStringTag));
...@@ -3416,10 +3414,8 @@ void MacroAssembler::JumpIfInstanceTypeIsNotSequentialAscii(Register type, ...@@ -3416,10 +3414,8 @@ void MacroAssembler::JumpIfInstanceTypeIsNotSequentialAscii(Register type,
Register scratch, Register scratch,
Label* failure) { Label* failure) {
int kFlatAsciiStringMask = int kFlatAsciiStringMask =
kIsNotStringMask | kStringEncodingMask | kAsciiDataHintMask | kIsNotStringMask | kStringEncodingMask | kStringRepresentationMask;
kStringRepresentationMask;
int kFlatAsciiStringTag = ASCII_STRING_TYPE; int kFlatAsciiStringTag = ASCII_STRING_TYPE;
ASSERT_EQ(ASCII_STRING_TYPE, ASCII_STRING_TYPE & kFlatAsciiStringMask);
and_(scratch, type, Operand(kFlatAsciiStringMask)); and_(scratch, type, Operand(kFlatAsciiStringMask));
cmp(scratch, Operand(kFlatAsciiStringTag)); cmp(scratch, Operand(kFlatAsciiStringTag));
b(ne, failure); b(ne, failure);
......
...@@ -5720,6 +5720,13 @@ void StringAddStub::Generate(MacroAssembler* masm) { ...@@ -5720,6 +5720,13 @@ void StringAddStub::Generate(MacroAssembler* masm) {
// edi: second instance type. // edi: second instance type.
__ test(ecx, Immediate(kAsciiDataHintMask)); __ test(ecx, Immediate(kAsciiDataHintMask));
__ j(not_zero, &ascii_data); __ j(not_zero, &ascii_data);
__ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset));
__ movzx_b(ecx, FieldOperand(ecx, Map::kInstanceTypeOffset));
__ xor_(edi, ecx);
STATIC_ASSERT(kOneByteStringTag != 0 && kAsciiDataHintTag != 0);
__ and_(edi, kOneByteStringTag | kAsciiDataHintTag);
__ cmp(edi, kOneByteStringTag | kAsciiDataHintTag);
__ j(equal, &ascii_data);
// Allocate a two byte cons string. // Allocate a two byte cons string.
__ AllocateTwoByteConsString(ecx, edi, no_reg, &call_runtime); __ AllocateTwoByteConsString(ecx, edi, no_reg, &call_runtime);
__ jmp(&allocated); __ jmp(&allocated);
......
...@@ -3639,8 +3639,7 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) { ...@@ -3639,8 +3639,7 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
__ mov(scratch, FieldOperand(string, HeapObject::kMapOffset)); __ mov(scratch, FieldOperand(string, HeapObject::kMapOffset));
__ movzx_b(scratch, FieldOperand(scratch, Map::kInstanceTypeOffset)); __ movzx_b(scratch, FieldOperand(scratch, Map::kInstanceTypeOffset));
__ and_(scratch, Immediate( __ and_(scratch, Immediate(
kIsNotStringMask | kStringEncodingMask | kAsciiDataHintMask | kIsNotStringMask | kStringEncodingMask | kStringRepresentationMask));
kStringRepresentationMask));
__ cmp(scratch, ASCII_STRING_TYPE); __ cmp(scratch, ASCII_STRING_TYPE);
__ j(not_equal, &bailout); __ j(not_equal, &bailout);
......
...@@ -2706,17 +2706,15 @@ void MacroAssembler::JumpIfNotBothSequentialAsciiStrings(Register object1, ...@@ -2706,17 +2706,15 @@ void MacroAssembler::JumpIfNotBothSequentialAsciiStrings(Register object1,
movzx_b(scratch2, FieldOperand(scratch2, Map::kInstanceTypeOffset)); movzx_b(scratch2, FieldOperand(scratch2, Map::kInstanceTypeOffset));
// Check that both are flat ASCII strings. // Check that both are flat ASCII strings.
const int kFlatAsciiStringMask = kIsNotStringMask | kStringRepresentationMask const int kFlatAsciiStringMask =
| kStringEncodingMask | kAsciiDataHintTag; kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask;
const int kFlatAsciiStringTag = ASCII_STRING_TYPE; const int kFlatAsciiStringTag = ASCII_STRING_TYPE;
// Interleave bits from both instance types and compare them in one check. // Interleave bits from both instance types and compare them in one check.
ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 8)); ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 3));
ASSERT_EQ(ASCII_STRING_TYPE, ASCII_STRING_TYPE & kFlatAsciiStringMask);
and_(scratch1, kFlatAsciiStringMask); and_(scratch1, kFlatAsciiStringMask);
and_(scratch2, kFlatAsciiStringMask); and_(scratch2, kFlatAsciiStringMask);
shl(scratch1, 8); lea(scratch1, Operand(scratch1, scratch2, times_8, 0));
or_(scratch1, scratch2); cmp(scratch1, kFlatAsciiStringTag | (kFlatAsciiStringTag << 3));
cmp(scratch1, kFlatAsciiStringTag | (kFlatAsciiStringTag << 8));
j(not_equal, failure); j(not_equal, failure);
} }
......
...@@ -474,7 +474,7 @@ void String::StringVerify() { ...@@ -474,7 +474,7 @@ void String::StringVerify() {
void SeqOneByteString::SeqOneByteStringVerify() { void SeqOneByteString::SeqOneByteStringVerify() {
#ifndef ENABLE_LATIN_1 #ifndef ENABLE_LATIN_1
CHECK(!HasOnlyAsciiChars() || String::IsAscii(GetChars(), length())); CHECK(String::IsAscii(GetChars(), length()));
#endif #endif
} }
......
...@@ -341,7 +341,12 @@ bool String::IsTwoByteRepresentationUnderneath() { ...@@ -341,7 +341,12 @@ bool String::IsTwoByteRepresentationUnderneath() {
bool String::HasOnlyAsciiChars() { bool String::HasOnlyAsciiChars() {
uint32_t type = map()->instance_type(); uint32_t type = map()->instance_type();
#ifndef ENABLE_LATIN_1
return (type & kStringEncodingMask) == kOneByteStringTag ||
(type & kAsciiDataHintMask) == kAsciiDataHintTag;
#else
return (type & kAsciiDataHintMask) == kAsciiDataHintTag; return (type & kAsciiDataHintMask) == kAsciiDataHintTag;
#endif
} }
......
...@@ -538,46 +538,39 @@ const uint32_t kShortcutTypeTag = kConsStringTag; ...@@ -538,46 +538,39 @@ const uint32_t kShortcutTypeTag = kConsStringTag;
enum InstanceType { enum InstanceType {
// String types. // String types.
SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kSeqStringTag, SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kSeqStringTag,
ASCII_SYMBOL_TYPE = kOneByteStringTag | kAsciiDataHintTag | kSymbolTag | ASCII_SYMBOL_TYPE = kOneByteStringTag | kSymbolTag | kSeqStringTag,
kSeqStringTag,
CONS_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kConsStringTag, CONS_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kConsStringTag,
CONS_ASCII_SYMBOL_TYPE = kOneByteStringTag | kAsciiDataHintTag | kSymbolTag | CONS_ASCII_SYMBOL_TYPE = kOneByteStringTag | kSymbolTag | kConsStringTag,
kConsStringTag,
SHORT_EXTERNAL_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | SHORT_EXTERNAL_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag |
kExternalStringTag | kShortExternalStringTag, kExternalStringTag | kShortExternalStringTag,
SHORT_EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE = SHORT_EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE =
kTwoByteStringTag | kSymbolTag | kExternalStringTag | kTwoByteStringTag | kSymbolTag | kExternalStringTag |
kAsciiDataHintTag | kShortExternalStringTag, kAsciiDataHintTag | kShortExternalStringTag,
SHORT_EXTERNAL_ASCII_SYMBOL_TYPE = kOneByteStringTag | kAsciiDataHintTag | SHORT_EXTERNAL_ASCII_SYMBOL_TYPE = kOneByteStringTag | kExternalStringTag |
kExternalStringTag | kSymbolTag | kSymbolTag | kShortExternalStringTag,
kShortExternalStringTag,
EXTERNAL_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kExternalStringTag, EXTERNAL_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kExternalStringTag,
EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE = EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE =
kTwoByteStringTag | kSymbolTag | kExternalStringTag | kAsciiDataHintTag, kTwoByteStringTag | kSymbolTag | kExternalStringTag | kAsciiDataHintTag,
EXTERNAL_ASCII_SYMBOL_TYPE = EXTERNAL_ASCII_SYMBOL_TYPE =
kOneByteStringTag | kAsciiDataHintTag | kSymbolTag | kExternalStringTag, kOneByteStringTag | kSymbolTag | kExternalStringTag,
STRING_TYPE = kTwoByteStringTag | kSeqStringTag, STRING_TYPE = kTwoByteStringTag | kSeqStringTag,
ASCII_STRING_TYPE = kOneByteStringTag | kAsciiDataHintTag | kSeqStringTag, ASCII_STRING_TYPE = kOneByteStringTag | kSeqStringTag,
CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag, CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag,
CONS_ASCII_STRING_TYPE = CONS_ASCII_STRING_TYPE = kOneByteStringTag | kConsStringTag,
kOneByteStringTag | kAsciiDataHintTag | kConsStringTag,
SLICED_STRING_TYPE = kTwoByteStringTag | kSlicedStringTag, SLICED_STRING_TYPE = kTwoByteStringTag | kSlicedStringTag,
SLICED_ASCII_STRING_TYPE = SLICED_ASCII_STRING_TYPE = kOneByteStringTag | kSlicedStringTag,
kOneByteStringTag | kAsciiDataHintTag | kSlicedStringTag,
SHORT_EXTERNAL_STRING_TYPE = SHORT_EXTERNAL_STRING_TYPE =
kTwoByteStringTag | kExternalStringTag | kShortExternalStringTag, kTwoByteStringTag | kExternalStringTag | kShortExternalStringTag,
SHORT_EXTERNAL_STRING_WITH_ASCII_DATA_TYPE = SHORT_EXTERNAL_STRING_WITH_ASCII_DATA_TYPE =
kTwoByteStringTag | kExternalStringTag | kTwoByteStringTag | kExternalStringTag |
kAsciiDataHintTag | kShortExternalStringTag, kAsciiDataHintTag | kShortExternalStringTag,
SHORT_EXTERNAL_ASCII_STRING_TYPE = SHORT_EXTERNAL_ASCII_STRING_TYPE =
kOneByteStringTag | kAsciiDataHintTag | kOneByteStringTag | kExternalStringTag | kShortExternalStringTag,
kExternalStringTag | kShortExternalStringTag,
EXTERNAL_STRING_TYPE = kTwoByteStringTag | kExternalStringTag, EXTERNAL_STRING_TYPE = kTwoByteStringTag | kExternalStringTag,
EXTERNAL_STRING_WITH_ASCII_DATA_TYPE = EXTERNAL_STRING_WITH_ASCII_DATA_TYPE =
kTwoByteStringTag | kExternalStringTag | kAsciiDataHintTag, kTwoByteStringTag | kExternalStringTag | kAsciiDataHintTag,
// LAST_STRING_TYPE // LAST_STRING_TYPE
EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE = kOneByteStringTag | kExternalStringTag,
kOneByteStringTag | kAsciiDataHintTag | kExternalStringTag,
PRIVATE_EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE, PRIVATE_EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE,
// Objects allocated in their own spaces (never in new space). // Objects allocated in their own spaces (never in new space).
......
...@@ -4782,6 +4782,11 @@ void StringAddStub::Generate(MacroAssembler* masm) { ...@@ -4782,6 +4782,11 @@ void StringAddStub::Generate(MacroAssembler* masm) {
// r9: second instance type. // r9: second instance type.
__ testb(rcx, Immediate(kAsciiDataHintMask)); __ testb(rcx, Immediate(kAsciiDataHintMask));
__ j(not_zero, &ascii_data); __ j(not_zero, &ascii_data);
__ xor_(r8, r9);
STATIC_ASSERT(kOneByteStringTag != 0 && kAsciiDataHintTag != 0);
__ andb(r8, Immediate(kOneByteStringTag | kAsciiDataHintTag));
__ cmpb(r8, Immediate(kOneByteStringTag | kAsciiDataHintTag));
__ j(equal, &ascii_data);
// Allocate a two byte cons string. // Allocate a two byte cons string.
__ AllocateTwoByteConsString(rcx, rdi, no_reg, &call_runtime); __ AllocateTwoByteConsString(rcx, rdi, no_reg, &call_runtime);
__ jmp(&allocated); __ jmp(&allocated);
......
...@@ -2218,19 +2218,16 @@ void MacroAssembler::JumpIfNotBothSequentialAsciiStrings( ...@@ -2218,19 +2218,16 @@ void MacroAssembler::JumpIfNotBothSequentialAsciiStrings(
// Check that both are flat ASCII strings. // Check that both are flat ASCII strings.
ASSERT(kNotStringTag != 0); ASSERT(kNotStringTag != 0);
const int kFlatAsciiStringMask = const int kFlatAsciiStringMask =
kIsNotStringMask | kStringEncodingMask | kAsciiDataHintMask | kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask;
kStringRepresentationMask;
const int kFlatAsciiStringTag = ASCII_STRING_TYPE; const int kFlatAsciiStringTag = ASCII_STRING_TYPE;
andl(scratch1, Immediate(kFlatAsciiStringMask)); andl(scratch1, Immediate(kFlatAsciiStringMask));
andl(scratch2, Immediate(kFlatAsciiStringMask)); andl(scratch2, Immediate(kFlatAsciiStringMask));
// Interleave the bits to check both scratch1 and scratch2 in one test. // Interleave the bits to check both scratch1 and scratch2 in one test.
ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 8)); ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 3));
ASSERT_EQ(ASCII_STRING_TYPE, ASCII_STRING_TYPE & kFlatAsciiStringMask); lea(scratch1, Operand(scratch1, scratch2, times_8, 0));
shl(scratch1, Immediate(8));
orl(scratch1, scratch2);
cmpl(scratch1, cmpl(scratch1,
Immediate(kFlatAsciiStringTag + (kFlatAsciiStringTag << 8))); Immediate(kFlatAsciiStringTag + (kFlatAsciiStringTag << 3)));
j(not_equal, on_fail, near_jump); j(not_equal, on_fail, near_jump);
} }
...@@ -2266,19 +2263,17 @@ void MacroAssembler::JumpIfBothInstanceTypesAreNotSequentialAscii( ...@@ -2266,19 +2263,17 @@ void MacroAssembler::JumpIfBothInstanceTypesAreNotSequentialAscii(
// Check that both are flat ASCII strings. // Check that both are flat ASCII strings.
ASSERT(kNotStringTag != 0); ASSERT(kNotStringTag != 0);
const int kFlatAsciiStringMask = kIsNotStringMask | kStringRepresentationMask const int kFlatAsciiStringMask =
| kStringEncodingMask | kAsciiDataHintTag; kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask;
const int kFlatAsciiStringTag = ASCII_STRING_TYPE; const int kFlatAsciiStringTag = ASCII_STRING_TYPE;
andl(scratch1, Immediate(kFlatAsciiStringMask)); andl(scratch1, Immediate(kFlatAsciiStringMask));
andl(scratch2, Immediate(kFlatAsciiStringMask)); andl(scratch2, Immediate(kFlatAsciiStringMask));
// Interleave the bits to check both scratch1 and scratch2 in one test. // Interleave the bits to check both scratch1 and scratch2 in one test.
ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 8)); ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 3));
ASSERT_EQ(ASCII_STRING_TYPE, ASCII_STRING_TYPE & kFlatAsciiStringMask); lea(scratch1, Operand(scratch1, scratch2, times_8, 0));
shl(scratch1, Immediate(8));
orl(scratch1, scratch2);
cmpl(scratch1, cmpl(scratch1,
Immediate(kFlatAsciiStringTag + (kFlatAsciiStringTag << 8))); Immediate(kFlatAsciiStringTag + (kFlatAsciiStringTag << 3)));
j(not_equal, on_fail, near_jump); j(not_equal, on_fail, near_jump);
} }
......
...@@ -6220,8 +6220,10 @@ static void Utf16Helper( ...@@ -6220,8 +6220,10 @@ static void Utf16Helper(
Local<v8::String>::Cast(a->Get(i)); Local<v8::String>::Cast(a->Get(i));
Local<v8::Number> expected_len = Local<v8::Number> expected_len =
Local<v8::Number>::Cast(alens->Get(i)); Local<v8::Number>::Cast(alens->Get(i));
#ifndef ENABLE_LATIN_1
CHECK_EQ(expected_len->Value() != string->Length(), CHECK_EQ(expected_len->Value() != string->Length(),
string->MayContainNonAscii()); string->MayContainNonAscii());
#endif
int length = GetUtf8Length(string); int length = GetUtf8Length(string);
CHECK_EQ(static_cast<int>(expected_len->Value()), length); CHECK_EQ(static_cast<int>(expected_len->Value()), length);
} }
...@@ -12801,8 +12803,10 @@ THREADED_TEST(MorphCompositeStringTest) { ...@@ -12801,8 +12803,10 @@ THREADED_TEST(MorphCompositeStringTest) {
"var slice = lhs.substring(1, lhs.length - 1);" "var slice = lhs.substring(1, lhs.length - 1);"
"var slice_on_cons = (lhs + rhs).substring(1, lhs.length *2 - 1);"); "var slice_on_cons = (lhs + rhs).substring(1, lhs.length *2 - 1);");
#ifndef ENABLE_LATIN_1
CHECK(!lhs->MayContainNonAscii()); CHECK(!lhs->MayContainNonAscii());
CHECK(!rhs->MayContainNonAscii()); CHECK(!rhs->MayContainNonAscii());
#endif
MorphAString(*v8::Utils::OpenHandle(*lhs), &ascii_resource, &uc16_resource); MorphAString(*v8::Utils::OpenHandle(*lhs), &ascii_resource, &uc16_resource);
MorphAString(*v8::Utils::OpenHandle(*rhs), &ascii_resource, &uc16_resource); MorphAString(*v8::Utils::OpenHandle(*rhs), &ascii_resource, &uc16_resource);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment