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
This commit is contained in:
parent
1ac3949a93
commit
89bef51aca
@ -6607,6 +6607,11 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
||||
__ tst(r4, Operand(kAsciiDataHintMask));
|
||||
__ tst(r5, Operand(kAsciiDataHintMask), ne);
|
||||
__ 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.
|
||||
__ AllocateTwoByteConsString(r7, r6, r4, r5, &call_runtime);
|
||||
|
@ -3399,10 +3399,8 @@ void MacroAssembler::JumpIfBothInstanceTypesAreNotSequentialAscii(
|
||||
Register scratch2,
|
||||
Label* failure) {
|
||||
int kFlatAsciiStringMask =
|
||||
kIsNotStringMask | kStringEncodingMask | kAsciiDataHintMask |
|
||||
kStringRepresentationMask;
|
||||
kIsNotStringMask | kStringEncodingMask | kStringRepresentationMask;
|
||||
int kFlatAsciiStringTag = ASCII_STRING_TYPE;
|
||||
ASSERT_EQ(ASCII_STRING_TYPE, ASCII_STRING_TYPE & kFlatAsciiStringMask);
|
||||
and_(scratch1, first, Operand(kFlatAsciiStringMask));
|
||||
and_(scratch2, second, Operand(kFlatAsciiStringMask));
|
||||
cmp(scratch1, Operand(kFlatAsciiStringTag));
|
||||
@ -3416,10 +3414,8 @@ void MacroAssembler::JumpIfInstanceTypeIsNotSequentialAscii(Register type,
|
||||
Register scratch,
|
||||
Label* failure) {
|
||||
int kFlatAsciiStringMask =
|
||||
kIsNotStringMask | kStringEncodingMask | kAsciiDataHintMask |
|
||||
kStringRepresentationMask;
|
||||
kIsNotStringMask | kStringEncodingMask | kStringRepresentationMask;
|
||||
int kFlatAsciiStringTag = ASCII_STRING_TYPE;
|
||||
ASSERT_EQ(ASCII_STRING_TYPE, ASCII_STRING_TYPE & kFlatAsciiStringMask);
|
||||
and_(scratch, type, Operand(kFlatAsciiStringMask));
|
||||
cmp(scratch, Operand(kFlatAsciiStringTag));
|
||||
b(ne, failure);
|
||||
|
@ -5720,6 +5720,13 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
||||
// edi: second instance type.
|
||||
__ test(ecx, Immediate(kAsciiDataHintMask));
|
||||
__ 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.
|
||||
__ AllocateTwoByteConsString(ecx, edi, no_reg, &call_runtime);
|
||||
__ jmp(&allocated);
|
||||
|
@ -3639,8 +3639,7 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
|
||||
__ mov(scratch, FieldOperand(string, HeapObject::kMapOffset));
|
||||
__ movzx_b(scratch, FieldOperand(scratch, Map::kInstanceTypeOffset));
|
||||
__ and_(scratch, Immediate(
|
||||
kIsNotStringMask | kStringEncodingMask | kAsciiDataHintMask |
|
||||
kStringRepresentationMask));
|
||||
kIsNotStringMask | kStringEncodingMask | kStringRepresentationMask));
|
||||
__ cmp(scratch, ASCII_STRING_TYPE);
|
||||
__ j(not_equal, &bailout);
|
||||
|
||||
|
@ -2706,17 +2706,15 @@ void MacroAssembler::JumpIfNotBothSequentialAsciiStrings(Register object1,
|
||||
movzx_b(scratch2, FieldOperand(scratch2, Map::kInstanceTypeOffset));
|
||||
|
||||
// Check that both are flat ASCII strings.
|
||||
const int kFlatAsciiStringMask = kIsNotStringMask | kStringRepresentationMask
|
||||
| kStringEncodingMask | kAsciiDataHintTag;
|
||||
const int kFlatAsciiStringMask =
|
||||
kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask;
|
||||
const int kFlatAsciiStringTag = ASCII_STRING_TYPE;
|
||||
// Interleave bits from both instance types and compare them in one check.
|
||||
ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 8));
|
||||
ASSERT_EQ(ASCII_STRING_TYPE, ASCII_STRING_TYPE & kFlatAsciiStringMask);
|
||||
ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 3));
|
||||
and_(scratch1, kFlatAsciiStringMask);
|
||||
and_(scratch2, kFlatAsciiStringMask);
|
||||
shl(scratch1, 8);
|
||||
or_(scratch1, scratch2);
|
||||
cmp(scratch1, kFlatAsciiStringTag | (kFlatAsciiStringTag << 8));
|
||||
lea(scratch1, Operand(scratch1, scratch2, times_8, 0));
|
||||
cmp(scratch1, kFlatAsciiStringTag | (kFlatAsciiStringTag << 3));
|
||||
j(not_equal, failure);
|
||||
}
|
||||
|
||||
|
@ -474,7 +474,7 @@ void String::StringVerify() {
|
||||
|
||||
void SeqOneByteString::SeqOneByteStringVerify() {
|
||||
#ifndef ENABLE_LATIN_1
|
||||
CHECK(!HasOnlyAsciiChars() || String::IsAscii(GetChars(), length()));
|
||||
CHECK(String::IsAscii(GetChars(), length()));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -341,7 +341,12 @@ bool String::IsTwoByteRepresentationUnderneath() {
|
||||
|
||||
bool String::HasOnlyAsciiChars() {
|
||||
uint32_t type = map()->instance_type();
|
||||
#ifndef ENABLE_LATIN_1
|
||||
return (type & kStringEncodingMask) == kOneByteStringTag ||
|
||||
(type & kAsciiDataHintMask) == kAsciiDataHintTag;
|
||||
#else
|
||||
return (type & kAsciiDataHintMask) == kAsciiDataHintTag;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -538,46 +538,39 @@ const uint32_t kShortcutTypeTag = kConsStringTag;
|
||||
enum InstanceType {
|
||||
// String types.
|
||||
SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kSeqStringTag,
|
||||
ASCII_SYMBOL_TYPE = kOneByteStringTag | kAsciiDataHintTag | kSymbolTag |
|
||||
kSeqStringTag,
|
||||
ASCII_SYMBOL_TYPE = kOneByteStringTag | kSymbolTag | kSeqStringTag,
|
||||
CONS_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kConsStringTag,
|
||||
CONS_ASCII_SYMBOL_TYPE = kOneByteStringTag | kAsciiDataHintTag | kSymbolTag |
|
||||
kConsStringTag,
|
||||
CONS_ASCII_SYMBOL_TYPE = kOneByteStringTag | kSymbolTag | kConsStringTag,
|
||||
SHORT_EXTERNAL_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag |
|
||||
kExternalStringTag | kShortExternalStringTag,
|
||||
SHORT_EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE =
|
||||
kTwoByteStringTag | kSymbolTag | kExternalStringTag |
|
||||
kAsciiDataHintTag | kShortExternalStringTag,
|
||||
SHORT_EXTERNAL_ASCII_SYMBOL_TYPE = kOneByteStringTag | kAsciiDataHintTag |
|
||||
kExternalStringTag | kSymbolTag |
|
||||
kShortExternalStringTag,
|
||||
SHORT_EXTERNAL_ASCII_SYMBOL_TYPE = kOneByteStringTag | kExternalStringTag |
|
||||
kSymbolTag | kShortExternalStringTag,
|
||||
EXTERNAL_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kExternalStringTag,
|
||||
EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE =
|
||||
kTwoByteStringTag | kSymbolTag | kExternalStringTag | kAsciiDataHintTag,
|
||||
EXTERNAL_ASCII_SYMBOL_TYPE =
|
||||
kOneByteStringTag | kAsciiDataHintTag | kSymbolTag | kExternalStringTag,
|
||||
kOneByteStringTag | kSymbolTag | kExternalStringTag,
|
||||
STRING_TYPE = kTwoByteStringTag | kSeqStringTag,
|
||||
ASCII_STRING_TYPE = kOneByteStringTag | kAsciiDataHintTag | kSeqStringTag,
|
||||
ASCII_STRING_TYPE = kOneByteStringTag | kSeqStringTag,
|
||||
CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag,
|
||||
CONS_ASCII_STRING_TYPE =
|
||||
kOneByteStringTag | kAsciiDataHintTag | kConsStringTag,
|
||||
CONS_ASCII_STRING_TYPE = kOneByteStringTag | kConsStringTag,
|
||||
SLICED_STRING_TYPE = kTwoByteStringTag | kSlicedStringTag,
|
||||
SLICED_ASCII_STRING_TYPE =
|
||||
kOneByteStringTag | kAsciiDataHintTag | kSlicedStringTag,
|
||||
SLICED_ASCII_STRING_TYPE = kOneByteStringTag | kSlicedStringTag,
|
||||
SHORT_EXTERNAL_STRING_TYPE =
|
||||
kTwoByteStringTag | kExternalStringTag | kShortExternalStringTag,
|
||||
SHORT_EXTERNAL_STRING_WITH_ASCII_DATA_TYPE =
|
||||
kTwoByteStringTag | kExternalStringTag |
|
||||
kAsciiDataHintTag | kShortExternalStringTag,
|
||||
SHORT_EXTERNAL_ASCII_STRING_TYPE =
|
||||
kOneByteStringTag | kAsciiDataHintTag |
|
||||
kExternalStringTag | kShortExternalStringTag,
|
||||
kOneByteStringTag | kExternalStringTag | kShortExternalStringTag,
|
||||
EXTERNAL_STRING_TYPE = kTwoByteStringTag | kExternalStringTag,
|
||||
EXTERNAL_STRING_WITH_ASCII_DATA_TYPE =
|
||||
kTwoByteStringTag | kExternalStringTag | kAsciiDataHintTag,
|
||||
// LAST_STRING_TYPE
|
||||
EXTERNAL_ASCII_STRING_TYPE =
|
||||
kOneByteStringTag | kAsciiDataHintTag | kExternalStringTag,
|
||||
EXTERNAL_ASCII_STRING_TYPE = kOneByteStringTag | kExternalStringTag,
|
||||
PRIVATE_EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE,
|
||||
|
||||
// Objects allocated in their own spaces (never in new space).
|
||||
|
@ -4782,6 +4782,11 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
||||
// r9: second instance type.
|
||||
__ testb(rcx, Immediate(kAsciiDataHintMask));
|
||||
__ 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.
|
||||
__ AllocateTwoByteConsString(rcx, rdi, no_reg, &call_runtime);
|
||||
__ jmp(&allocated);
|
||||
|
@ -2218,19 +2218,16 @@ void MacroAssembler::JumpIfNotBothSequentialAsciiStrings(
|
||||
// Check that both are flat ASCII strings.
|
||||
ASSERT(kNotStringTag != 0);
|
||||
const int kFlatAsciiStringMask =
|
||||
kIsNotStringMask | kStringEncodingMask | kAsciiDataHintMask |
|
||||
kStringRepresentationMask;
|
||||
kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask;
|
||||
const int kFlatAsciiStringTag = ASCII_STRING_TYPE;
|
||||
|
||||
andl(scratch1, Immediate(kFlatAsciiStringMask));
|
||||
andl(scratch2, Immediate(kFlatAsciiStringMask));
|
||||
// Interleave the bits to check both scratch1 and scratch2 in one test.
|
||||
ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 8));
|
||||
ASSERT_EQ(ASCII_STRING_TYPE, ASCII_STRING_TYPE & kFlatAsciiStringMask);
|
||||
shl(scratch1, Immediate(8));
|
||||
orl(scratch1, scratch2);
|
||||
ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 3));
|
||||
lea(scratch1, Operand(scratch1, scratch2, times_8, 0));
|
||||
cmpl(scratch1,
|
||||
Immediate(kFlatAsciiStringTag + (kFlatAsciiStringTag << 8)));
|
||||
Immediate(kFlatAsciiStringTag + (kFlatAsciiStringTag << 3)));
|
||||
j(not_equal, on_fail, near_jump);
|
||||
}
|
||||
|
||||
@ -2266,19 +2263,17 @@ void MacroAssembler::JumpIfBothInstanceTypesAreNotSequentialAscii(
|
||||
|
||||
// Check that both are flat ASCII strings.
|
||||
ASSERT(kNotStringTag != 0);
|
||||
const int kFlatAsciiStringMask = kIsNotStringMask | kStringRepresentationMask
|
||||
| kStringEncodingMask | kAsciiDataHintTag;
|
||||
const int kFlatAsciiStringMask =
|
||||
kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask;
|
||||
const int kFlatAsciiStringTag = ASCII_STRING_TYPE;
|
||||
|
||||
andl(scratch1, Immediate(kFlatAsciiStringMask));
|
||||
andl(scratch2, Immediate(kFlatAsciiStringMask));
|
||||
// Interleave the bits to check both scratch1 and scratch2 in one test.
|
||||
ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 8));
|
||||
ASSERT_EQ(ASCII_STRING_TYPE, ASCII_STRING_TYPE & kFlatAsciiStringMask);
|
||||
shl(scratch1, Immediate(8));
|
||||
orl(scratch1, scratch2);
|
||||
ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 3));
|
||||
lea(scratch1, Operand(scratch1, scratch2, times_8, 0));
|
||||
cmpl(scratch1,
|
||||
Immediate(kFlatAsciiStringTag + (kFlatAsciiStringTag << 8)));
|
||||
Immediate(kFlatAsciiStringTag + (kFlatAsciiStringTag << 3)));
|
||||
j(not_equal, on_fail, near_jump);
|
||||
}
|
||||
|
||||
|
@ -6220,8 +6220,10 @@ static void Utf16Helper(
|
||||
Local<v8::String>::Cast(a->Get(i));
|
||||
Local<v8::Number> expected_len =
|
||||
Local<v8::Number>::Cast(alens->Get(i));
|
||||
#ifndef ENABLE_LATIN_1
|
||||
CHECK_EQ(expected_len->Value() != string->Length(),
|
||||
string->MayContainNonAscii());
|
||||
#endif
|
||||
int length = GetUtf8Length(string);
|
||||
CHECK_EQ(static_cast<int>(expected_len->Value()), length);
|
||||
}
|
||||
@ -12801,8 +12803,10 @@ THREADED_TEST(MorphCompositeStringTest) {
|
||||
"var slice = lhs.substring(1, lhs.length - 1);"
|
||||
"var slice_on_cons = (lhs + rhs).substring(1, lhs.length *2 - 1);");
|
||||
|
||||
#ifndef ENABLE_LATIN_1
|
||||
CHECK(!lhs->MayContainNonAscii());
|
||||
CHECK(!rhs->MayContainNonAscii());
|
||||
#endif
|
||||
|
||||
MorphAString(*v8::Utils::OpenHandle(*lhs), &ascii_resource, &uc16_resource);
|
||||
MorphAString(*v8::Utils::OpenHandle(*rhs), &ascii_resource, &uc16_resource);
|
||||
|
Loading…
Reference in New Issue
Block a user