MIPS: Track up to 5 stable maps as field type.
Port r20831 (f91f993) BUG= R=plind44@gmail.com Review URL: https://codereview.chromium.org/240503008 Patch from Balazs Kilvady <kilvadyb@homejinni.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20847 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
313844d842
commit
fd0df23b10
@ -415,13 +415,24 @@ void StoreStubCompiler::GenerateStoreTransition(MacroAssembler* masm,
|
||||
} else if (representation.IsSmi()) {
|
||||
__ JumpIfNotSmi(value_reg, miss_label);
|
||||
} else if (representation.IsHeapObject()) {
|
||||
__ JumpIfSmi(value_reg, miss_label);
|
||||
HeapType* field_type = descriptors->GetFieldType(descriptor);
|
||||
if (field_type->IsClass()) {
|
||||
__ CheckMap(value_reg, scratch1, field_type->AsClass()->Map(),
|
||||
miss_label, DO_SMI_CHECK);
|
||||
} else {
|
||||
ASSERT(HeapType::Any()->Is(field_type));
|
||||
__ JumpIfSmi(value_reg, miss_label);
|
||||
HeapType::Iterator<Map> it = field_type->Classes();
|
||||
Handle<Map> current;
|
||||
if (!it.Done()) {
|
||||
__ lw(scratch1, FieldMemOperand(value_reg, HeapObject::kMapOffset));
|
||||
Label do_store;
|
||||
while (true) {
|
||||
// Do the CompareMap() directly within the Branch() functions.
|
||||
current = it.Current();
|
||||
it.Advance();
|
||||
if (it.Done()) {
|
||||
__ Branch(miss_label, ne, scratch1, Operand(current));
|
||||
break;
|
||||
}
|
||||
__ Branch(&do_store, eq, scratch1, Operand(current));
|
||||
}
|
||||
__ bind(&do_store);
|
||||
}
|
||||
} else if (representation.IsDouble()) {
|
||||
Label do_store, heap_number;
|
||||
@ -585,13 +596,24 @@ void StoreStubCompiler::GenerateStoreField(MacroAssembler* masm,
|
||||
if (representation.IsSmi()) {
|
||||
__ JumpIfNotSmi(value_reg, miss_label);
|
||||
} else if (representation.IsHeapObject()) {
|
||||
__ JumpIfSmi(value_reg, miss_label);
|
||||
HeapType* field_type = lookup->GetFieldType();
|
||||
if (field_type->IsClass()) {
|
||||
__ CheckMap(value_reg, scratch1, field_type->AsClass()->Map(),
|
||||
miss_label, DO_SMI_CHECK);
|
||||
} else {
|
||||
ASSERT(HeapType::Any()->Is(field_type));
|
||||
__ JumpIfSmi(value_reg, miss_label);
|
||||
HeapType::Iterator<Map> it = field_type->Classes();
|
||||
if (!it.Done()) {
|
||||
__ lw(scratch1, FieldMemOperand(value_reg, HeapObject::kMapOffset));
|
||||
Label do_store;
|
||||
Handle<Map> current;
|
||||
while (true) {
|
||||
// Do the CompareMap() directly within the Branch() functions.
|
||||
current = it.Current();
|
||||
it.Advance();
|
||||
if (it.Done()) {
|
||||
__ Branch(miss_label, ne, scratch1, Operand(current));
|
||||
break;
|
||||
}
|
||||
__ Branch(&do_store, eq, scratch1, Operand(current));
|
||||
}
|
||||
__ bind(&do_store);
|
||||
}
|
||||
} else if (representation.IsDouble()) {
|
||||
// Load the double storage.
|
||||
|
Loading…
Reference in New Issue
Block a user