Commit e95a2256 authored by mbrandy's avatar mbrandy Committed by Commit bot

PPC: VectorICs: allocating slots for store ics in ast nodes.

Port 5450fc07

Original commit message:
Also adapt code generation to pass the slot to the
store/keyed-store ic. AST nodes ObjectLiteral, Assignment,
ForEach, Call and CountOperation now include one or more
feedback vector ic slot ids.

R=mvstanton@chromium.org, dstence@us.ibm.com, michael_dawson@ca.ibm.com
BUG=

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

Cr-Commit-Position: refs/heads/master@{#28666}
parent 4070b20a
...@@ -1245,7 +1245,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) { ...@@ -1245,7 +1245,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
// Perform the assignment as if via '='. // Perform the assignment as if via '='.
{ {
EffectContext context(this); EffectContext context(this);
EmitAssignment(stmt->each()); EmitAssignment(stmt->each(), stmt->EachFeedbackSlot());
PrepareForBailoutForId(stmt->AssignmentId(), NO_REGISTERS); PrepareForBailoutForId(stmt->AssignmentId(), NO_REGISTERS);
} }
...@@ -1304,13 +1304,15 @@ void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { ...@@ -1304,13 +1304,15 @@ void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) {
void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer,
int offset) { int offset,
FeedbackVectorICSlot slot) {
if (NeedsHomeObject(initializer)) { if (NeedsHomeObject(initializer)) {
__ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
__ mov(StoreDescriptor::NameRegister(), __ mov(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol())); Operand(isolate()->factory()->home_object_symbol()));
__ LoadP(StoreDescriptor::ValueRegister(), __ LoadP(StoreDescriptor::ValueRegister(),
MemOperand(sp, offset * kPointerSize)); MemOperand(sp, offset * kPointerSize));
if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
CallStoreIC(); CallStoreIC();
} }
} }
...@@ -1633,6 +1635,10 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1633,6 +1635,10 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
AccessorTable accessor_table(zone()); AccessorTable accessor_table(zone());
int property_index = 0; int property_index = 0;
// store_slot_index points to the vector ic slot for the next store ic used.
// ObjectLiteral::ComputeFeedbackRequirements controls the allocation of slots
// and must be updated if the number of store ics emitted here changes.
int store_slot_index = 0;
for (; property_index < expr->properties()->length(); property_index++) { for (; property_index < expr->properties()->length(); property_index++) {
ObjectLiteral::Property* property = expr->properties()->at(property_index); ObjectLiteral::Property* property = expr->properties()->at(property_index);
if (property->is_computed_name()) break; if (property->is_computed_name()) break;
...@@ -1659,7 +1665,12 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1659,7 +1665,12 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
DCHECK(StoreDescriptor::ValueRegister().is(r3)); DCHECK(StoreDescriptor::ValueRegister().is(r3));
__ mov(StoreDescriptor::NameRegister(), Operand(key->value())); __ mov(StoreDescriptor::NameRegister(), Operand(key->value()));
__ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
if (FLAG_vector_stores) {
EmitLoadStoreICSlot(expr->GetNthSlot(store_slot_index++));
CallStoreIC();
} else {
CallStoreIC(key->LiteralFeedbackId()); CallStoreIC(key->LiteralFeedbackId());
}
PrepareForBailoutForId(key->id(), NO_REGISTERS); PrepareForBailoutForId(key->id(), NO_REGISTERS);
if (NeedsHomeObject(value)) { if (NeedsHomeObject(value)) {
...@@ -1667,6 +1678,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1667,6 +1678,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
__ mov(StoreDescriptor::NameRegister(), __ mov(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol())); Operand(isolate()->factory()->home_object_symbol()));
__ LoadP(StoreDescriptor::ValueRegister(), MemOperand(sp)); __ LoadP(StoreDescriptor::ValueRegister(), MemOperand(sp));
if (FLAG_vector_stores) {
EmitLoadStoreICSlot(expr->GetNthSlot(store_slot_index++));
}
CallStoreIC(); CallStoreIC();
} }
} else { } else {
...@@ -1680,7 +1694,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1680,7 +1694,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
VisitForStackValue(key); VisitForStackValue(key);
VisitForStackValue(value); VisitForStackValue(value);
if (property->emit_store()) { if (property->emit_store()) {
EmitSetHomeObjectIfNeeded(value, 2); EmitSetHomeObjectIfNeeded(
value, 2, expr->SlotForHomeObject(value, &store_slot_index));
__ LoadSmiLiteral(r3, Smi::FromInt(SLOPPY)); // PropertyAttributes __ LoadSmiLiteral(r3, Smi::FromInt(SLOPPY)); // PropertyAttributes
__ push(r3); __ push(r3);
__ CallRuntime(Runtime::kSetProperty, 4); __ CallRuntime(Runtime::kSetProperty, 4);
...@@ -1717,9 +1732,13 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1717,9 +1732,13 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
__ push(r3); __ push(r3);
VisitForStackValue(it->first); VisitForStackValue(it->first);
EmitAccessor(it->second->getter); EmitAccessor(it->second->getter);
EmitSetHomeObjectIfNeeded(it->second->getter, 2); EmitSetHomeObjectIfNeeded(
it->second->getter, 2,
expr->SlotForHomeObject(it->second->getter, &store_slot_index));
EmitAccessor(it->second->setter); EmitAccessor(it->second->setter);
EmitSetHomeObjectIfNeeded(it->second->setter, 3); EmitSetHomeObjectIfNeeded(
it->second->setter, 3,
expr->SlotForHomeObject(it->second->setter, &store_slot_index));
__ LoadSmiLiteral(r3, Smi::FromInt(NONE)); __ LoadSmiLiteral(r3, Smi::FromInt(NONE));
__ push(r3); __ push(r3);
__ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5);
...@@ -1754,7 +1773,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1754,7 +1773,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
} else { } else {
EmitPropertyKey(property, expr->GetIdForProperty(property_index)); EmitPropertyKey(property, expr->GetIdForProperty(property_index));
VisitForStackValue(value); VisitForStackValue(value);
EmitSetHomeObjectIfNeeded(value, 2); EmitSetHomeObjectIfNeeded(
value, 2, expr->SlotForHomeObject(value, &store_slot_index));
switch (property->kind()) { switch (property->kind()) {
case ObjectLiteral::Property::CONSTANT: case ObjectLiteral::Property::CONSTANT:
...@@ -1800,6 +1820,10 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1800,6 +1820,10 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
} else { } else {
context()->Plug(r3); context()->Plug(r3);
} }
// Verify that compilation exactly consumed the number of store ic slots that
// the ObjectLiteral node had to offer.
DCHECK(!FLAG_vector_stores || store_slot_index == expr->slot_count());
} }
...@@ -1913,7 +1937,7 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { ...@@ -1913,7 +1937,7 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
Comment cmnt(masm_, "[ Assignment"); Comment cmnt(masm_, "[ Assignment");
Property* property = expr->target()->AsProperty(); Property* property = expr->target()->AsProperty();
LhsKind assign_type = GetAssignType(property); LhsKind assign_type = Property::GetAssignType(property);
// Evaluate LHS expression. // Evaluate LHS expression.
switch (assign_type) { switch (assign_type) {
...@@ -2024,7 +2048,7 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { ...@@ -2024,7 +2048,7 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
switch (assign_type) { switch (assign_type) {
case VARIABLE: case VARIABLE:
EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), EmitVariableAssignment(expr->target()->AsVariableProxy()->var(),
expr->op()); expr->op(), expr->AssignmentSlot());
PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
context()->Plug(r3); context()->Plug(r3);
break; break;
...@@ -2596,17 +2620,18 @@ void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr, Token::Value op) { ...@@ -2596,17 +2620,18 @@ void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr, Token::Value op) {
} }
void FullCodeGenerator::EmitAssignment(Expression* expr) { void FullCodeGenerator::EmitAssignment(Expression* expr,
FeedbackVectorICSlot slot) {
DCHECK(expr->IsValidReferenceExpression()); DCHECK(expr->IsValidReferenceExpression());
Property* prop = expr->AsProperty(); Property* prop = expr->AsProperty();
LhsKind assign_type = GetAssignType(prop); LhsKind assign_type = Property::GetAssignType(prop);
switch (assign_type) { switch (assign_type) {
case VARIABLE: { case VARIABLE: {
Variable* var = expr->AsVariableProxy()->var(); Variable* var = expr->AsVariableProxy()->var();
EffectContext context(this); EffectContext context(this);
EmitVariableAssignment(var, Token::ASSIGN); EmitVariableAssignment(var, Token::ASSIGN, slot);
break; break;
} }
case NAMED_PROPERTY: { case NAMED_PROPERTY: {
...@@ -2616,6 +2641,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr) { ...@@ -2616,6 +2641,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr) {
__ pop(StoreDescriptor::ValueRegister()); // Restore value. __ pop(StoreDescriptor::ValueRegister()); // Restore value.
__ mov(StoreDescriptor::NameRegister(), __ mov(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value())); Operand(prop->key()->AsLiteral()->value()));
if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
CallStoreIC(); CallStoreIC();
break; break;
} }
...@@ -2662,6 +2688,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr) { ...@@ -2662,6 +2688,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr) {
__ Move(StoreDescriptor::NameRegister(), r3); __ Move(StoreDescriptor::NameRegister(), r3);
__ Pop(StoreDescriptor::ValueRegister(), __ Pop(StoreDescriptor::ValueRegister(),
StoreDescriptor::ReceiverRegister()); StoreDescriptor::ReceiverRegister());
if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
Handle<Code> ic = Handle<Code> ic =
CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
CallIC(ic); CallIC(ic);
...@@ -2685,11 +2712,13 @@ void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( ...@@ -2685,11 +2712,13 @@ void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot(
} }
void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op) { void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
FeedbackVectorICSlot slot) {
if (var->IsUnallocated()) { if (var->IsUnallocated()) {
// Global var, const, or let. // Global var, const, or let.
__ mov(StoreDescriptor::NameRegister(), Operand(var->name())); __ mov(StoreDescriptor::NameRegister(), Operand(var->name()));
__ LoadP(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand()); __ LoadP(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand());
if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
CallStoreIC(); CallStoreIC();
} else if (var->mode() == LET && op != Token::INIT_LET) { } else if (var->mode() == LET && op != Token::INIT_LET) {
...@@ -2785,7 +2814,12 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { ...@@ -2785,7 +2814,12 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
__ mov(StoreDescriptor::NameRegister(), __ mov(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value())); Operand(prop->key()->AsLiteral()->value()));
__ pop(StoreDescriptor::ReceiverRegister()); __ pop(StoreDescriptor::ReceiverRegister());
if (FLAG_vector_stores) {
EmitLoadStoreICSlot(expr->AssignmentSlot());
CallStoreIC();
} else {
CallStoreIC(expr->AssignmentFeedbackId()); CallStoreIC(expr->AssignmentFeedbackId());
}
PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
context()->Plug(r3); context()->Plug(r3);
...@@ -2832,7 +2866,12 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { ...@@ -2832,7 +2866,12 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
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());
CallIC(ic);
} else {
CallIC(ic, expr->AssignmentFeedbackId()); CallIC(ic, expr->AssignmentFeedbackId());
}
PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
context()->Plug(r3); context()->Plug(r3);
...@@ -3069,7 +3108,7 @@ void FullCodeGenerator::EmitLoadSuperConstructor() { ...@@ -3069,7 +3108,7 @@ void FullCodeGenerator::EmitLoadSuperConstructor() {
void FullCodeGenerator::EmitInitializeThisAfterSuper( void FullCodeGenerator::EmitInitializeThisAfterSuper(
SuperReference* super_ref) { SuperReference* super_ref, FeedbackVectorICSlot slot) {
Variable* this_var = super_ref->this_var()->var(); Variable* this_var = super_ref->this_var()->var();
GetVar(r4, this_var); GetVar(r4, this_var);
__ CompareRoot(r4, Heap::kTheHoleValueRootIndex); __ CompareRoot(r4, Heap::kTheHoleValueRootIndex);
...@@ -3080,7 +3119,7 @@ void FullCodeGenerator::EmitInitializeThisAfterSuper( ...@@ -3080,7 +3119,7 @@ void FullCodeGenerator::EmitInitializeThisAfterSuper(
__ CallRuntime(Runtime::kThrowReferenceError, 1); __ CallRuntime(Runtime::kThrowReferenceError, 1);
__ bind(&uninitialized_this); __ bind(&uninitialized_this);
EmitVariableAssignment(this_var, Token::INIT_CONST); EmitVariableAssignment(this_var, Token::INIT_CONST, slot);
} }
...@@ -3310,7 +3349,8 @@ void FullCodeGenerator::EmitSuperConstructorCall(Call* expr) { ...@@ -3310,7 +3349,8 @@ void FullCodeGenerator::EmitSuperConstructorCall(Call* expr) {
RecordJSReturnSite(expr); RecordJSReturnSite(expr);
EmitInitializeThisAfterSuper(expr->expression()->AsSuperReference()); EmitInitializeThisAfterSuper(expr->expression()->AsSuperReference(),
expr->CallFeedbackICSlot());
context()->Plug(r3); context()->Plug(r3);
} }
...@@ -4629,6 +4669,7 @@ void FullCodeGenerator::EmitCallSuperWithSpread(CallRuntime* expr) { ...@@ -4629,6 +4669,7 @@ void FullCodeGenerator::EmitCallSuperWithSpread(CallRuntime* expr) {
__ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); __ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
context()->DropAndPlug(1, r3); context()->DropAndPlug(1, r3);
// TODO(mvstanton): with FLAG_vector_stores this needs a slot id.
EmitInitializeThisAfterSuper(super_reference); EmitInitializeThisAfterSuper(super_reference);
} }
...@@ -4827,7 +4868,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -4827,7 +4868,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
SetSourcePosition(expr->position()); SetSourcePosition(expr->position());
Property* prop = expr->expression()->AsProperty(); Property* prop = expr->expression()->AsProperty();
LhsKind assign_type = GetAssignType(prop); LhsKind assign_type = Property::GetAssignType(prop);
// Evaluate expression and get value. // Evaluate expression and get value.
if (assign_type == VARIABLE) { if (assign_type == VARIABLE) {
...@@ -4994,7 +5035,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -4994,7 +5035,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
{ {
EffectContext context(this); EffectContext context(this);
EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(),
Token::ASSIGN); Token::ASSIGN, expr->CountSlot());
PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
context.Plug(r3); context.Plug(r3);
} }
...@@ -5005,7 +5046,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -5005,7 +5046,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
} }
} else { } else {
EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(),
Token::ASSIGN); Token::ASSIGN, expr->CountSlot());
PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
context()->Plug(r3); context()->Plug(r3);
} }
...@@ -5014,7 +5055,12 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -5014,7 +5055,12 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
__ mov(StoreDescriptor::NameRegister(), __ mov(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value())); Operand(prop->key()->AsLiteral()->value()));
__ pop(StoreDescriptor::ReceiverRegister()); __ pop(StoreDescriptor::ReceiverRegister());
if (FLAG_vector_stores) {
EmitLoadStoreICSlot(expr->CountSlot());
CallStoreIC();
} else {
CallStoreIC(expr->CountStoreFeedbackId()); 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()) {
...@@ -5052,7 +5098,12 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -5052,7 +5098,12 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
StoreDescriptor::NameRegister()); StoreDescriptor::NameRegister());
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());
CallIC(ic);
} else {
CallIC(ic, expr->CountStoreFeedbackId()); CallIC(ic, 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()) {
...@@ -5390,6 +5441,13 @@ void FullCodeGenerator::ClearPendingMessage() { ...@@ -5390,6 +5441,13 @@ void FullCodeGenerator::ClearPendingMessage() {
} }
void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorICSlot slot) {
DCHECK(FLAG_vector_stores && !slot.IsInvalid());
__ mov(VectorStoreICTrampolineDescriptor::SlotRegister(),
Operand(SmiFromSlot(slot)));
}
#undef __ #undef __
......
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