Commit f1e418e8 authored by machenbach's avatar machenbach Committed by Commit bot

Reland of [fullcodegen] Refactor code that calls store ICs. (patchset #1 id:1...

Reland of [fullcodegen] Refactor code that calls store ICs. (patchset #1 id:1 of https://codereview.chromium.org/2363123002/ )

Reason for revert:
Didn't help

Original issue's description:
> Revert of [fullcodegen] Refactor code that calls store ICs. (patchset #1 id:20001 of https://codereview.chromium.org/2363513003/ )
>
> Reason for revert:
> race suspect:
> https://build.chromium.org/p/client.v8/builders/V8%20Linux64%20TSAN/builds/11893
>
> Original issue's description:
> > [fullcodegen] Refactor code that calls store ICs.
> >
> > Make FCG::CallStoreIC() load slot and name and make FCG::CallKeyedStoreIC() load
> > slot according to store IC calling convention (StoreDescriptor).
> >
> > BUG=v8:5407
> >
> > Committed: https://crrev.com/12918397b4af7b2bede8b29e1e9b1940d5d5ad3b
> > Cr-Commit-Position: refs/heads/master@{#39679}
>
> TBR=mvstanton@chromium.org,ishell@chromium.org
> # Skipping CQ checks because original CL landed less than 1 days ago.
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=v8:5407
>
> Committed: https://crrev.com/51fa56d1b8e9e320f7442682415e9df50ab19591
> Cr-Commit-Position: refs/heads/master@{#39682}

TBR=mvstanton@chromium.org,ishell@chromium.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=v8:5407

Review-Url: https://codereview.chromium.org/2361393005
Cr-Commit-Position: refs/heads/master@{#39683}
parent 51fa56d1
...@@ -1168,12 +1168,9 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, ...@@ -1168,12 +1168,9 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ ldr(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); __ ldr(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
__ mov(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol()));
__ ldr(StoreDescriptor::ValueRegister(), __ ldr(StoreDescriptor::ValueRegister(),
MemOperand(sp, offset * kPointerSize)); MemOperand(sp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1182,12 +1179,9 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, ...@@ -1182,12 +1179,9 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ Move(StoreDescriptor::ReceiverRegister(), r0); __ Move(StoreDescriptor::ReceiverRegister(), r0);
__ mov(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol()));
__ ldr(StoreDescriptor::ValueRegister(), __ ldr(StoreDescriptor::ValueRegister(),
MemOperand(sp, offset * kPointerSize)); MemOperand(sp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1422,10 +1416,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1422,10 +1416,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
if (property->emit_store()) { if (property->emit_store()) {
VisitForAccumulatorValue(value); VisitForAccumulatorValue(value);
DCHECK(StoreDescriptor::ValueRegister().is(r0)); DCHECK(StoreDescriptor::ValueRegister().is(r0));
__ mov(StoreDescriptor::NameRegister(), Operand(key->value()));
__ ldr(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); __ ldr(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
EmitLoadStoreICSlot(property->GetSlot(0)); CallStoreIC(property->GetSlot(0), key->value());
CallStoreIC();
PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS); PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS);
if (NeedsHomeObject(value)) { if (NeedsHomeObject(value)) {
...@@ -1623,8 +1615,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { ...@@ -1623,8 +1615,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
__ mov(StoreDescriptor::NameRegister(), Operand(Smi::FromInt(array_index))); __ mov(StoreDescriptor::NameRegister(), Operand(Smi::FromInt(array_index)));
__ ldr(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0)); __ ldr(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0));
EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); CallKeyedStoreIC(expr->LiteralFeedbackSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->GetIdForElement(array_index), PrepareForBailoutForId(expr->GetIdForElement(array_index),
BailoutState::NO_REGISTERS); BailoutState::NO_REGISTERS);
...@@ -2056,10 +2047,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2056,10 +2047,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
VisitForAccumulatorValue(prop->obj()); VisitForAccumulatorValue(prop->obj());
__ Move(StoreDescriptor::ReceiverRegister(), r0); __ Move(StoreDescriptor::ReceiverRegister(), r0);
PopOperand(StoreDescriptor::ValueRegister()); // Restore value. PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
__ mov(StoreDescriptor::NameRegister(), CallStoreIC(slot, prop->key()->AsLiteral()->value());
Operand(prop->key()->AsLiteral()->value()));
EmitLoadStoreICSlot(slot);
CallStoreIC();
break; break;
} }
case NAMED_SUPER_PROPERTY: { case NAMED_SUPER_PROPERTY: {
...@@ -2106,8 +2094,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2106,8 +2094,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
__ Move(StoreDescriptor::NameRegister(), r0); __ Move(StoreDescriptor::NameRegister(), r0);
PopOperands(StoreDescriptor::ValueRegister(), PopOperands(StoreDescriptor::ValueRegister(),
StoreDescriptor::ReceiverRegister()); StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(slot); CallKeyedStoreIC(slot);
CallKeyedStoreIC();
break; break;
} }
} }
...@@ -2132,10 +2119,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, ...@@ -2132,10 +2119,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
if (var->IsUnallocated()) { if (var->IsUnallocated()) {
// Global var, const, or let. // Global var, const, or let.
__ mov(StoreDescriptor::NameRegister(), Operand(var->name()));
__ LoadGlobalObject(StoreDescriptor::ReceiverRegister()); __ LoadGlobalObject(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(slot); CallStoreIC(slot, var->name());
CallStoreIC();
} else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) { } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) {
DCHECK(!var->IsLookupSlot()); DCHECK(!var->IsLookupSlot());
...@@ -2203,11 +2188,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { ...@@ -2203,11 +2188,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
DCHECK(prop != NULL); DCHECK(prop != NULL);
DCHECK(prop->key()->IsLiteral()); DCHECK(prop->key()->IsLiteral());
__ mov(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value()));
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(r0); context()->Plug(r0);
...@@ -2249,8 +2231,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { ...@@ -2249,8 +2231,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
StoreDescriptor::NameRegister()); StoreDescriptor::NameRegister());
DCHECK(StoreDescriptor::ValueRegister().is(r0)); DCHECK(StoreDescriptor::ValueRegister().is(r0));
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallKeyedStoreIC(expr->AssignmentSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(r0); context()->Plug(r0);
...@@ -3304,11 +3285,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3304,11 +3285,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
} }
break; break;
case NAMED_PROPERTY: { case NAMED_PROPERTY: {
__ mov(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value()));
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallStoreIC(expr->CountSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
...@@ -3346,8 +3324,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3346,8 +3324,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
case KEYED_PROPERTY: { case KEYED_PROPERTY: {
PopOperands(StoreDescriptor::ReceiverRegister(), PopOperands(StoreDescriptor::ReceiverRegister(),
StoreDescriptor::NameRegister()); StoreDescriptor::NameRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallKeyedStoreIC(expr->CountSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
......
...@@ -1158,11 +1158,8 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, ...@@ -1158,11 +1158,8 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ Peek(StoreDescriptor::ReceiverRegister(), 0); __ Peek(StoreDescriptor::ReceiverRegister(), 0);
__ Mov(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol()));
__ Peek(StoreDescriptor::ValueRegister(), offset * kPointerSize); __ Peek(StoreDescriptor::ValueRegister(), offset * kPointerSize);
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1171,11 +1168,8 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, ...@@ -1171,11 +1168,8 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ Move(StoreDescriptor::ReceiverRegister(), x0); __ Move(StoreDescriptor::ReceiverRegister(), x0);
__ Mov(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol()));
__ Peek(StoreDescriptor::ValueRegister(), offset * kPointerSize); __ Peek(StoreDescriptor::ValueRegister(), offset * kPointerSize);
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1409,10 +1403,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1409,10 +1403,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
if (property->emit_store()) { if (property->emit_store()) {
VisitForAccumulatorValue(value); VisitForAccumulatorValue(value);
DCHECK(StoreDescriptor::ValueRegister().is(x0)); DCHECK(StoreDescriptor::ValueRegister().is(x0));
__ Mov(StoreDescriptor::NameRegister(), Operand(key->value()));
__ Peek(StoreDescriptor::ReceiverRegister(), 0); __ Peek(StoreDescriptor::ReceiverRegister(), 0);
EmitLoadStoreICSlot(property->GetSlot(0)); CallStoreIC(property->GetSlot(0), key->value());
CallStoreIC();
PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS); PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS);
if (NeedsHomeObject(value)) { if (NeedsHomeObject(value)) {
...@@ -1606,8 +1598,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { ...@@ -1606,8 +1598,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
__ Mov(StoreDescriptor::NameRegister(), Smi::FromInt(array_index)); __ Mov(StoreDescriptor::NameRegister(), Smi::FromInt(array_index));
__ Peek(StoreDescriptor::ReceiverRegister(), 0); __ Peek(StoreDescriptor::ReceiverRegister(), 0);
EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); CallKeyedStoreIC(expr->LiteralFeedbackSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->GetIdForElement(array_index), PrepareForBailoutForId(expr->GetIdForElement(array_index),
BailoutState::NO_REGISTERS); BailoutState::NO_REGISTERS);
...@@ -1949,10 +1940,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -1949,10 +1940,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
// this copy. // this copy.
__ Mov(StoreDescriptor::ReceiverRegister(), x0); __ Mov(StoreDescriptor::ReceiverRegister(), x0);
PopOperand(StoreDescriptor::ValueRegister()); // Restore value. PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
__ Mov(StoreDescriptor::NameRegister(), CallStoreIC(slot, prop->key()->AsLiteral()->value());
Operand(prop->key()->AsLiteral()->value()));
EmitLoadStoreICSlot(slot);
CallStoreIC();
break; break;
} }
case NAMED_SUPER_PROPERTY: { case NAMED_SUPER_PROPERTY: {
...@@ -1999,8 +1987,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -1999,8 +1987,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
__ Mov(StoreDescriptor::NameRegister(), x0); __ Mov(StoreDescriptor::NameRegister(), x0);
PopOperands(StoreDescriptor::ReceiverRegister(), PopOperands(StoreDescriptor::ReceiverRegister(),
StoreDescriptor::ValueRegister()); StoreDescriptor::ValueRegister());
EmitLoadStoreICSlot(slot); CallKeyedStoreIC(slot);
CallKeyedStoreIC();
break; break;
} }
} }
...@@ -2026,10 +2013,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, ...@@ -2026,10 +2013,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
ASM_LOCATION("FullCodeGenerator::EmitVariableAssignment"); ASM_LOCATION("FullCodeGenerator::EmitVariableAssignment");
if (var->IsUnallocated()) { if (var->IsUnallocated()) {
// Global var, const, or let. // Global var, const, or let.
__ Mov(StoreDescriptor::NameRegister(), Operand(var->name()));
__ LoadGlobalObject(StoreDescriptor::ReceiverRegister()); __ LoadGlobalObject(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(slot); CallStoreIC(slot, var->name());
CallStoreIC();
} else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) { } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) {
DCHECK(!var->IsLookupSlot()); DCHECK(!var->IsLookupSlot());
...@@ -2095,11 +2080,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { ...@@ -2095,11 +2080,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
DCHECK(prop != NULL); DCHECK(prop != NULL);
DCHECK(prop->key()->IsLiteral()); DCHECK(prop->key()->IsLiteral());
__ Mov(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value()));
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(x0); context()->Plug(x0);
...@@ -2144,8 +2126,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { ...@@ -2144,8 +2126,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
StoreDescriptor::ReceiverRegister()); StoreDescriptor::ReceiverRegister());
DCHECK(StoreDescriptor::ValueRegister().is(x0)); DCHECK(StoreDescriptor::ValueRegister().is(x0));
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallKeyedStoreIC(expr->AssignmentSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(x0); context()->Plug(x0);
...@@ -3226,11 +3207,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3226,11 +3207,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
} }
break; break;
case NAMED_PROPERTY: { case NAMED_PROPERTY: {
__ Mov(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value()));
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallStoreIC(expr->CountSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
...@@ -3268,8 +3246,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3268,8 +3246,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
case KEYED_PROPERTY: { case KEYED_PROPERTY: {
PopOperand(StoreDescriptor::NameRegister()); PopOperand(StoreDescriptor::NameRegister());
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallKeyedStoreIC(expr->CountSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
......
...@@ -235,31 +235,37 @@ void FullCodeGenerator::CallLoadGlobalIC(TypeofMode typeof_mode, ...@@ -235,31 +235,37 @@ void FullCodeGenerator::CallLoadGlobalIC(TypeofMode typeof_mode,
CallIC(ic, id); CallIC(ic, id);
} }
void FullCodeGenerator::CallStoreIC(TypeFeedbackId id) { void FullCodeGenerator::CallStoreIC(FeedbackVectorSlot slot,
Handle<Code> ic = CodeFactory::StoreIC(isolate(), language_mode()).code(); Handle<Object> name, TypeFeedbackId id) {
DCHECK(name->IsName());
__ Move(StoreDescriptor::NameRegister(), name);
STATIC_ASSERT(!StoreDescriptor::kPassLastArgsOnStack || STATIC_ASSERT(!StoreDescriptor::kPassLastArgsOnStack ||
StoreDescriptor::kStackArgumentsCount == 2); StoreDescriptor::kStackArgumentsCount == 2);
if (StoreDescriptor::kPassLastArgsOnStack) { if (StoreDescriptor::kPassLastArgsOnStack) {
__ Push(StoreDescriptor::ValueRegister()); __ Push(StoreDescriptor::ValueRegister());
__ Push(StoreDescriptor::SlotRegister()); EmitPushSlot(slot);
} else {
EmitLoadSlot(StoreDescriptor::SlotRegister(), slot);
} }
Handle<Code> ic = CodeFactory::StoreIC(isolate(), language_mode()).code();
CallIC(ic, id); CallIC(ic, id);
RestoreContext(); RestoreContext();
} }
void FullCodeGenerator::CallKeyedStoreIC() { void FullCodeGenerator::CallKeyedStoreIC(FeedbackVectorSlot slot) {
Handle<Code> ic =
CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
STATIC_ASSERT(!StoreDescriptor::kPassLastArgsOnStack || STATIC_ASSERT(!StoreDescriptor::kPassLastArgsOnStack ||
StoreDescriptor::kStackArgumentsCount == 2); StoreDescriptor::kStackArgumentsCount == 2);
if (StoreDescriptor::kPassLastArgsOnStack) { if (StoreDescriptor::kPassLastArgsOnStack) {
__ Push(StoreDescriptor::ValueRegister()); __ Push(StoreDescriptor::ValueRegister());
__ Push(StoreDescriptor::SlotRegister()); EmitPushSlot(slot);
} else {
EmitLoadSlot(StoreDescriptor::SlotRegister(), slot);
} }
Handle<Code> ic =
CodeFactory::KeyedStoreIC(isolate(), language_mode()).code();
CallIC(ic); CallIC(ic);
RestoreContext(); RestoreContext();
} }
...@@ -488,7 +494,6 @@ void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { ...@@ -488,7 +494,6 @@ void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) {
EmitVariableLoad(expr); EmitVariableLoad(expr);
} }
void FullCodeGenerator::VisitSloppyBlockFunctionStatement( void FullCodeGenerator::VisitSloppyBlockFunctionStatement(
SloppyBlockFunctionStatement* declaration) { SloppyBlockFunctionStatement* declaration) {
Visit(declaration->statement()); Visit(declaration->statement());
...@@ -1129,9 +1134,14 @@ void FullCodeGenerator::EmitPropertyKey(LiteralProperty* property, ...@@ -1129,9 +1134,14 @@ void FullCodeGenerator::EmitPropertyKey(LiteralProperty* property,
PushOperand(result_register()); PushOperand(result_register());
} }
void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorSlot slot) { void FullCodeGenerator::EmitLoadSlot(Register destination,
FeedbackVectorSlot slot) {
DCHECK(!slot.IsInvalid()); DCHECK(!slot.IsInvalid());
__ Move(StoreDescriptor::SlotRegister(), SmiFromSlot(slot)); __ Move(destination, SmiFromSlot(slot));
}
void FullCodeGenerator::EmitPushSlot(FeedbackVectorSlot slot) {
__ Push(SmiFromSlot(slot));
} }
void FullCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { void FullCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) {
......
...@@ -613,7 +613,10 @@ class FullCodeGenerator final : public AstVisitor<FullCodeGenerator> { ...@@ -613,7 +613,10 @@ class FullCodeGenerator final : public AstVisitor<FullCodeGenerator> {
void EmitSetHomeObjectAccumulator(Expression* initializer, int offset, void EmitSetHomeObjectAccumulator(Expression* initializer, int offset,
FeedbackVectorSlot slot); FeedbackVectorSlot slot);
void EmitLoadStoreICSlot(FeedbackVectorSlot slot); // Platform-specific code for loading a slot to a register.
void EmitLoadSlot(Register destination, FeedbackVectorSlot slot);
// Platform-specific code for pushing a slot to the stack.
void EmitPushSlot(FeedbackVectorSlot slot);
void CallIC(Handle<Code> code, void CallIC(Handle<Code> code,
TypeFeedbackId id = TypeFeedbackId::None()); TypeFeedbackId id = TypeFeedbackId::None());
...@@ -622,8 +625,9 @@ class FullCodeGenerator final : public AstVisitor<FullCodeGenerator> { ...@@ -622,8 +625,9 @@ class FullCodeGenerator final : public AstVisitor<FullCodeGenerator> {
// Inside typeof reference errors are never thrown. // Inside typeof reference errors are never thrown.
void CallLoadGlobalIC(TypeofMode typeof_mode, void CallLoadGlobalIC(TypeofMode typeof_mode,
TypeFeedbackId id = TypeFeedbackId::None()); TypeFeedbackId id = TypeFeedbackId::None());
void CallStoreIC(TypeFeedbackId id = TypeFeedbackId::None()); void CallStoreIC(FeedbackVectorSlot slot, Handle<Object> name,
void CallKeyedStoreIC(); TypeFeedbackId id = TypeFeedbackId::None());
void CallKeyedStoreIC(FeedbackVectorSlot slot);
void SetFunctionPosition(FunctionLiteral* fun); void SetFunctionPosition(FunctionLiteral* fun);
void SetReturnPosition(FunctionLiteral* fun); void SetReturnPosition(FunctionLiteral* fun);
......
...@@ -1092,11 +1092,8 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, ...@@ -1092,11 +1092,8 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0));
__ mov(StoreDescriptor::NameRegister(),
Immediate(isolate()->factory()->home_object_symbol()));
__ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize)); __ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1105,11 +1102,8 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, ...@@ -1105,11 +1102,8 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ mov(StoreDescriptor::ReceiverRegister(), eax); __ mov(StoreDescriptor::ReceiverRegister(), eax);
__ mov(StoreDescriptor::NameRegister(),
Immediate(isolate()->factory()->home_object_symbol()));
__ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize)); __ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1344,10 +1338,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1344,10 +1338,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
if (property->emit_store()) { if (property->emit_store()) {
VisitForAccumulatorValue(value); VisitForAccumulatorValue(value);
DCHECK(StoreDescriptor::ValueRegister().is(eax)); DCHECK(StoreDescriptor::ValueRegister().is(eax));
__ mov(StoreDescriptor::NameRegister(), Immediate(key->value()));
__ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0));
EmitLoadStoreICSlot(property->GetSlot(0)); CallStoreIC(property->GetSlot(0), key->value());
CallStoreIC();
PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS); PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS);
if (NeedsHomeObject(value)) { if (NeedsHomeObject(value)) {
EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1)); EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1));
...@@ -1538,8 +1530,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { ...@@ -1538,8 +1530,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
__ mov(StoreDescriptor::NameRegister(), __ mov(StoreDescriptor::NameRegister(),
Immediate(Smi::FromInt(array_index))); Immediate(Smi::FromInt(array_index)));
__ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0));
EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); CallKeyedStoreIC(expr->LiteralFeedbackSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->GetIdForElement(array_index), PrepareForBailoutForId(expr->GetIdForElement(array_index),
BailoutState::NO_REGISTERS); BailoutState::NO_REGISTERS);
} }
...@@ -1962,10 +1953,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -1962,10 +1953,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
VisitForAccumulatorValue(prop->obj()); VisitForAccumulatorValue(prop->obj());
__ Move(StoreDescriptor::ReceiverRegister(), eax); __ Move(StoreDescriptor::ReceiverRegister(), eax);
PopOperand(StoreDescriptor::ValueRegister()); // Restore value. PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
__ mov(StoreDescriptor::NameRegister(), CallStoreIC(slot, prop->key()->AsLiteral()->value());
prop->key()->AsLiteral()->value());
EmitLoadStoreICSlot(slot);
CallStoreIC();
break; break;
} }
case NAMED_SUPER_PROPERTY: { case NAMED_SUPER_PROPERTY: {
...@@ -2012,8 +2000,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2012,8 +2000,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
__ Move(StoreDescriptor::NameRegister(), eax); __ Move(StoreDescriptor::NameRegister(), eax);
PopOperand(StoreDescriptor::ReceiverRegister()); // Receiver. PopOperand(StoreDescriptor::ReceiverRegister()); // Receiver.
PopOperand(StoreDescriptor::ValueRegister()); // Restore value. PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
EmitLoadStoreICSlot(slot); CallKeyedStoreIC(slot);
CallKeyedStoreIC();
break; break;
} }
} }
...@@ -2036,13 +2023,11 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, ...@@ -2036,13 +2023,11 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
if (var->IsUnallocated()) { if (var->IsUnallocated()) {
// Global var, const, or let. // Global var, const, or let.
__ mov(StoreDescriptor::NameRegister(), var->name());
__ mov(StoreDescriptor::ReceiverRegister(), NativeContextOperand()); __ mov(StoreDescriptor::ReceiverRegister(), NativeContextOperand());
__ mov(StoreDescriptor::ReceiverRegister(), __ mov(StoreDescriptor::ReceiverRegister(),
ContextOperand(StoreDescriptor::ReceiverRegister(), ContextOperand(StoreDescriptor::ReceiverRegister(),
Context::EXTENSION_INDEX)); Context::EXTENSION_INDEX));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, var->name());
CallStoreIC();
} else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) { } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) {
DCHECK(!var->IsLookupSlot()); DCHECK(!var->IsLookupSlot());
...@@ -2110,10 +2095,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { ...@@ -2110,10 +2095,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
DCHECK(prop != NULL); DCHECK(prop != NULL);
DCHECK(prop->key()->IsLiteral()); DCHECK(prop->key()->IsLiteral());
__ mov(StoreDescriptor::NameRegister(), prop->key()->AsLiteral()->value());
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(eax); context()->Plug(eax);
} }
...@@ -2156,8 +2139,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { ...@@ -2156,8 +2139,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
PopOperand(StoreDescriptor::NameRegister()); // Key. PopOperand(StoreDescriptor::NameRegister()); // Key.
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
DCHECK(StoreDescriptor::ValueRegister().is(eax)); DCHECK(StoreDescriptor::ValueRegister().is(eax));
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallKeyedStoreIC(expr->AssignmentSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(eax); context()->Plug(eax);
} }
...@@ -3202,11 +3184,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3202,11 +3184,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
} }
break; break;
case NAMED_PROPERTY: { case NAMED_PROPERTY: {
__ mov(StoreDescriptor::NameRegister(),
prop->key()->AsLiteral()->value());
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallStoreIC(expr->CountSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
...@@ -3244,8 +3223,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3244,8 +3223,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
case KEYED_PROPERTY: { case KEYED_PROPERTY: {
PopOperand(StoreDescriptor::NameRegister()); PopOperand(StoreDescriptor::NameRegister());
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallKeyedStoreIC(expr->CountSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
// Result is on the stack // Result is on the stack
......
...@@ -1163,12 +1163,9 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, ...@@ -1163,12 +1163,9 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ lw(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); __ lw(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
__ li(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol()));
__ lw(StoreDescriptor::ValueRegister(), __ lw(StoreDescriptor::ValueRegister(),
MemOperand(sp, offset * kPointerSize)); MemOperand(sp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1177,12 +1174,9 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, ...@@ -1177,12 +1174,9 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ Move(StoreDescriptor::ReceiverRegister(), v0); __ Move(StoreDescriptor::ReceiverRegister(), v0);
__ li(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol()));
__ lw(StoreDescriptor::ValueRegister(), __ lw(StoreDescriptor::ValueRegister(),
MemOperand(sp, offset * kPointerSize)); MemOperand(sp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1419,10 +1413,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1419,10 +1413,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
VisitForAccumulatorValue(value); VisitForAccumulatorValue(value);
__ mov(StoreDescriptor::ValueRegister(), result_register()); __ mov(StoreDescriptor::ValueRegister(), result_register());
DCHECK(StoreDescriptor::ValueRegister().is(a0)); DCHECK(StoreDescriptor::ValueRegister().is(a0));
__ li(StoreDescriptor::NameRegister(), Operand(key->value()));
__ lw(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); __ lw(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
EmitLoadStoreICSlot(property->GetSlot(0)); CallStoreIC(property->GetSlot(0), key->value());
CallStoreIC();
PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS); PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS);
if (NeedsHomeObject(value)) { if (NeedsHomeObject(value)) {
...@@ -1620,8 +1612,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { ...@@ -1620,8 +1612,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
__ li(StoreDescriptor::NameRegister(), Operand(Smi::FromInt(array_index))); __ li(StoreDescriptor::NameRegister(), Operand(Smi::FromInt(array_index)));
__ lw(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0)); __ lw(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0));
__ mov(StoreDescriptor::ValueRegister(), result_register()); __ mov(StoreDescriptor::ValueRegister(), result_register());
EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); CallKeyedStoreIC(expr->LiteralFeedbackSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->GetIdForElement(array_index), PrepareForBailoutForId(expr->GetIdForElement(array_index),
BailoutState::NO_REGISTERS); BailoutState::NO_REGISTERS);
...@@ -2060,10 +2051,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2060,10 +2051,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
VisitForAccumulatorValue(prop->obj()); VisitForAccumulatorValue(prop->obj());
__ mov(StoreDescriptor::ReceiverRegister(), result_register()); __ mov(StoreDescriptor::ReceiverRegister(), result_register());
PopOperand(StoreDescriptor::ValueRegister()); // Restore value. PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
__ li(StoreDescriptor::NameRegister(), CallStoreIC(slot, prop->key()->AsLiteral()->value());
Operand(prop->key()->AsLiteral()->value()));
EmitLoadStoreICSlot(slot);
CallStoreIC();
break; break;
} }
case NAMED_SUPER_PROPERTY: { case NAMED_SUPER_PROPERTY: {
...@@ -2110,8 +2098,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2110,8 +2098,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
__ mov(StoreDescriptor::NameRegister(), result_register()); __ mov(StoreDescriptor::NameRegister(), result_register());
PopOperands(StoreDescriptor::ValueRegister(), PopOperands(StoreDescriptor::ValueRegister(),
StoreDescriptor::ReceiverRegister()); StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(slot); CallKeyedStoreIC(slot);
CallKeyedStoreIC();
break; break;
} }
} }
...@@ -2137,10 +2124,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, ...@@ -2137,10 +2124,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
if (var->IsUnallocated()) { if (var->IsUnallocated()) {
// Global var, const, or let. // Global var, const, or let.
__ mov(StoreDescriptor::ValueRegister(), result_register()); __ mov(StoreDescriptor::ValueRegister(), result_register());
__ li(StoreDescriptor::NameRegister(), Operand(var->name()));
__ LoadGlobalObject(StoreDescriptor::ReceiverRegister()); __ LoadGlobalObject(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(slot); CallStoreIC(slot, var->name());
CallStoreIC();
} else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) { } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) {
DCHECK(!var->IsLookupSlot()); DCHECK(!var->IsLookupSlot());
...@@ -2209,11 +2194,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { ...@@ -2209,11 +2194,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
DCHECK(prop->key()->IsLiteral()); DCHECK(prop->key()->IsLiteral());
__ mov(StoreDescriptor::ValueRegister(), result_register()); __ mov(StoreDescriptor::ValueRegister(), result_register());
__ li(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value()));
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(v0); context()->Plug(v0);
...@@ -2261,8 +2243,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { ...@@ -2261,8 +2243,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
StoreDescriptor::NameRegister()); StoreDescriptor::NameRegister());
DCHECK(StoreDescriptor::ValueRegister().is(a0)); DCHECK(StoreDescriptor::ValueRegister().is(a0));
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallKeyedStoreIC(expr->AssignmentSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(v0); context()->Plug(v0);
...@@ -3310,11 +3291,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3310,11 +3291,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
break; break;
case NAMED_PROPERTY: { case NAMED_PROPERTY: {
__ mov(StoreDescriptor::ValueRegister(), result_register()); __ mov(StoreDescriptor::ValueRegister(), result_register());
__ li(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value()));
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallStoreIC(expr->CountSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
...@@ -3353,8 +3331,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3353,8 +3331,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
__ mov(StoreDescriptor::ValueRegister(), result_register()); __ mov(StoreDescriptor::ValueRegister(), result_register());
PopOperands(StoreDescriptor::ReceiverRegister(), PopOperands(StoreDescriptor::ReceiverRegister(),
StoreDescriptor::NameRegister()); StoreDescriptor::NameRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallKeyedStoreIC(expr->CountSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
......
...@@ -1164,12 +1164,9 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, ...@@ -1164,12 +1164,9 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); __ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
__ li(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol()));
__ ld(StoreDescriptor::ValueRegister(), __ ld(StoreDescriptor::ValueRegister(),
MemOperand(sp, offset * kPointerSize)); MemOperand(sp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1178,12 +1175,9 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, ...@@ -1178,12 +1175,9 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ Move(StoreDescriptor::ReceiverRegister(), v0); __ Move(StoreDescriptor::ReceiverRegister(), v0);
__ li(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol()));
__ ld(StoreDescriptor::ValueRegister(), __ ld(StoreDescriptor::ValueRegister(),
MemOperand(sp, offset * kPointerSize)); MemOperand(sp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1420,10 +1414,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1420,10 +1414,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
VisitForAccumulatorValue(value); VisitForAccumulatorValue(value);
__ mov(StoreDescriptor::ValueRegister(), result_register()); __ mov(StoreDescriptor::ValueRegister(), result_register());
DCHECK(StoreDescriptor::ValueRegister().is(a0)); DCHECK(StoreDescriptor::ValueRegister().is(a0));
__ li(StoreDescriptor::NameRegister(), Operand(key->value()));
__ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); __ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
EmitLoadStoreICSlot(property->GetSlot(0)); CallStoreIC(property->GetSlot(0), key->value());
CallStoreIC();
PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS); PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS);
if (NeedsHomeObject(value)) { if (NeedsHomeObject(value)) {
...@@ -1621,8 +1613,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { ...@@ -1621,8 +1613,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
__ li(StoreDescriptor::NameRegister(), Operand(Smi::FromInt(array_index))); __ li(StoreDescriptor::NameRegister(), Operand(Smi::FromInt(array_index)));
__ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0)); __ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0));
__ mov(StoreDescriptor::ValueRegister(), result_register()); __ mov(StoreDescriptor::ValueRegister(), result_register());
EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); CallKeyedStoreIC(expr->LiteralFeedbackSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->GetIdForElement(array_index), PrepareForBailoutForId(expr->GetIdForElement(array_index),
BailoutState::NO_REGISTERS); BailoutState::NO_REGISTERS);
...@@ -2060,10 +2051,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2060,10 +2051,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
VisitForAccumulatorValue(prop->obj()); VisitForAccumulatorValue(prop->obj());
__ mov(StoreDescriptor::ReceiverRegister(), result_register()); __ mov(StoreDescriptor::ReceiverRegister(), result_register());
PopOperand(StoreDescriptor::ValueRegister()); // Restore value. PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
__ li(StoreDescriptor::NameRegister(), CallStoreIC(slot, prop->key()->AsLiteral()->value());
Operand(prop->key()->AsLiteral()->value()));
EmitLoadStoreICSlot(slot);
CallStoreIC();
break; break;
} }
case NAMED_SUPER_PROPERTY: { case NAMED_SUPER_PROPERTY: {
...@@ -2110,8 +2098,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2110,8 +2098,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
__ Move(StoreDescriptor::NameRegister(), result_register()); __ Move(StoreDescriptor::NameRegister(), result_register());
PopOperands(StoreDescriptor::ValueRegister(), PopOperands(StoreDescriptor::ValueRegister(),
StoreDescriptor::ReceiverRegister()); StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(slot); CallKeyedStoreIC(slot);
CallKeyedStoreIC();
break; break;
} }
} }
...@@ -2137,10 +2124,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, ...@@ -2137,10 +2124,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
if (var->IsUnallocated()) { if (var->IsUnallocated()) {
// Global var, const, or let. // Global var, const, or let.
__ mov(StoreDescriptor::ValueRegister(), result_register()); __ mov(StoreDescriptor::ValueRegister(), result_register());
__ li(StoreDescriptor::NameRegister(), Operand(var->name()));
__ LoadGlobalObject(StoreDescriptor::ReceiverRegister()); __ LoadGlobalObject(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(slot); CallStoreIC(slot, var->name());
CallStoreIC();
} else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) { } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) {
DCHECK(!var->IsLookupSlot()); DCHECK(!var->IsLookupSlot());
...@@ -2208,11 +2193,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { ...@@ -2208,11 +2193,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
DCHECK(prop->key()->IsLiteral()); DCHECK(prop->key()->IsLiteral());
__ mov(StoreDescriptor::ValueRegister(), result_register()); __ mov(StoreDescriptor::ValueRegister(), result_register());
__ li(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value()));
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(v0); context()->Plug(v0);
...@@ -2260,8 +2242,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { ...@@ -2260,8 +2242,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
StoreDescriptor::NameRegister()); StoreDescriptor::NameRegister());
DCHECK(StoreDescriptor::ValueRegister().is(a0)); DCHECK(StoreDescriptor::ValueRegister().is(a0));
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallKeyedStoreIC(expr->AssignmentSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(v0); context()->Plug(v0);
...@@ -3310,11 +3291,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3310,11 +3291,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
break; break;
case NAMED_PROPERTY: { case NAMED_PROPERTY: {
__ mov(StoreDescriptor::ValueRegister(), result_register()); __ mov(StoreDescriptor::ValueRegister(), result_register());
__ li(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value()));
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallStoreIC(expr->CountSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
...@@ -3353,8 +3331,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3353,8 +3331,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
__ mov(StoreDescriptor::ValueRegister(), result_register()); __ mov(StoreDescriptor::ValueRegister(), result_register());
PopOperands(StoreDescriptor::ReceiverRegister(), PopOperands(StoreDescriptor::ReceiverRegister(),
StoreDescriptor::NameRegister()); StoreDescriptor::NameRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallKeyedStoreIC(expr->CountSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
......
...@@ -1133,12 +1133,9 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, ...@@ -1133,12 +1133,9 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
__ mov(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol()));
__ LoadP(StoreDescriptor::ValueRegister(), __ LoadP(StoreDescriptor::ValueRegister(),
MemOperand(sp, offset * kPointerSize)); MemOperand(sp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1147,12 +1144,9 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, ...@@ -1147,12 +1144,9 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ Move(StoreDescriptor::ReceiverRegister(), r3); __ Move(StoreDescriptor::ReceiverRegister(), r3);
__ mov(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol()));
__ LoadP(StoreDescriptor::ValueRegister(), __ LoadP(StoreDescriptor::ValueRegister(),
MemOperand(sp, offset * kPointerSize)); MemOperand(sp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1387,10 +1381,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1387,10 +1381,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
if (property->emit_store()) { if (property->emit_store()) {
VisitForAccumulatorValue(value); VisitForAccumulatorValue(value);
DCHECK(StoreDescriptor::ValueRegister().is(r3)); DCHECK(StoreDescriptor::ValueRegister().is(r3));
__ mov(StoreDescriptor::NameRegister(), Operand(key->value()));
__ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
EmitLoadStoreICSlot(property->GetSlot(0)); CallStoreIC(property->GetSlot(0), key->value());
CallStoreIC();
PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS); PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS);
if (NeedsHomeObject(value)) { if (NeedsHomeObject(value)) {
...@@ -1586,8 +1578,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { ...@@ -1586,8 +1578,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
__ LoadSmiLiteral(StoreDescriptor::NameRegister(), __ LoadSmiLiteral(StoreDescriptor::NameRegister(),
Smi::FromInt(array_index)); Smi::FromInt(array_index));
__ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0)); __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0));
EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); CallKeyedStoreIC(expr->LiteralFeedbackSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->GetIdForElement(array_index), PrepareForBailoutForId(expr->GetIdForElement(array_index),
BailoutState::NO_REGISTERS); BailoutState::NO_REGISTERS);
...@@ -2063,10 +2054,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2063,10 +2054,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
VisitForAccumulatorValue(prop->obj()); VisitForAccumulatorValue(prop->obj());
__ Move(StoreDescriptor::ReceiverRegister(), r3); __ Move(StoreDescriptor::ReceiverRegister(), r3);
PopOperand(StoreDescriptor::ValueRegister()); // Restore value. PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
__ mov(StoreDescriptor::NameRegister(), CallStoreIC(slot, prop->key()->AsLiteral()->value());
Operand(prop->key()->AsLiteral()->value()));
EmitLoadStoreICSlot(slot);
CallStoreIC();
break; break;
} }
case NAMED_SUPER_PROPERTY: { case NAMED_SUPER_PROPERTY: {
...@@ -2113,8 +2101,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2113,8 +2101,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
__ Move(StoreDescriptor::NameRegister(), r3); __ Move(StoreDescriptor::NameRegister(), r3);
PopOperands(StoreDescriptor::ValueRegister(), PopOperands(StoreDescriptor::ValueRegister(),
StoreDescriptor::ReceiverRegister()); StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(slot); CallKeyedStoreIC(slot);
CallKeyedStoreIC();
break; break;
} }
} }
...@@ -2139,10 +2126,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, ...@@ -2139,10 +2126,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
if (var->IsUnallocated()) { if (var->IsUnallocated()) {
// Global var, const, or let. // Global var, const, or let.
__ mov(StoreDescriptor::NameRegister(), Operand(var->name()));
__ LoadGlobalObject(StoreDescriptor::ReceiverRegister()); __ LoadGlobalObject(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(slot); CallStoreIC(slot, var->name());
CallStoreIC();
} else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) { } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) {
DCHECK(!var->IsLookupSlot()); DCHECK(!var->IsLookupSlot());
...@@ -2210,11 +2195,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { ...@@ -2210,11 +2195,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
DCHECK(prop != NULL); DCHECK(prop != NULL);
DCHECK(prop->key()->IsLiteral()); DCHECK(prop->key()->IsLiteral());
__ mov(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value()));
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(r3); context()->Plug(r3);
...@@ -2256,8 +2238,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { ...@@ -2256,8 +2238,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
StoreDescriptor::NameRegister()); StoreDescriptor::NameRegister());
DCHECK(StoreDescriptor::ValueRegister().is(r3)); DCHECK(StoreDescriptor::ValueRegister().is(r3));
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallKeyedStoreIC(expr->AssignmentSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(r3); context()->Plug(r3);
...@@ -3301,11 +3282,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3301,11 +3282,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
} }
break; break;
case NAMED_PROPERTY: { case NAMED_PROPERTY: {
__ mov(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value()));
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallStoreIC(expr->CountSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
...@@ -3343,8 +3321,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3343,8 +3321,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
case KEYED_PROPERTY: { case KEYED_PROPERTY: {
PopOperands(StoreDescriptor::ReceiverRegister(), PopOperands(StoreDescriptor::ReceiverRegister(),
StoreDescriptor::NameRegister()); StoreDescriptor::NameRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallKeyedStoreIC(expr->CountSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
......
...@@ -1101,12 +1101,9 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, ...@@ -1101,12 +1101,9 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
__ mov(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol()));
__ LoadP(StoreDescriptor::ValueRegister(), __ LoadP(StoreDescriptor::ValueRegister(),
MemOperand(sp, offset * kPointerSize)); MemOperand(sp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer,
...@@ -1114,12 +1111,9 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, ...@@ -1114,12 +1111,9 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ Move(StoreDescriptor::ReceiverRegister(), r2); __ Move(StoreDescriptor::ReceiverRegister(), r2);
__ mov(StoreDescriptor::NameRegister(),
Operand(isolate()->factory()->home_object_symbol()));
__ LoadP(StoreDescriptor::ValueRegister(), __ LoadP(StoreDescriptor::ValueRegister(),
MemOperand(sp, offset * kPointerSize)); MemOperand(sp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy,
...@@ -1347,10 +1341,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1347,10 +1341,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
if (property->emit_store()) { if (property->emit_store()) {
VisitForAccumulatorValue(value); VisitForAccumulatorValue(value);
DCHECK(StoreDescriptor::ValueRegister().is(r2)); DCHECK(StoreDescriptor::ValueRegister().is(r2));
__ mov(StoreDescriptor::NameRegister(), Operand(key->value()));
__ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp));
EmitLoadStoreICSlot(property->GetSlot(0)); CallStoreIC(property->GetSlot(0), key->value());
CallStoreIC();
PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS); PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS);
if (NeedsHomeObject(value)) { if (NeedsHomeObject(value)) {
...@@ -1545,8 +1537,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { ...@@ -1545,8 +1537,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
__ LoadSmiLiteral(StoreDescriptor::NameRegister(), __ LoadSmiLiteral(StoreDescriptor::NameRegister(),
Smi::FromInt(array_index)); Smi::FromInt(array_index));
__ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0)); __ LoadP(StoreDescriptor::ReceiverRegister(), MemOperand(sp, 0));
EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); CallKeyedStoreIC(expr->LiteralFeedbackSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->GetIdForElement(array_index), PrepareForBailoutForId(expr->GetIdForElement(array_index),
BailoutState::NO_REGISTERS); BailoutState::NO_REGISTERS);
...@@ -2018,10 +2009,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2018,10 +2009,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
VisitForAccumulatorValue(prop->obj()); VisitForAccumulatorValue(prop->obj());
__ Move(StoreDescriptor::ReceiverRegister(), r2); __ Move(StoreDescriptor::ReceiverRegister(), r2);
PopOperand(StoreDescriptor::ValueRegister()); // Restore value. PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
__ mov(StoreDescriptor::NameRegister(), CallStoreIC(slot, prop->key()->AsLiteral()->value());
Operand(prop->key()->AsLiteral()->value()));
EmitLoadStoreICSlot(slot);
CallStoreIC();
break; break;
} }
case NAMED_SUPER_PROPERTY: { case NAMED_SUPER_PROPERTY: {
...@@ -2068,8 +2056,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2068,8 +2056,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
__ Move(StoreDescriptor::NameRegister(), r2); __ Move(StoreDescriptor::NameRegister(), r2);
PopOperands(StoreDescriptor::ValueRegister(), PopOperands(StoreDescriptor::ValueRegister(),
StoreDescriptor::ReceiverRegister()); StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(slot); CallKeyedStoreIC(slot);
CallKeyedStoreIC();
break; break;
} }
} }
...@@ -2092,10 +2079,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, ...@@ -2092,10 +2079,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
if (var->IsUnallocated()) { if (var->IsUnallocated()) {
// Global var, const, or let. // Global var, const, or let.
__ mov(StoreDescriptor::NameRegister(), Operand(var->name()));
__ LoadGlobalObject(StoreDescriptor::ReceiverRegister()); __ LoadGlobalObject(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(slot); CallStoreIC(slot, var->name());
CallStoreIC();
} else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) { } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) {
// Non-initializing assignment to let variable needs a write barrier. // Non-initializing assignment to let variable needs a write barrier.
...@@ -2162,11 +2147,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { ...@@ -2162,11 +2147,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
DCHECK(prop != NULL); DCHECK(prop != NULL);
DCHECK(prop->key()->IsLiteral()); DCHECK(prop->key()->IsLiteral());
__ mov(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value()));
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(r2); context()->Plug(r2);
...@@ -2205,8 +2187,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { ...@@ -2205,8 +2187,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
StoreDescriptor::NameRegister()); StoreDescriptor::NameRegister());
DCHECK(StoreDescriptor::ValueRegister().is(r2)); DCHECK(StoreDescriptor::ValueRegister().is(r2));
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallKeyedStoreIC(expr->AssignmentSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(r2); context()->Plug(r2);
...@@ -3219,11 +3200,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3219,11 +3200,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
} }
break; break;
case NAMED_PROPERTY: { case NAMED_PROPERTY: {
__ mov(StoreDescriptor::NameRegister(),
Operand(prop->key()->AsLiteral()->value()));
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallStoreIC(expr->CountSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
...@@ -3261,8 +3239,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3261,8 +3239,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
case KEYED_PROPERTY: { case KEYED_PROPERTY: {
PopOperands(StoreDescriptor::ReceiverRegister(), PopOperands(StoreDescriptor::ReceiverRegister(),
StoreDescriptor::NameRegister()); StoreDescriptor::NameRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallKeyedStoreIC(expr->CountSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
......
...@@ -1119,12 +1119,9 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, ...@@ -1119,12 +1119,9 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0)); __ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0));
__ Move(StoreDescriptor::NameRegister(),
isolate()->factory()->home_object_symbol());
__ movp(StoreDescriptor::ValueRegister(), __ movp(StoreDescriptor::ValueRegister(),
Operand(rsp, offset * kPointerSize)); Operand(rsp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1133,12 +1130,9 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, ...@@ -1133,12 +1130,9 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ movp(StoreDescriptor::ReceiverRegister(), rax); __ movp(StoreDescriptor::ReceiverRegister(), rax);
__ Move(StoreDescriptor::NameRegister(),
isolate()->factory()->home_object_symbol());
__ movp(StoreDescriptor::ValueRegister(), __ movp(StoreDescriptor::ValueRegister(),
Operand(rsp, offset * kPointerSize)); Operand(rsp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1373,10 +1367,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1373,10 +1367,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
if (property->emit_store()) { if (property->emit_store()) {
VisitForAccumulatorValue(value); VisitForAccumulatorValue(value);
DCHECK(StoreDescriptor::ValueRegister().is(rax)); DCHECK(StoreDescriptor::ValueRegister().is(rax));
__ Move(StoreDescriptor::NameRegister(), key->value());
__ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0)); __ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0));
EmitLoadStoreICSlot(property->GetSlot(0)); CallStoreIC(property->GetSlot(0), key->value());
CallStoreIC();
PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS); PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS);
if (NeedsHomeObject(value)) { if (NeedsHomeObject(value)) {
...@@ -1565,8 +1557,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { ...@@ -1565,8 +1557,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
__ Move(StoreDescriptor::NameRegister(), Smi::FromInt(array_index)); __ Move(StoreDescriptor::NameRegister(), Smi::FromInt(array_index));
__ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0)); __ movp(StoreDescriptor::ReceiverRegister(), Operand(rsp, 0));
EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); CallKeyedStoreIC(expr->LiteralFeedbackSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->GetIdForElement(array_index), PrepareForBailoutForId(expr->GetIdForElement(array_index),
BailoutState::NO_REGISTERS); BailoutState::NO_REGISTERS);
...@@ -1954,10 +1945,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -1954,10 +1945,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
VisitForAccumulatorValue(prop->obj()); VisitForAccumulatorValue(prop->obj());
__ Move(StoreDescriptor::ReceiverRegister(), rax); __ Move(StoreDescriptor::ReceiverRegister(), rax);
PopOperand(StoreDescriptor::ValueRegister()); // Restore value. PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
__ Move(StoreDescriptor::NameRegister(), CallStoreIC(slot, prop->key()->AsLiteral()->value());
prop->key()->AsLiteral()->value());
EmitLoadStoreICSlot(slot);
CallStoreIC();
break; break;
} }
case NAMED_SUPER_PROPERTY: { case NAMED_SUPER_PROPERTY: {
...@@ -2004,8 +1992,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2004,8 +1992,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
__ Move(StoreDescriptor::NameRegister(), rax); __ Move(StoreDescriptor::NameRegister(), rax);
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
PopOperand(StoreDescriptor::ValueRegister()); // Restore value. PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
EmitLoadStoreICSlot(slot); CallKeyedStoreIC(slot);
CallKeyedStoreIC();
break; break;
} }
} }
...@@ -2028,10 +2015,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, ...@@ -2028,10 +2015,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
if (var->IsUnallocated()) { if (var->IsUnallocated()) {
// Global var, const, or let. // Global var, const, or let.
__ Move(StoreDescriptor::NameRegister(), var->name());
__ LoadGlobalObject(StoreDescriptor::ReceiverRegister()); __ LoadGlobalObject(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(slot); CallStoreIC(slot, var->name());
CallStoreIC();
} else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) { } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) {
DCHECK(!var->IsLookupSlot()); DCHECK(!var->IsLookupSlot());
...@@ -2098,10 +2083,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { ...@@ -2098,10 +2083,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
DCHECK(prop != NULL); DCHECK(prop != NULL);
DCHECK(prop->key()->IsLiteral()); DCHECK(prop->key()->IsLiteral());
__ Move(StoreDescriptor::NameRegister(), prop->key()->AsLiteral()->value());
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(rax); context()->Plug(rax);
...@@ -2142,8 +2125,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { ...@@ -2142,8 +2125,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
PopOperand(StoreDescriptor::NameRegister()); // Key. PopOperand(StoreDescriptor::NameRegister()); // Key.
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
DCHECK(StoreDescriptor::ValueRegister().is(rax)); DCHECK(StoreDescriptor::ValueRegister().is(rax));
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallKeyedStoreIC(expr->AssignmentSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(rax); context()->Plug(rax);
...@@ -3191,11 +3173,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3191,11 +3173,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
} }
break; break;
case NAMED_PROPERTY: { case NAMED_PROPERTY: {
__ Move(StoreDescriptor::NameRegister(),
prop->key()->AsLiteral()->value());
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallStoreIC(expr->CountSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
...@@ -3233,8 +3212,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3233,8 +3212,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
case KEYED_PROPERTY: { case KEYED_PROPERTY: {
PopOperand(StoreDescriptor::NameRegister()); PopOperand(StoreDescriptor::NameRegister());
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallKeyedStoreIC(expr->CountSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
......
...@@ -1084,11 +1084,8 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, ...@@ -1084,11 +1084,8 @@ void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0));
__ mov(StoreDescriptor::NameRegister(),
Immediate(isolate()->factory()->home_object_symbol()));
__ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize)); __ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1097,11 +1094,8 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer, ...@@ -1097,11 +1094,8 @@ void FullCodeGenerator::EmitSetHomeObjectAccumulator(Expression* initializer,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
DCHECK(NeedsHomeObject(initializer)); DCHECK(NeedsHomeObject(initializer));
__ mov(StoreDescriptor::ReceiverRegister(), eax); __ mov(StoreDescriptor::ReceiverRegister(), eax);
__ mov(StoreDescriptor::NameRegister(),
Immediate(isolate()->factory()->home_object_symbol()));
__ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize)); __ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, isolate()->factory()->home_object_symbol());
CallStoreIC();
} }
...@@ -1336,10 +1330,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1336,10 +1330,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
if (property->emit_store()) { if (property->emit_store()) {
VisitForAccumulatorValue(value); VisitForAccumulatorValue(value);
DCHECK(StoreDescriptor::ValueRegister().is(eax)); DCHECK(StoreDescriptor::ValueRegister().is(eax));
__ mov(StoreDescriptor::NameRegister(), Immediate(key->value()));
__ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0));
EmitLoadStoreICSlot(property->GetSlot(0)); CallStoreIC(property->GetSlot(0), key->value());
CallStoreIC();
PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS); PrepareForBailoutForId(key->id(), BailoutState::NO_REGISTERS);
if (NeedsHomeObject(value)) { if (NeedsHomeObject(value)) {
EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1)); EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1));
...@@ -1530,8 +1522,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { ...@@ -1530,8 +1522,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
__ mov(StoreDescriptor::NameRegister(), __ mov(StoreDescriptor::NameRegister(),
Immediate(Smi::FromInt(array_index))); Immediate(Smi::FromInt(array_index)));
__ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0));
EmitLoadStoreICSlot(expr->LiteralFeedbackSlot()); CallKeyedStoreIC(expr->LiteralFeedbackSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->GetIdForElement(array_index), PrepareForBailoutForId(expr->GetIdForElement(array_index),
BailoutState::NO_REGISTERS); BailoutState::NO_REGISTERS);
} }
...@@ -1954,10 +1945,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -1954,10 +1945,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
VisitForAccumulatorValue(prop->obj()); VisitForAccumulatorValue(prop->obj());
__ Move(StoreDescriptor::ReceiverRegister(), eax); __ Move(StoreDescriptor::ReceiverRegister(), eax);
PopOperand(StoreDescriptor::ValueRegister()); // Restore value. PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
__ mov(StoreDescriptor::NameRegister(), CallStoreIC(slot, prop->key()->AsLiteral()->value());
prop->key()->AsLiteral()->value());
EmitLoadStoreICSlot(slot);
CallStoreIC();
break; break;
} }
case NAMED_SUPER_PROPERTY: { case NAMED_SUPER_PROPERTY: {
...@@ -2004,8 +1992,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, ...@@ -2004,8 +1992,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr,
__ Move(StoreDescriptor::NameRegister(), eax); __ Move(StoreDescriptor::NameRegister(), eax);
PopOperand(StoreDescriptor::ReceiverRegister()); // Receiver. PopOperand(StoreDescriptor::ReceiverRegister()); // Receiver.
PopOperand(StoreDescriptor::ValueRegister()); // Restore value. PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
EmitLoadStoreICSlot(slot); CallKeyedStoreIC(slot);
CallKeyedStoreIC();
break; break;
} }
} }
...@@ -2028,13 +2015,11 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, ...@@ -2028,13 +2015,11 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op,
FeedbackVectorSlot slot) { FeedbackVectorSlot slot) {
if (var->IsUnallocated()) { if (var->IsUnallocated()) {
// Global var, const, or let. // Global var, const, or let.
__ mov(StoreDescriptor::NameRegister(), var->name());
__ mov(StoreDescriptor::ReceiverRegister(), NativeContextOperand()); __ mov(StoreDescriptor::ReceiverRegister(), NativeContextOperand());
__ mov(StoreDescriptor::ReceiverRegister(), __ mov(StoreDescriptor::ReceiverRegister(),
ContextOperand(StoreDescriptor::ReceiverRegister(), ContextOperand(StoreDescriptor::ReceiverRegister(),
Context::EXTENSION_INDEX)); Context::EXTENSION_INDEX));
EmitLoadStoreICSlot(slot); CallStoreIC(slot, var->name());
CallStoreIC();
} else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) { } else if (IsLexicalVariableMode(var->mode()) && op != Token::INIT) {
DCHECK(!var->IsLookupSlot()); DCHECK(!var->IsLookupSlot());
...@@ -2102,10 +2087,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { ...@@ -2102,10 +2087,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
DCHECK(prop != NULL); DCHECK(prop != NULL);
DCHECK(prop->key()->IsLiteral()); DCHECK(prop->key()->IsLiteral());
__ mov(StoreDescriptor::NameRegister(), prop->key()->AsLiteral()->value());
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(eax); context()->Plug(eax);
} }
...@@ -2148,8 +2131,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { ...@@ -2148,8 +2131,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
PopOperand(StoreDescriptor::NameRegister()); // Key. PopOperand(StoreDescriptor::NameRegister()); // Key.
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
DCHECK(StoreDescriptor::ValueRegister().is(eax)); DCHECK(StoreDescriptor::ValueRegister().is(eax));
EmitLoadStoreICSlot(expr->AssignmentSlot()); CallKeyedStoreIC(expr->AssignmentSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
context()->Plug(eax); context()->Plug(eax);
} }
...@@ -3194,11 +3176,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3194,11 +3176,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
} }
break; break;
case NAMED_PROPERTY: { case NAMED_PROPERTY: {
__ mov(StoreDescriptor::NameRegister(),
prop->key()->AsLiteral()->value());
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallStoreIC(expr->CountSlot(), prop->key()->AsLiteral()->value());
CallStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
if (!context()->IsEffect()) { if (!context()->IsEffect()) {
...@@ -3236,8 +3215,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -3236,8 +3215,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
case KEYED_PROPERTY: { case KEYED_PROPERTY: {
PopOperand(StoreDescriptor::NameRegister()); PopOperand(StoreDescriptor::NameRegister());
PopOperand(StoreDescriptor::ReceiverRegister()); PopOperand(StoreDescriptor::ReceiverRegister());
EmitLoadStoreICSlot(expr->CountSlot()); CallKeyedStoreIC(expr->CountSlot());
CallKeyedStoreIC();
PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
if (expr->is_postfix()) { if (expr->is_postfix()) {
// Result is on the stack // Result is on the stack
......
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