Commit 1d568d77 authored by zhengxing.li's avatar zhengxing.li Committed by Commit bot

X87: VectorICs: Remove --vector-stores flag.

  port e75e6254 (r32040)

  original commit message:

BUG=

Review URL: https://codereview.chromium.org/1461533002

Cr-Commit-Position: refs/heads/master@{#32068}
parent 2772f1ce
...@@ -1159,7 +1159,7 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, ...@@ -1159,7 +1159,7 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset,
__ mov(StoreDescriptor::NameRegister(), __ mov(StoreDescriptor::NameRegister(),
Immediate(isolate()->factory()->home_object_symbol())); Immediate(isolate()->factory()->home_object_symbol()));
__ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize)); __ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize));
if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); EmitLoadStoreICSlot(slot);
CallStoreIC(); CallStoreIC();
} }
...@@ -1172,7 +1172,7 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, ...@@ -1172,7 +1172,7 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer,
__ mov(StoreDescriptor::NameRegister(), __ mov(StoreDescriptor::NameRegister(),
Immediate(isolate()->factory()->home_object_symbol())); Immediate(isolate()->factory()->home_object_symbol()));
__ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize)); __ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize));
if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); EmitLoadStoreICSlot(slot);
CallStoreIC(); CallStoreIC();
} }
...@@ -1501,12 +1501,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1501,12 +1501,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
DCHECK(StoreDescriptor::ValueRegister().is(eax)); DCHECK(StoreDescriptor::ValueRegister().is(eax));
__ mov(StoreDescriptor::NameRegister(), Immediate(key->value())); __ mov(StoreDescriptor::NameRegister(), Immediate(key->value()));
__ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0));
if (FLAG_vector_stores) { EmitLoadStoreICSlot(property->GetSlot(0));
EmitLoadStoreICSlot(property->GetSlot(0)); CallStoreIC();
CallStoreIC();
} else {
CallStoreIC(key->LiteralFeedbackId());
}
PrepareForBailoutForId(key->id(), NO_REGISTERS); PrepareForBailoutForId(key->id(), NO_REGISTERS);
if (NeedsHomeObject(value)) { if (NeedsHomeObject(value)) {
EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1)); EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1));
...@@ -1691,31 +1687,13 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { ...@@ -1691,31 +1687,13 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
} }
VisitForAccumulatorValue(subexpr); VisitForAccumulatorValue(subexpr);
if (FLAG_vector_stores) { __ mov(StoreDescriptor::NameRegister(),
__ mov(StoreDescriptor::NameRegister(), Immediate(Smi::FromInt(array_index)));
Immediate(Smi::FromInt(array_index))); __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, kPointerSize));
__ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, kPointerSize)); EmitLoadStoreICSlot(expr->LiteralFeedbackSlot());
EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); Handle<Code> ic =
Handle<Code> ic = CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); CallIC(ic);
CallIC(ic);
} else if (has_constant_fast_elements) {
// Fast-case array literal with ElementsKind of FAST_*_ELEMENTS, they
// cannot transition and don't need to call the runtime stub.
int offset = FixedArray::kHeaderSize + (array_index * kPointerSize);
__ mov(ebx, Operand(esp, kPointerSize)); // Copy of array literal.
__ mov(ebx, FieldOperand(ebx, JSObject::kElementsOffset));
// Store the subexpression value in the array's elements.
__ mov(FieldOperand(ebx, offset), result_register());
// Update the write barrier for the array store.
__ RecordWriteField(ebx, offset, result_register(), ecx, kDontSaveFPRegs,
EMIT_REMEMBERED_SET, INLINE_SMI_CHECK);
} else {
// Store the subexpression value in the array's elements.
__ mov(ecx, Immediate(Smi::FromInt(array_index)));
StoreArrayLiteralElementStub stub(isolate());
__ CallStub(&stub);
}
PrepareForBailoutForId(expr->GetIdForElement(array_index), NO_REGISTERS); PrepareForBailoutForId(expr->GetIdForElement(array_index), NO_REGISTERS);
} }
...@@ -2406,7 +2384,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2406,7 +2384,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
__ pop(StoreDescriptor::ValueRegister()); // Restore value. __ pop(StoreDescriptor::ValueRegister()); // Restore value.
__ mov(StoreDescriptor::NameRegister(), __ mov(StoreDescriptor::NameRegister(),
prop->key()->AsLiteral()->value()); prop->key()->AsLiteral()->value());
if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); EmitLoadStoreICSlot(slot);
CallStoreIC(); CallStoreIC();
break; break;
} }
...@@ -2454,7 +2432,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2454,7 +2432,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
__ Move(StoreDescriptor::NameRegister(), eax); __ Move(StoreDescriptor::NameRegister(), eax);
__ pop(StoreDescriptor::ReceiverRegister()); // Receiver. __ pop(StoreDescriptor::ReceiverRegister()); // Receiver.
__ pop(StoreDescriptor::ValueRegister()); // Restore value. __ pop(StoreDescriptor::ValueRegister()); // Restore value.
if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); EmitLoadStoreICSlot(slot);
Handle<Code> ic = Handle<Code> ic =
CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
CallIC(ic); CallIC(ic);
...@@ -2482,7 +2460,7 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, ...@@ -2482,7 +2460,7 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
// Global var, const, or let. // Global var, const, or let.
__ mov(StoreDescriptor::NameRegister(), var->name()); __ mov(StoreDescriptor::NameRegister(), var->name());
__ mov(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand()); __ mov(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand());
if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); EmitLoadStoreICSlot(slot);
CallStoreIC(); CallStoreIC();
} else if (var->mode() == LET && op != Token::INIT) { } else if (var->mode() == LET && op != Token::INIT) {
...@@ -2588,12 +2566,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { ...@@ -2588,12 +2566,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
__ mov(StoreDescriptor::NameRegister(), prop->key()->AsLiteral()->value()); __ mov(StoreDescriptor::NameRegister(), prop->key()->AsLiteral()->value());
__ pop(StoreDescriptor::ReceiverRegister()); __ pop(StoreDescriptor::ReceiverRegister());
if (FLAG_vector_stores) { EmitLoadStoreICSlot(expr->AssignmentSlot());
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallStoreIC();
CallStoreIC();
} else {
CallStoreIC(expr->AssignmentFeedbackId());
}
PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
context()->Plug(eax); context()->Plug(eax);
} }
...@@ -2639,13 +2613,8 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { ...@@ -2639,13 +2613,8 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
DCHECK(StoreDescriptor::ValueRegister().is(eax)); DCHECK(StoreDescriptor::ValueRegister().is(eax));
Handle<Code> ic = Handle<Code> ic =
CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
if (FLAG_vector_stores) { EmitLoadStoreICSlot(expr->AssignmentSlot());
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallIC(ic);
CallIC(ic);
} else {
CallIC(ic, expr->AssignmentFeedbackId());
}
PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
context()->Plug(eax); context()->Plug(eax);
} }
...@@ -4520,12 +4489,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -4520,12 +4489,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
__ mov(StoreDescriptor::NameRegister(), __ mov(StoreDescriptor::NameRegister(),
prop->key()->AsLiteral()->value()); prop->key()->AsLiteral()->value());
__ pop(StoreDescriptor::ReceiverRegister()); __ pop(StoreDescriptor::ReceiverRegister());
if (FLAG_vector_stores) { EmitLoadStoreICSlot(expr->CountSlot());
EmitLoadStoreICSlot(expr->CountSlot()); CallStoreIC();
CallStoreIC();
} else {
CallStoreIC(expr->CountStoreFeedbackId());
}
PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
...@@ -4563,12 +4528,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -4563,12 +4528,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
__ pop(StoreDescriptor::ReceiverRegister()); __ pop(StoreDescriptor::ReceiverRegister());
Handle<Code> ic = Handle<Code> ic =
CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
if (FLAG_vector_stores) { EmitLoadStoreICSlot(expr->CountSlot());
EmitLoadStoreICSlot(expr->CountSlot()); CallIC(ic);
CallIC(ic);
} else {
CallIC(ic, expr->CountStoreFeedbackId());
}
PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
if (expr->is_postfix()) { if (expr->is_postfix()) {
// Result is on the stack // Result is on the stack
...@@ -4868,7 +4829,7 @@ void FullCodeGenerator::ClearPendingMessage() { ...@@ -4868,7 +4829,7 @@ void FullCodeGenerator::ClearPendingMessage() {
void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorSlot slot) { void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorSlot slot) {
DCHECK(FLAG_vector_stores && !slot.IsInvalid()); DCHECK(!slot.IsInvalid());
__ mov(VectorStoreICTrampolineDescriptor::SlotRegister(), __ mov(VectorStoreICTrampolineDescriptor::SlotRegister(),
Immediate(SmiFromSlot(slot))); Immediate(SmiFromSlot(slot)));
} }
......
...@@ -30,8 +30,6 @@ Register* PropertyAccessCompiler::store_calling_convention() { ...@@ -30,8 +30,6 @@ Register* PropertyAccessCompiler::store_calling_convention() {
// receiver, name, scratch1, scratch2, scratch3. // receiver, name, scratch1, scratch2, scratch3.
Register receiver = StoreDescriptor::ReceiverRegister(); Register receiver = StoreDescriptor::ReceiverRegister();
Register name = StoreDescriptor::NameRegister(); Register name = StoreDescriptor::NameRegister();
DCHECK(FLAG_vector_stores ||
ebx.is(StoreTransitionDescriptor::MapRegister()));
static Register registers[] = {receiver, name, ebx, edi, no_reg}; static Register registers[] = {receiver, name, ebx, edi, no_reg};
return registers; return registers;
} }
......
...@@ -303,25 +303,15 @@ static void StoreIC_PushArgs(MacroAssembler* masm) { ...@@ -303,25 +303,15 @@ static void StoreIC_PushArgs(MacroAssembler* masm) {
Register receiver = StoreDescriptor::ReceiverRegister(); Register receiver = StoreDescriptor::ReceiverRegister();
Register name = StoreDescriptor::NameRegister(); Register name = StoreDescriptor::NameRegister();
Register value = StoreDescriptor::ValueRegister(); Register value = StoreDescriptor::ValueRegister();
Register slot = VectorStoreICDescriptor::SlotRegister();
Register vector = VectorStoreICDescriptor::VectorRegister();
if (FLAG_vector_stores) { __ xchg(receiver, Operand(esp, 0));
Register slot = VectorStoreICDescriptor::SlotRegister(); __ push(name);
Register vector = VectorStoreICDescriptor::VectorRegister(); __ push(value);
__ push(slot);
__ xchg(receiver, Operand(esp, 0)); __ push(vector);
__ push(name); __ push(receiver); // which contains the return address.
__ push(value);
__ push(slot);
__ push(vector);
__ push(receiver); // which contains the return address.
} else {
DCHECK(!ebx.is(receiver) && !ebx.is(name) && !ebx.is(value));
__ pop(ebx);
__ push(receiver);
__ push(name);
__ push(value);
__ push(ebx);
}
} }
...@@ -330,7 +320,7 @@ void NamedStoreHandlerCompiler::GenerateSlow(MacroAssembler* masm) { ...@@ -330,7 +320,7 @@ void NamedStoreHandlerCompiler::GenerateSlow(MacroAssembler* masm) {
StoreIC_PushArgs(masm); StoreIC_PushArgs(masm);
// Do tail-call to runtime routine. // Do tail-call to runtime routine.
__ TailCallRuntime(Runtime::kStoreIC_Slow, FLAG_vector_stores ? 5 : 3, 1); __ TailCallRuntime(Runtime::kStoreIC_Slow, 5, 1);
} }
...@@ -339,8 +329,7 @@ void ElementHandlerCompiler::GenerateStoreSlow(MacroAssembler* masm) { ...@@ -339,8 +329,7 @@ void ElementHandlerCompiler::GenerateStoreSlow(MacroAssembler* masm) {
StoreIC_PushArgs(masm); StoreIC_PushArgs(masm);
// Do tail-call to runtime routine. // Do tail-call to runtime routine.
__ TailCallRuntime(Runtime::kKeyedStoreIC_Slow, FLAG_vector_stores ? 5 : 3, __ TailCallRuntime(Runtime::kKeyedStoreIC_Slow, 5, 1);
1);
} }
......
...@@ -31,103 +31,6 @@ void PropertyICCompiler::GenerateRuntimeSetProperty( ...@@ -31,103 +31,6 @@ void PropertyICCompiler::GenerateRuntimeSetProperty(
} }
#undef __
#define __ ACCESS_MASM(masm())
Handle<Code> PropertyICCompiler::CompilePolymorphic(MapHandleList* maps,
CodeHandleList* handlers,
Handle<Name> name,
Code::StubType type,
IcCheckType check) {
Label miss;
if (check == PROPERTY &&
(kind() == Code::KEYED_STORE_IC || kind() == Code::KEYED_LOAD_IC)) {
// In case we are compiling an IC for dictionary loads or stores, just
// check whether the name is unique.
if (name.is_identical_to(isolate()->factory()->normal_ic_symbol())) {
// Keyed loads with dictionaries shouldn't be here, they go generic.
// The DCHECK is to protect assumptions when --vector-ics is on.
DCHECK(kind() != Code::KEYED_LOAD_IC);
Register tmp = scratch1();
__ JumpIfSmi(this->name(), &miss);
__ mov(tmp, FieldOperand(this->name(), HeapObject::kMapOffset));
__ movzx_b(tmp, FieldOperand(tmp, Map::kInstanceTypeOffset));
__ JumpIfNotUniqueNameInstanceType(tmp, &miss);
} else {
__ cmp(this->name(), Immediate(name));
__ j(not_equal, &miss);
}
}
Label number_case;
Label* smi_target = IncludesNumberMap(maps) ? &number_case : &miss;
__ JumpIfSmi(receiver(), smi_target);
// Polymorphic keyed stores may use the map register
Register map_reg = scratch1();
DCHECK(kind() != Code::KEYED_STORE_IC ||
map_reg.is(StoreTransitionDescriptor::MapRegister()));
__ mov(map_reg, FieldOperand(receiver(), HeapObject::kMapOffset));
int receiver_count = maps->length();
int number_of_handled_maps = 0;
for (int current = 0; current < receiver_count; ++current) {
Handle<Map> map = maps->at(current);
if (!map->is_deprecated()) {
number_of_handled_maps++;
Handle<WeakCell> cell = Map::WeakCellForMap(map);
__ CmpWeakValue(map_reg, cell, scratch2());
if (map->instance_type() == HEAP_NUMBER_TYPE) {
DCHECK(!number_case.is_unused());
__ bind(&number_case);
}
__ j(equal, handlers->at(current));
}
}
DCHECK(number_of_handled_maps != 0);
__ bind(&miss);
TailCallBuiltin(masm(), MissBuiltin(kind()));
// Return the generated code.
InlineCacheState state =
number_of_handled_maps > 1 ? POLYMORPHIC : MONOMORPHIC;
return GetCode(kind(), type, name, state);
}
Handle<Code> PropertyICCompiler::CompileKeyedStorePolymorphic(
MapHandleList* receiver_maps, CodeHandleList* handler_stubs,
MapHandleList* transitioned_maps) {
Label miss;
__ JumpIfSmi(receiver(), &miss, Label::kNear);
Register map_reg = scratch1();
__ mov(map_reg, FieldOperand(receiver(), HeapObject::kMapOffset));
for (int i = 0; i < receiver_maps->length(); ++i) {
Handle<WeakCell> cell = Map::WeakCellForMap(receiver_maps->at(i));
__ CmpWeakValue(map_reg, cell, scratch2());
if (transitioned_maps->at(i).is_null()) {
__ j(equal, handler_stubs->at(i));
} else {
Label next_map;
__ j(not_equal, &next_map, Label::kNear);
Handle<WeakCell> cell = Map::WeakCellForMap(transitioned_maps->at(i));
Register transition_map = scratch1();
DCHECK(!FLAG_vector_stores &&
transition_map.is(StoreTransitionDescriptor::MapRegister()));
__ LoadWeakValue(transition_map, cell, &miss);
__ jmp(handler_stubs->at(i), RelocInfo::CODE_TARGET);
__ bind(&next_map);
}
}
__ bind(&miss);
TailCallBuiltin(masm(), MissBuiltin(kind()));
// Return the generated code.
return GetCode(kind(), Code::NORMAL, factory()->empty_string(), POLYMORPHIC);
}
#undef __ #undef __
} // namespace internal } // namespace internal
} // namespace v8 } // namespace v8
......
...@@ -561,26 +561,22 @@ void KeyedStoreIC::GenerateMegamorphic(MacroAssembler* masm, ...@@ -561,26 +561,22 @@ void KeyedStoreIC::GenerateMegamorphic(MacroAssembler* masm,
__ JumpIfNotUniqueNameInstanceType(ebx, &slow); __ JumpIfNotUniqueNameInstanceType(ebx, &slow);
if (FLAG_vector_stores) { // The handlers in the stub cache expect a vector and slot. Since we won't
// The handlers in the stub cache expect a vector and slot. Since we won't // change the IC from any downstream misses, a dummy vector can be used.
// change the IC from any downstream misses, a dummy vector can be used. Handle<TypeFeedbackVector> dummy_vector =
Handle<TypeFeedbackVector> dummy_vector = TypeFeedbackVector::DummyVector(masm->isolate());
TypeFeedbackVector::DummyVector(masm->isolate()); int slot = dummy_vector->GetIndex(
int slot = dummy_vector->GetIndex( FeedbackVectorSlot(TypeFeedbackVector::kDummyKeyedStoreICSlot));
FeedbackVectorSlot(TypeFeedbackVector::kDummyKeyedStoreICSlot)); __ push(Immediate(Smi::FromInt(slot)));
__ push(Immediate(Smi::FromInt(slot))); __ push(Immediate(dummy_vector));
__ push(Immediate(dummy_vector));
}
Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( Code::Flags flags = Code::RemoveTypeAndHolderFromFlags(
Code::ComputeHandlerFlags(Code::STORE_IC)); Code::ComputeHandlerFlags(Code::STORE_IC));
masm->isolate()->stub_cache()->GenerateProbe(masm, Code::STORE_IC, flags, masm->isolate()->stub_cache()->GenerateProbe(masm, Code::STORE_IC, flags,
receiver, key, edi, no_reg); receiver, key, edi, no_reg);
if (FLAG_vector_stores) { __ pop(VectorStoreICDescriptor::VectorRegister());
__ pop(VectorStoreICDescriptor::VectorRegister()); __ pop(VectorStoreICDescriptor::SlotRegister());
__ pop(VectorStoreICDescriptor::SlotRegister());
}
// Cache miss. // Cache miss.
__ jmp(&miss); __ jmp(&miss);
...@@ -732,21 +728,10 @@ void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm, ...@@ -732,21 +728,10 @@ void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm,
void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { void StoreIC::GenerateMegamorphic(MacroAssembler* masm) {
if (FLAG_vector_stores) { // This shouldn't be called.
// This shouldn't be called. // TODO(mvstanton): remove this method.
__ int3(); __ int3();
return; return;
}
// Return address is on the stack.
Code::Flags flags = Code::RemoveTypeAndHolderFromFlags(
Code::ComputeHandlerFlags(Code::STORE_IC));
masm->isolate()->stub_cache()->GenerateProbe(
masm, Code::STORE_IC, flags, StoreDescriptor::ReceiverRegister(),
StoreDescriptor::NameRegister(), ebx, no_reg);
// Cache miss: Jump to runtime.
GenerateMiss(masm);
} }
...@@ -754,25 +739,15 @@ static void StoreIC_PushArgs(MacroAssembler* masm) { ...@@ -754,25 +739,15 @@ static void StoreIC_PushArgs(MacroAssembler* masm) {
Register receiver = StoreDescriptor::ReceiverRegister(); Register receiver = StoreDescriptor::ReceiverRegister();
Register name = StoreDescriptor::NameRegister(); Register name = StoreDescriptor::NameRegister();
Register value = StoreDescriptor::ValueRegister(); Register value = StoreDescriptor::ValueRegister();
Register slot = VectorStoreICDescriptor::SlotRegister();
Register vector = VectorStoreICDescriptor::VectorRegister();
if (FLAG_vector_stores) { __ xchg(receiver, Operand(esp, 0));
Register slot = VectorStoreICDescriptor::SlotRegister(); __ push(name);
Register vector = VectorStoreICDescriptor::VectorRegister(); __ push(value);
__ push(slot);
__ xchg(receiver, Operand(esp, 0)); __ push(vector);
__ push(name); __ push(receiver); // Contains the return address.
__ push(value);
__ push(slot);
__ push(vector);
__ push(receiver); // Contains the return address.
} else {
DCHECK(!ebx.is(receiver) && !ebx.is(name) && !ebx.is(value));
__ pop(ebx);
__ push(receiver);
__ push(name);
__ push(value);
__ push(ebx);
}
} }
...@@ -781,8 +756,7 @@ void StoreIC::GenerateMiss(MacroAssembler* masm) { ...@@ -781,8 +756,7 @@ void StoreIC::GenerateMiss(MacroAssembler* masm) {
StoreIC_PushArgs(masm); StoreIC_PushArgs(masm);
// Perform tail call to the entry. // Perform tail call to the entry.
int args = FLAG_vector_stores ? 5 : 3; __ TailCallRuntime(Runtime::kStoreIC_Miss, 5, 1);
__ TailCallRuntime(Runtime::kStoreIC_Miss, args, 1);
} }
...@@ -798,25 +772,21 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) { ...@@ -798,25 +772,21 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) {
// objects. Push and restore receiver but rely on // objects. Push and restore receiver but rely on
// GenerateDictionaryStore preserving the value and name. // GenerateDictionaryStore preserving the value and name.
__ push(receiver); __ push(receiver);
if (FLAG_vector_stores) { __ push(vector);
__ push(vector); __ push(slot);
__ push(slot);
}
Register dictionary = ebx; Register dictionary = ebx;
__ mov(dictionary, FieldOperand(receiver, JSObject::kPropertiesOffset)); __ mov(dictionary, FieldOperand(receiver, JSObject::kPropertiesOffset));
GenerateDictionaryStore(masm, &restore_miss, dictionary, name, value, GenerateDictionaryStore(masm, &restore_miss, dictionary, name, value,
receiver, edi); receiver, edi);
__ Drop(FLAG_vector_stores ? 3 : 1); __ Drop(3);
Counters* counters = masm->isolate()->counters(); Counters* counters = masm->isolate()->counters();
__ IncrementCounter(counters->store_normal_hit(), 1); __ IncrementCounter(counters->store_normal_hit(), 1);
__ ret(0); __ ret(0);
__ bind(&restore_miss); __ bind(&restore_miss);
if (FLAG_vector_stores) { __ pop(slot);
__ pop(slot); __ pop(vector);
__ pop(vector);
}
__ pop(receiver); __ pop(receiver);
__ IncrementCounter(counters->store_normal_miss(), 1); __ IncrementCounter(counters->store_normal_miss(), 1);
GenerateMiss(masm); GenerateMiss(masm);
...@@ -828,8 +798,7 @@ void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { ...@@ -828,8 +798,7 @@ void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) {
StoreIC_PushArgs(masm); StoreIC_PushArgs(masm);
// Do tail-call to runtime routine. // Do tail-call to runtime routine.
int args = FLAG_vector_stores ? 5 : 3; __ TailCallRuntime(Runtime::kKeyedStoreIC_Miss, 5, 1);
__ TailCallRuntime(Runtime::kKeyedStoreIC_Miss, args, 1);
} }
......
...@@ -3799,89 +3799,6 @@ void RecordWriteStub::CheckNeedsToInformIncrementalMarker( ...@@ -3799,89 +3799,6 @@ void RecordWriteStub::CheckNeedsToInformIncrementalMarker(
} }
void StoreArrayLiteralElementStub::Generate(MacroAssembler* masm) {
// ----------- S t a t e -------------
// -- eax : element value to store
// -- ecx : element index as smi
// -- esp[0] : return address
// -- esp[4] : array literal index in function
// -- esp[8] : array literal
// clobbers ebx, edx, edi
// -----------------------------------
Label element_done;
Label double_elements;
Label smi_element;
Label slow_elements;
Label slow_elements_from_double;
Label fast_elements;
// Get array literal index, array literal and its map.
__ mov(edx, Operand(esp, 1 * kPointerSize));
__ mov(ebx, Operand(esp, 2 * kPointerSize));
__ mov(edi, FieldOperand(ebx, JSObject::kMapOffset));
__ CheckFastElements(edi, &double_elements);
// Check for FAST_*_SMI_ELEMENTS or FAST_*_ELEMENTS elements
__ JumpIfSmi(eax, &smi_element);
__ CheckFastSmiElements(edi, &fast_elements, Label::kNear);
// Store into the array literal requires a elements transition. Call into
// the runtime.
__ bind(&slow_elements);
__ pop(edi); // Pop return address and remember to put back later for tail
// call.
__ push(ebx);
__ push(ecx);
__ push(eax);
__ mov(ebx, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
__ push(FieldOperand(ebx, JSFunction::kLiteralsOffset));
__ push(edx);
__ push(edi); // Return return address so that tail call returns to right
// place.
__ TailCallRuntime(Runtime::kStoreArrayLiteralElement, 5, 1);
__ bind(&slow_elements_from_double);
__ pop(edx);
__ jmp(&slow_elements);
// Array literal has ElementsKind of FAST_*_ELEMENTS and value is an object.
__ bind(&fast_elements);
__ mov(ebx, FieldOperand(ebx, JSObject::kElementsOffset));
__ lea(ecx, FieldOperand(ebx, ecx, times_half_pointer_size,
FixedArrayBase::kHeaderSize));
__ mov(Operand(ecx, 0), eax);
// Update the write barrier for the array store.
__ RecordWrite(ebx, ecx, eax, kDontSaveFPRegs, EMIT_REMEMBERED_SET,
OMIT_SMI_CHECK);
__ ret(0);
// Array literal has ElementsKind of FAST_*_SMI_ELEMENTS or FAST_*_ELEMENTS,
// and value is Smi.
__ bind(&smi_element);
__ mov(ebx, FieldOperand(ebx, JSObject::kElementsOffset));
__ mov(FieldOperand(ebx, ecx, times_half_pointer_size,
FixedArrayBase::kHeaderSize), eax);
__ ret(0);
// Array literal has ElementsKind of FAST_*_DOUBLE_ELEMENTS.
__ bind(&double_elements);
__ push(edx);
__ mov(edx, FieldOperand(ebx, JSObject::kElementsOffset));
__ StoreNumberToDoubleElements(eax,
edx,
ecx,
edi,
&slow_elements_from_double,
false);
__ pop(edx);
__ ret(0);
}
void StubFailureTrampolineStub::Generate(MacroAssembler* masm) { void StubFailureTrampolineStub::Generate(MacroAssembler* masm) {
CEntryStub ces(isolate(), 1, kSaveFPRegs); CEntryStub ces(isolate(), 1, kSaveFPRegs);
__ call(ces.GetCode(), RelocInfo::CODE_TARGET); __ call(ces.GetCode(), RelocInfo::CODE_TARGET);
......
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