| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/v8.h" | 5 #include "src/v8.h" | 
| 6 | 6 | 
| 7 #if V8_TARGET_ARCH_X64 | 7 #if V8_TARGET_ARCH_X64 | 
| 8 | 8 | 
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" | 
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" | 
| (...skipping 1829 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1840     context()->Plug(rax); | 1840     context()->Plug(rax); | 
| 1841   } | 1841   } | 
| 1842 } | 1842 } | 
| 1843 | 1843 | 
| 1844 | 1844 | 
| 1845 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 1845 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 
| 1846   DCHECK(expr->target()->IsValidReferenceExpression()); | 1846   DCHECK(expr->target()->IsValidReferenceExpression()); | 
| 1847 | 1847 | 
| 1848   Comment cmnt(masm_, "[ Assignment"); | 1848   Comment cmnt(masm_, "[ Assignment"); | 
| 1849 | 1849 | 
| 1850   // Left-hand side can only be a property, a global or a (parameter or local) |  | 
| 1851   // slot. |  | 
| 1852   enum LhsKind { |  | 
| 1853     VARIABLE, |  | 
| 1854     NAMED_PROPERTY, |  | 
| 1855     KEYED_PROPERTY, |  | 
| 1856     NAMED_SUPER_PROPERTY |  | 
| 1857   }; |  | 
| 1858   LhsKind assign_type = VARIABLE; |  | 
| 1859   Property* property = expr->target()->AsProperty(); | 1850   Property* property = expr->target()->AsProperty(); | 
| 1860   if (property != NULL) { | 1851   LhsKind assign_type = GetAssignType(property); | 
| 1861     assign_type = (property->key()->IsPropertyName()) |  | 
| 1862                       ? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY |  | 
| 1863                                                    : NAMED_PROPERTY) |  | 
| 1864                       : KEYED_PROPERTY; |  | 
| 1865   } |  | 
| 1866 | 1852 | 
| 1867   // Evaluate LHS expression. | 1853   // Evaluate LHS expression. | 
| 1868   switch (assign_type) { | 1854   switch (assign_type) { | 
| 1869     case VARIABLE: | 1855     case VARIABLE: | 
| 1870       // Nothing to do here. | 1856       // Nothing to do here. | 
| 1871       break; | 1857       break; | 
| 1872     case NAMED_PROPERTY: | 1858     case NAMED_PROPERTY: | 
| 1873       if (expr->is_compound()) { | 1859       if (expr->is_compound()) { | 
| 1874         // We need the receiver both on the stack and in the register. | 1860         // We need the receiver both on the stack and in the register. | 
| 1875         VisitForStackValue(property->obj()); | 1861         VisitForStackValue(property->obj()); | 
| 1876         __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); | 1862         __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); | 
| 1877       } else { | 1863       } else { | 
| 1878         VisitForStackValue(property->obj()); | 1864         VisitForStackValue(property->obj()); | 
| 1879       } | 1865       } | 
| 1880       break; | 1866       break; | 
| 1881     case NAMED_SUPER_PROPERTY: | 1867     case NAMED_SUPER_PROPERTY: | 
| 1882       VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1868       VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 
| 1883       EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1869       EmitLoadHomeObject(property->obj()->AsSuperReference()); | 
| 1884       __ Push(result_register()); | 1870       __ Push(result_register()); | 
| 1885       if (expr->is_compound()) { | 1871       if (expr->is_compound()) { | 
| 1886         __ Push(MemOperand(rsp, kPointerSize)); | 1872         __ Push(MemOperand(rsp, kPointerSize)); | 
| 1887         __ Push(result_register()); | 1873         __ Push(result_register()); | 
| 1888       } | 1874       } | 
| 1889       break; | 1875       break; | 
|  | 1876     case KEYED_SUPER_PROPERTY: | 
|  | 1877       VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 
|  | 1878       EmitLoadHomeObject(property->obj()->AsSuperReference()); | 
|  | 1879       __ Push(result_register()); | 
|  | 1880       VisitForAccumulatorValue(property->key()); | 
|  | 1881       __ Push(result_register()); | 
|  | 1882       if (expr->is_compound()) { | 
|  | 1883         __ Push(MemOperand(rsp, 2 * kPointerSize)); | 
|  | 1884         __ Push(MemOperand(rsp, 2 * kPointerSize)); | 
|  | 1885         __ Push(result_register()); | 
|  | 1886       } | 
|  | 1887       break; | 
| 1890     case KEYED_PROPERTY: { | 1888     case KEYED_PROPERTY: { | 
| 1891       if (expr->is_compound()) { | 1889       if (expr->is_compound()) { | 
| 1892         VisitForStackValue(property->obj()); | 1890         VisitForStackValue(property->obj()); | 
| 1893         VisitForStackValue(property->key()); | 1891         VisitForStackValue(property->key()); | 
| 1894         __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, kPointerSize)); | 1892         __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, kPointerSize)); | 
| 1895         __ movp(LoadDescriptor::NameRegister(), Operand(rsp, 0)); | 1893         __ movp(LoadDescriptor::NameRegister(), Operand(rsp, 0)); | 
| 1896       } else { | 1894       } else { | 
| 1897         VisitForStackValue(property->obj()); | 1895         VisitForStackValue(property->obj()); | 
| 1898         VisitForStackValue(property->key()); | 1896         VisitForStackValue(property->key()); | 
| 1899       } | 1897       } | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 1911           PrepareForBailout(expr->target(), TOS_REG); | 1909           PrepareForBailout(expr->target(), TOS_REG); | 
| 1912           break; | 1910           break; | 
| 1913         case NAMED_PROPERTY: | 1911         case NAMED_PROPERTY: | 
| 1914           EmitNamedPropertyLoad(property); | 1912           EmitNamedPropertyLoad(property); | 
| 1915           PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1913           PrepareForBailoutForId(property->LoadId(), TOS_REG); | 
| 1916           break; | 1914           break; | 
| 1917         case NAMED_SUPER_PROPERTY: | 1915         case NAMED_SUPER_PROPERTY: | 
| 1918           EmitNamedSuperPropertyLoad(property); | 1916           EmitNamedSuperPropertyLoad(property); | 
| 1919           PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1917           PrepareForBailoutForId(property->LoadId(), TOS_REG); | 
| 1920           break; | 1918           break; | 
|  | 1919         case KEYED_SUPER_PROPERTY: | 
|  | 1920           EmitKeyedSuperPropertyLoad(property); | 
|  | 1921           PrepareForBailoutForId(property->LoadId(), TOS_REG); | 
|  | 1922           break; | 
| 1921         case KEYED_PROPERTY: | 1923         case KEYED_PROPERTY: | 
| 1922           EmitKeyedPropertyLoad(property); | 1924           EmitKeyedPropertyLoad(property); | 
| 1923           PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1925           PrepareForBailoutForId(property->LoadId(), TOS_REG); | 
| 1924           break; | 1926           break; | 
| 1925       } | 1927       } | 
| 1926     } | 1928     } | 
| 1927 | 1929 | 
| 1928     Token::Value op = expr->binary_op(); | 1930     Token::Value op = expr->binary_op(); | 
| 1929     __ Push(rax);  // Left operand goes on the stack. | 1931     __ Push(rax);  // Left operand goes on the stack. | 
| 1930     VisitForAccumulatorValue(expr->value()); | 1932     VisitForAccumulatorValue(expr->value()); | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 1960       PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 1962       PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 
| 1961       context()->Plug(rax); | 1963       context()->Plug(rax); | 
| 1962       break; | 1964       break; | 
| 1963     case NAMED_PROPERTY: | 1965     case NAMED_PROPERTY: | 
| 1964       EmitNamedPropertyAssignment(expr); | 1966       EmitNamedPropertyAssignment(expr); | 
| 1965       break; | 1967       break; | 
| 1966     case NAMED_SUPER_PROPERTY: | 1968     case NAMED_SUPER_PROPERTY: | 
| 1967       EmitNamedSuperPropertyStore(property); | 1969       EmitNamedSuperPropertyStore(property); | 
| 1968       context()->Plug(rax); | 1970       context()->Plug(rax); | 
| 1969       break; | 1971       break; | 
|  | 1972     case KEYED_SUPER_PROPERTY: | 
|  | 1973       EmitKeyedSuperPropertyStore(property); | 
|  | 1974       context()->Plug(rax); | 
|  | 1975       break; | 
| 1970     case KEYED_PROPERTY: | 1976     case KEYED_PROPERTY: | 
| 1971       EmitKeyedPropertyAssignment(expr); | 1977       EmitKeyedPropertyAssignment(expr); | 
| 1972       break; | 1978       break; | 
| 1973   } | 1979   } | 
| 1974 } | 1980 } | 
| 1975 | 1981 | 
| 1976 | 1982 | 
| 1977 void FullCodeGenerator::VisitYield(Yield* expr) { | 1983 void FullCodeGenerator::VisitYield(Yield* expr) { | 
| 1978   Comment cmnt(masm_, "[ Yield"); | 1984   Comment cmnt(masm_, "[ Yield"); | 
| 1979   // Evaluate yielded value first; the initial iterator definition depends on | 1985   // Evaluate yielded value first; the initial iterator definition depends on | 
| (...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2557 | 2563 | 
| 2558 | 2564 | 
| 2559 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { | 2565 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { | 
| 2560   // Assignment to named property of super. | 2566   // Assignment to named property of super. | 
| 2561   // rax : value | 2567   // rax : value | 
| 2562   // stack : receiver ('this'), home_object | 2568   // stack : receiver ('this'), home_object | 
| 2563   DCHECK(prop != NULL); | 2569   DCHECK(prop != NULL); | 
| 2564   Literal* key = prop->key()->AsLiteral(); | 2570   Literal* key = prop->key()->AsLiteral(); | 
| 2565   DCHECK(key != NULL); | 2571   DCHECK(key != NULL); | 
| 2566 | 2572 | 
|  | 2573   __ Push(key->value()); | 
| 2567   __ Push(rax); | 2574   __ Push(rax); | 
| 2568   __ Push(key->value()); |  | 
| 2569   __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict | 2575   __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict | 
| 2570                                           : Runtime::kStoreToSuper_Sloppy), | 2576                                           : Runtime::kStoreToSuper_Sloppy), | 
| 2571                  4); | 2577                  4); | 
| 2572 } | 2578 } | 
| 2573 | 2579 | 
| 2574 | 2580 | 
|  | 2581 void FullCodeGenerator::EmitKeyedSuperPropertyStore(Property* prop) { | 
|  | 2582   // Assignment to named property of super. | 
|  | 2583   // rax : value | 
|  | 2584   // stack : receiver ('this'), home_object, key | 
|  | 2585   DCHECK(prop != NULL); | 
|  | 2586 | 
|  | 2587   __ Push(rax); | 
|  | 2588   __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreKeyedToSuper_Strict | 
|  | 2589                                           : Runtime::kStoreKeyedToSuper_Sloppy), | 
|  | 2590                  4); | 
|  | 2591 } | 
|  | 2592 | 
|  | 2593 | 
| 2575 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 2594 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 
| 2576   // Assignment to a property, using a keyed store IC. | 2595   // Assignment to a property, using a keyed store IC. | 
| 2577 | 2596 | 
| 2578   __ Pop(StoreDescriptor::NameRegister());  // Key. | 2597   __ Pop(StoreDescriptor::NameRegister());  // Key. | 
| 2579   __ Pop(StoreDescriptor::ReceiverRegister()); | 2598   __ Pop(StoreDescriptor::ReceiverRegister()); | 
| 2580   DCHECK(StoreDescriptor::ValueRegister().is(rax)); | 2599   DCHECK(StoreDescriptor::ValueRegister().is(rax)); | 
| 2581   // Record source code position before IC call. | 2600   // Record source code position before IC call. | 
| 2582   SetSourcePosition(expr->position()); | 2601   SetSourcePosition(expr->position()); | 
| 2583   Handle<Code> ic = CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 2602   Handle<Code> ic = CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 
| 2584   CallIC(ic, expr->AssignmentFeedbackId()); | 2603   CallIC(ic, expr->AssignmentFeedbackId()); | 
| (...skipping 1807 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4392   } | 4411   } | 
| 4393 } | 4412 } | 
| 4394 | 4413 | 
| 4395 | 4414 | 
| 4396 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { | 4415 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { | 
| 4397   DCHECK(expr->expression()->IsValidReferenceExpression()); | 4416   DCHECK(expr->expression()->IsValidReferenceExpression()); | 
| 4398 | 4417 | 
| 4399   Comment cmnt(masm_, "[ CountOperation"); | 4418   Comment cmnt(masm_, "[ CountOperation"); | 
| 4400   SetSourcePosition(expr->position()); | 4419   SetSourcePosition(expr->position()); | 
| 4401 | 4420 | 
| 4402   // Expression can only be a property, a global or a (parameter or local) |  | 
| 4403   // slot. |  | 
| 4404   enum LhsKind { |  | 
| 4405     VARIABLE, |  | 
| 4406     NAMED_PROPERTY, |  | 
| 4407     KEYED_PROPERTY, |  | 
| 4408     NAMED_SUPER_PROPERTY |  | 
| 4409   }; |  | 
| 4410   LhsKind assign_type = VARIABLE; |  | 
| 4411   Property* prop = expr->expression()->AsProperty(); | 4421   Property* prop = expr->expression()->AsProperty(); | 
| 4412   // In case of a property we use the uninitialized expression context | 4422   LhsKind assign_type = GetAssignType(prop); | 
| 4413   // of the key to detect a named property. |  | 
| 4414   if (prop != NULL) { |  | 
| 4415     assign_type = |  | 
| 4416         (prop->key()->IsPropertyName()) |  | 
| 4417             ? (prop->IsSuperAccess() ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) |  | 
| 4418             : KEYED_PROPERTY; |  | 
| 4419   } |  | 
| 4420 | 4423 | 
| 4421   // Evaluate expression and get value. | 4424   // Evaluate expression and get value. | 
| 4422   if (assign_type == VARIABLE) { | 4425   if (assign_type == VARIABLE) { | 
| 4423     DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 4426     DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 
| 4424     AccumulatorValueContext context(this); | 4427     AccumulatorValueContext context(this); | 
| 4425     EmitVariableLoad(expr->expression()->AsVariableProxy()); | 4428     EmitVariableLoad(expr->expression()->AsVariableProxy()); | 
| 4426   } else { | 4429   } else { | 
| 4427     // Reserve space for result of postfix operation. | 4430     // Reserve space for result of postfix operation. | 
| 4428     if (expr->is_postfix() && !context()->IsEffect()) { | 4431     if (expr->is_postfix() && !context()->IsEffect()) { | 
| 4429       __ Push(Smi::FromInt(0)); | 4432       __ Push(Smi::FromInt(0)); | 
| 4430     } | 4433     } | 
| 4431     if (assign_type == NAMED_PROPERTY) { | 4434     switch (assign_type) { | 
| 4432       VisitForStackValue(prop->obj()); | 4435       case NAMED_PROPERTY: { | 
| 4433       __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); | 4436         VisitForStackValue(prop->obj()); | 
| 4434       EmitNamedPropertyLoad(prop); | 4437         __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); | 
| 4435     } else if (assign_type == NAMED_SUPER_PROPERTY) { | 4438         EmitNamedPropertyLoad(prop); | 
| 4436       VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4439         break; | 
| 4437       EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4440       } | 
| 4438       __ Push(result_register()); | 4441 | 
| 4439       __ Push(MemOperand(rsp, kPointerSize)); | 4442       case NAMED_SUPER_PROPERTY: { | 
| 4440       __ Push(result_register()); | 4443         VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 
| 4441       EmitNamedSuperPropertyLoad(prop); | 4444         EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 
| 4442     } else { | 4445         __ Push(result_register()); | 
| 4443       VisitForStackValue(prop->obj()); | 4446         __ Push(MemOperand(rsp, kPointerSize)); | 
| 4444       VisitForStackValue(prop->key()); | 4447         __ Push(result_register()); | 
| 4445       // Leave receiver on stack | 4448         EmitNamedSuperPropertyLoad(prop); | 
| 4446       __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, kPointerSize)); | 4449         break; | 
| 4447       // Copy of key, needed for later store. | 4450       } | 
| 4448       __ movp(LoadDescriptor::NameRegister(), Operand(rsp, 0)); | 4451 | 
| 4449       EmitKeyedPropertyLoad(prop); | 4452       case KEYED_SUPER_PROPERTY: { | 
|  | 4453         VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 
|  | 4454         EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 
|  | 4455         __ Push(result_register()); | 
|  | 4456         VisitForAccumulatorValue(prop->key()); | 
|  | 4457         __ Push(result_register()); | 
|  | 4458         __ Push(MemOperand(rsp, 2 * kPointerSize)); | 
|  | 4459         __ Push(MemOperand(rsp, 2 * kPointerSize)); | 
|  | 4460         __ Push(result_register()); | 
|  | 4461         EmitKeyedSuperPropertyLoad(prop); | 
|  | 4462         break; | 
|  | 4463       } | 
|  | 4464 | 
|  | 4465       case KEYED_PROPERTY: { | 
|  | 4466         VisitForStackValue(prop->obj()); | 
|  | 4467         VisitForStackValue(prop->key()); | 
|  | 4468         // Leave receiver on stack | 
|  | 4469         __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, kPointerSize)); | 
|  | 4470         // Copy of key, needed for later store. | 
|  | 4471         __ movp(LoadDescriptor::NameRegister(), Operand(rsp, 0)); | 
|  | 4472         EmitKeyedPropertyLoad(prop); | 
|  | 4473         break; | 
|  | 4474       } | 
|  | 4475 | 
|  | 4476       case VARIABLE: | 
|  | 4477         UNREACHABLE(); | 
| 4450     } | 4478     } | 
| 4451   } | 4479   } | 
| 4452 | 4480 | 
| 4453   // We need a second deoptimization point after loading the value | 4481   // We need a second deoptimization point after loading the value | 
| 4454   // in case evaluating the property load my have a side effect. | 4482   // in case evaluating the property load my have a side effect. | 
| 4455   if (assign_type == VARIABLE) { | 4483   if (assign_type == VARIABLE) { | 
| 4456     PrepareForBailout(expr->expression(), TOS_REG); | 4484     PrepareForBailout(expr->expression(), TOS_REG); | 
| 4457   } else { | 4485   } else { | 
| 4458     PrepareForBailoutForId(prop->LoadId(), TOS_REG); | 4486     PrepareForBailoutForId(prop->LoadId(), TOS_REG); | 
| 4459   } | 4487   } | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 4477             break; | 4505             break; | 
| 4478           case NAMED_PROPERTY: | 4506           case NAMED_PROPERTY: | 
| 4479             __ movp(Operand(rsp, kPointerSize), rax); | 4507             __ movp(Operand(rsp, kPointerSize), rax); | 
| 4480             break; | 4508             break; | 
| 4481           case NAMED_SUPER_PROPERTY: | 4509           case NAMED_SUPER_PROPERTY: | 
| 4482             __ movp(Operand(rsp, 2 * kPointerSize), rax); | 4510             __ movp(Operand(rsp, 2 * kPointerSize), rax); | 
| 4483             break; | 4511             break; | 
| 4484           case KEYED_PROPERTY: | 4512           case KEYED_PROPERTY: | 
| 4485             __ movp(Operand(rsp, 2 * kPointerSize), rax); | 4513             __ movp(Operand(rsp, 2 * kPointerSize), rax); | 
| 4486             break; | 4514             break; | 
|  | 4515           case KEYED_SUPER_PROPERTY: | 
|  | 4516             __ movp(Operand(rsp, 3 * kPointerSize), rax); | 
|  | 4517             break; | 
| 4487         } | 4518         } | 
| 4488       } | 4519       } | 
| 4489     } | 4520     } | 
| 4490 | 4521 | 
| 4491     SmiOperationExecutionMode mode; | 4522     SmiOperationExecutionMode mode; | 
| 4492     mode.Add(PRESERVE_SOURCE_REGISTER); | 4523     mode.Add(PRESERVE_SOURCE_REGISTER); | 
| 4493     mode.Add(BAILOUT_ON_NO_OVERFLOW); | 4524     mode.Add(BAILOUT_ON_NO_OVERFLOW); | 
| 4494     if (expr->op() == Token::INC) { | 4525     if (expr->op() == Token::INC) { | 
| 4495       __ SmiAddConstant(rax, rax, Smi::FromInt(1), mode, &done, Label::kNear); | 4526       __ SmiAddConstant(rax, rax, Smi::FromInt(1), mode, &done, Label::kNear); | 
| 4496     } else { | 4527     } else { | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 4515           break; | 4546           break; | 
| 4516         case NAMED_PROPERTY: | 4547         case NAMED_PROPERTY: | 
| 4517           __ movp(Operand(rsp, kPointerSize), rax); | 4548           __ movp(Operand(rsp, kPointerSize), rax); | 
| 4518           break; | 4549           break; | 
| 4519         case NAMED_SUPER_PROPERTY: | 4550         case NAMED_SUPER_PROPERTY: | 
| 4520           __ movp(Operand(rsp, 2 * kPointerSize), rax); | 4551           __ movp(Operand(rsp, 2 * kPointerSize), rax); | 
| 4521           break; | 4552           break; | 
| 4522         case KEYED_PROPERTY: | 4553         case KEYED_PROPERTY: | 
| 4523           __ movp(Operand(rsp, 2 * kPointerSize), rax); | 4554           __ movp(Operand(rsp, 2 * kPointerSize), rax); | 
| 4524           break; | 4555           break; | 
|  | 4556         case KEYED_SUPER_PROPERTY: | 
|  | 4557           __ movp(Operand(rsp, 3 * kPointerSize), rax); | 
|  | 4558           break; | 
| 4525       } | 4559       } | 
| 4526     } | 4560     } | 
| 4527   } | 4561   } | 
| 4528 | 4562 | 
| 4529   // Record position before stub call. | 4563   // Record position before stub call. | 
| 4530   SetSourcePosition(expr->position()); | 4564   SetSourcePosition(expr->position()); | 
| 4531 | 4565 | 
| 4532   // Call stub for +1/-1. | 4566   // Call stub for +1/-1. | 
| 4533   __ bind(&stub_call); | 4567   __ bind(&stub_call); | 
| 4534   __ movp(rdx, rax); | 4568   __ movp(rdx, rax); | 
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4582       EmitNamedSuperPropertyStore(prop); | 4616       EmitNamedSuperPropertyStore(prop); | 
| 4583       if (expr->is_postfix()) { | 4617       if (expr->is_postfix()) { | 
| 4584         if (!context()->IsEffect()) { | 4618         if (!context()->IsEffect()) { | 
| 4585           context()->PlugTOS(); | 4619           context()->PlugTOS(); | 
| 4586         } | 4620         } | 
| 4587       } else { | 4621       } else { | 
| 4588         context()->Plug(rax); | 4622         context()->Plug(rax); | 
| 4589       } | 4623       } | 
| 4590       break; | 4624       break; | 
| 4591     } | 4625     } | 
|  | 4626     case KEYED_SUPER_PROPERTY: { | 
|  | 4627       EmitKeyedSuperPropertyStore(prop); | 
|  | 4628       if (expr->is_postfix()) { | 
|  | 4629         if (!context()->IsEffect()) { | 
|  | 4630           context()->PlugTOS(); | 
|  | 4631         } | 
|  | 4632       } else { | 
|  | 4633         context()->Plug(rax); | 
|  | 4634       } | 
|  | 4635       break; | 
|  | 4636     } | 
| 4592     case KEYED_PROPERTY: { | 4637     case KEYED_PROPERTY: { | 
| 4593       __ Pop(StoreDescriptor::NameRegister()); | 4638       __ Pop(StoreDescriptor::NameRegister()); | 
| 4594       __ Pop(StoreDescriptor::ReceiverRegister()); | 4639       __ Pop(StoreDescriptor::ReceiverRegister()); | 
| 4595       Handle<Code> ic = | 4640       Handle<Code> ic = | 
| 4596           CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 4641           CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 
| 4597       CallIC(ic, expr->CountStoreFeedbackId()); | 4642       CallIC(ic, expr->CountStoreFeedbackId()); | 
| 4598       PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4643       PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 
| 4599       if (expr->is_postfix()) { | 4644       if (expr->is_postfix()) { | 
| 4600         if (!context()->IsEffect()) { | 4645         if (!context()->IsEffect()) { | 
| 4601           context()->PlugTOS(); | 4646           context()->PlugTOS(); | 
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5045   DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 5090   DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 
| 5046             Assembler::target_address_at(call_target_address, | 5091             Assembler::target_address_at(call_target_address, | 
| 5047                                          unoptimized_code)); | 5092                                          unoptimized_code)); | 
| 5048   return OSR_AFTER_STACK_CHECK; | 5093   return OSR_AFTER_STACK_CHECK; | 
| 5049 } | 5094 } | 
| 5050 | 5095 | 
| 5051 | 5096 | 
| 5052 } }  // namespace v8::internal | 5097 } }  // namespace v8::internal | 
| 5053 | 5098 | 
| 5054 #endif  // V8_TARGET_ARCH_X64 | 5099 #endif  // V8_TARGET_ARCH_X64 | 
| OLD | NEW | 
|---|