| 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_MIPS64 | 7 #if V8_TARGET_ARCH_MIPS64 |
| 8 | 8 |
| 9 // Note on Mips implementation: | 9 // Note on Mips implementation: |
| 10 // | 10 // |
| (...skipping 1857 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1868 context()->Plug(v0); | 1868 context()->Plug(v0); |
| 1869 } | 1869 } |
| 1870 } | 1870 } |
| 1871 | 1871 |
| 1872 | 1872 |
| 1873 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 1873 void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
| 1874 DCHECK(expr->target()->IsValidReferenceExpression()); | 1874 DCHECK(expr->target()->IsValidReferenceExpression()); |
| 1875 | 1875 |
| 1876 Comment cmnt(masm_, "[ Assignment"); | 1876 Comment cmnt(masm_, "[ Assignment"); |
| 1877 | 1877 |
| 1878 // Left-hand side can only be a property, a global or a (parameter or local) | |
| 1879 // slot. | |
| 1880 enum LhsKind { | |
| 1881 VARIABLE, | |
| 1882 NAMED_PROPERTY, | |
| 1883 KEYED_PROPERTY, | |
| 1884 NAMED_SUPER_PROPERTY | |
| 1885 }; | |
| 1886 LhsKind assign_type = VARIABLE; | |
| 1887 Property* property = expr->target()->AsProperty(); | 1878 Property* property = expr->target()->AsProperty(); |
| 1888 if (property != NULL) { | 1879 LhsKind assign_type = GetAssignType(property); |
| 1889 assign_type = (property->key()->IsPropertyName()) | |
| 1890 ? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY | |
| 1891 : NAMED_PROPERTY) | |
| 1892 : KEYED_PROPERTY; | |
| 1893 } | |
| 1894 | 1880 |
| 1895 // Evaluate LHS expression. | 1881 // Evaluate LHS expression. |
| 1896 switch (assign_type) { | 1882 switch (assign_type) { |
| 1897 case VARIABLE: | 1883 case VARIABLE: |
| 1898 // Nothing to do here. | 1884 // Nothing to do here. |
| 1899 break; | 1885 break; |
| 1900 case NAMED_PROPERTY: | 1886 case NAMED_PROPERTY: |
| 1901 if (expr->is_compound()) { | 1887 if (expr->is_compound()) { |
| 1902 // We need the receiver both on the stack and in the register. | 1888 // We need the receiver both on the stack and in the register. |
| 1903 VisitForStackValue(property->obj()); | 1889 VisitForStackValue(property->obj()); |
| 1904 __ ld(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 1890 __ ld(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
| 1905 } else { | 1891 } else { |
| 1906 VisitForStackValue(property->obj()); | 1892 VisitForStackValue(property->obj()); |
| 1907 } | 1893 } |
| 1908 break; | 1894 break; |
| 1909 case NAMED_SUPER_PROPERTY: | 1895 case NAMED_SUPER_PROPERTY: |
| 1910 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1896 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1911 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1897 EmitLoadHomeObject(property->obj()->AsSuperReference()); |
| 1912 __ Push(result_register()); | 1898 __ Push(result_register()); |
| 1913 if (expr->is_compound()) { | 1899 if (expr->is_compound()) { |
| 1914 const Register scratch = a1; | 1900 const Register scratch = a1; |
| 1915 __ ld(scratch, MemOperand(sp, kPointerSize)); | 1901 __ ld(scratch, MemOperand(sp, kPointerSize)); |
| 1916 __ Push(scratch, result_register()); | 1902 __ Push(scratch, result_register()); |
| 1917 } | 1903 } |
| 1918 break; | 1904 break; |
| 1905 case KEYED_SUPER_PROPERTY: { |
| 1906 const Register scratch = a1; |
| 1907 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1908 EmitLoadHomeObject(property->obj()->AsSuperReference()); |
| 1909 __ Move(scratch, result_register()); |
| 1910 VisitForAccumulatorValue(property->key()); |
| 1911 __ Push(scratch, result_register()); |
| 1912 if (expr->is_compound()) { |
| 1913 const Register scratch1 = a4; |
| 1914 __ ld(scratch1, MemOperand(sp, 2 * kPointerSize)); |
| 1915 __ Push(scratch1, scratch, result_register()); |
| 1916 } |
| 1917 break; |
| 1918 } |
| 1919 case KEYED_PROPERTY: | 1919 case KEYED_PROPERTY: |
| 1920 // We need the key and receiver on both the stack and in v0 and a1. | 1920 // We need the key and receiver on both the stack and in v0 and a1. |
| 1921 if (expr->is_compound()) { | 1921 if (expr->is_compound()) { |
| 1922 VisitForStackValue(property->obj()); | 1922 VisitForStackValue(property->obj()); |
| 1923 VisitForStackValue(property->key()); | 1923 VisitForStackValue(property->key()); |
| 1924 __ ld(LoadDescriptor::ReceiverRegister(), | 1924 __ ld(LoadDescriptor::ReceiverRegister(), |
| 1925 MemOperand(sp, 1 * kPointerSize)); | 1925 MemOperand(sp, 1 * kPointerSize)); |
| 1926 __ ld(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); | 1926 __ ld(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); |
| 1927 } else { | 1927 } else { |
| 1928 VisitForStackValue(property->obj()); | 1928 VisitForStackValue(property->obj()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1941 PrepareForBailout(expr->target(), TOS_REG); | 1941 PrepareForBailout(expr->target(), TOS_REG); |
| 1942 break; | 1942 break; |
| 1943 case NAMED_PROPERTY: | 1943 case NAMED_PROPERTY: |
| 1944 EmitNamedPropertyLoad(property); | 1944 EmitNamedPropertyLoad(property); |
| 1945 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1945 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1946 break; | 1946 break; |
| 1947 case NAMED_SUPER_PROPERTY: | 1947 case NAMED_SUPER_PROPERTY: |
| 1948 EmitNamedSuperPropertyLoad(property); | 1948 EmitNamedSuperPropertyLoad(property); |
| 1949 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1949 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1950 break; | 1950 break; |
| 1951 case KEYED_SUPER_PROPERTY: |
| 1952 EmitKeyedSuperPropertyLoad(property); |
| 1953 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1954 break; |
| 1951 case KEYED_PROPERTY: | 1955 case KEYED_PROPERTY: |
| 1952 EmitKeyedPropertyLoad(property); | 1956 EmitKeyedPropertyLoad(property); |
| 1953 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1957 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1954 break; | 1958 break; |
| 1955 } | 1959 } |
| 1956 } | 1960 } |
| 1957 | 1961 |
| 1958 Token::Value op = expr->binary_op(); | 1962 Token::Value op = expr->binary_op(); |
| 1959 __ push(v0); // Left operand goes on the stack. | 1963 __ push(v0); // Left operand goes on the stack. |
| 1960 VisitForAccumulatorValue(expr->value()); | 1964 VisitForAccumulatorValue(expr->value()); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1991 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 1995 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 1992 context()->Plug(v0); | 1996 context()->Plug(v0); |
| 1993 break; | 1997 break; |
| 1994 case NAMED_PROPERTY: | 1998 case NAMED_PROPERTY: |
| 1995 EmitNamedPropertyAssignment(expr); | 1999 EmitNamedPropertyAssignment(expr); |
| 1996 break; | 2000 break; |
| 1997 case NAMED_SUPER_PROPERTY: | 2001 case NAMED_SUPER_PROPERTY: |
| 1998 EmitNamedSuperPropertyStore(property); | 2002 EmitNamedSuperPropertyStore(property); |
| 1999 context()->Plug(v0); | 2003 context()->Plug(v0); |
| 2000 break; | 2004 break; |
| 2005 case KEYED_SUPER_PROPERTY: |
| 2006 EmitKeyedSuperPropertyStore(property); |
| 2007 context()->Plug(v0); |
| 2008 break; |
| 2001 case KEYED_PROPERTY: | 2009 case KEYED_PROPERTY: |
| 2002 EmitKeyedPropertyAssignment(expr); | 2010 EmitKeyedPropertyAssignment(expr); |
| 2003 break; | 2011 break; |
| 2004 } | 2012 } |
| 2005 } | 2013 } |
| 2006 | 2014 |
| 2007 | 2015 |
| 2008 void FullCodeGenerator::VisitYield(Yield* expr) { | 2016 void FullCodeGenerator::VisitYield(Yield* expr) { |
| 2009 Comment cmnt(masm_, "[ Yield"); | 2017 Comment cmnt(masm_, "[ Yield"); |
| 2010 // Evaluate yielded value first; the initial iterator definition depends on | 2018 // Evaluate yielded value first; the initial iterator definition depends on |
| (...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2629 | 2637 |
| 2630 | 2638 |
| 2631 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { | 2639 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { |
| 2632 // Assignment to named property of super. | 2640 // Assignment to named property of super. |
| 2633 // v0 : value | 2641 // v0 : value |
| 2634 // stack : receiver ('this'), home_object | 2642 // stack : receiver ('this'), home_object |
| 2635 DCHECK(prop != NULL); | 2643 DCHECK(prop != NULL); |
| 2636 Literal* key = prop->key()->AsLiteral(); | 2644 Literal* key = prop->key()->AsLiteral(); |
| 2637 DCHECK(key != NULL); | 2645 DCHECK(key != NULL); |
| 2638 | 2646 |
| 2647 __ Push(key->value()); |
| 2639 __ Push(v0); | 2648 __ Push(v0); |
| 2640 __ Push(key->value()); | |
| 2641 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict | 2649 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict |
| 2642 : Runtime::kStoreToSuper_Sloppy), | 2650 : Runtime::kStoreToSuper_Sloppy), |
| 2643 4); | 2651 4); |
| 2644 } | 2652 } |
| 2645 | 2653 |
| 2646 | 2654 |
| 2655 void FullCodeGenerator::EmitKeyedSuperPropertyStore(Property* prop) { |
| 2656 // Assignment to named property of super. |
| 2657 // v0 : value |
| 2658 // stack : receiver ('this'), home_object, key |
| 2659 DCHECK(prop != NULL); |
| 2660 |
| 2661 __ Push(v0); |
| 2662 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreKeyedToSuper_Strict |
| 2663 : Runtime::kStoreKeyedToSuper_Sloppy), |
| 2664 4); |
| 2665 } |
| 2666 |
| 2667 |
| 2647 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 2668 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
| 2648 // Assignment to a property, using a keyed store IC. | 2669 // Assignment to a property, using a keyed store IC. |
| 2649 | 2670 |
| 2650 // Record source code position before IC call. | 2671 // Record source code position before IC call. |
| 2651 SetSourcePosition(expr->position()); | 2672 SetSourcePosition(expr->position()); |
| 2652 // Call keyed store IC. | 2673 // Call keyed store IC. |
| 2653 // The arguments are: | 2674 // The arguments are: |
| 2654 // - a0 is the value, | 2675 // - a0 is the value, |
| 2655 // - a1 is the key, | 2676 // - a1 is the key, |
| 2656 // - a2 is the receiver. | 2677 // - a2 is the receiver. |
| (...skipping 1777 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4434 } | 4455 } |
| 4435 } | 4456 } |
| 4436 | 4457 |
| 4437 | 4458 |
| 4438 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { | 4459 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
| 4439 DCHECK(expr->expression()->IsValidReferenceExpression()); | 4460 DCHECK(expr->expression()->IsValidReferenceExpression()); |
| 4440 | 4461 |
| 4441 Comment cmnt(masm_, "[ CountOperation"); | 4462 Comment cmnt(masm_, "[ CountOperation"); |
| 4442 SetSourcePosition(expr->position()); | 4463 SetSourcePosition(expr->position()); |
| 4443 | 4464 |
| 4444 // Expression can only be a property, a global or a (parameter or local) | |
| 4445 // slot. | |
| 4446 enum LhsKind { | |
| 4447 VARIABLE, | |
| 4448 NAMED_PROPERTY, | |
| 4449 KEYED_PROPERTY, | |
| 4450 NAMED_SUPER_PROPERTY | |
| 4451 }; | |
| 4452 LhsKind assign_type = VARIABLE; | |
| 4453 Property* prop = expr->expression()->AsProperty(); | 4465 Property* prop = expr->expression()->AsProperty(); |
| 4454 // In case of a property we use the uninitialized expression context | 4466 LhsKind assign_type = GetAssignType(prop); |
| 4455 // of the key to detect a named property. | |
| 4456 if (prop != NULL) { | |
| 4457 assign_type = | |
| 4458 (prop->key()->IsPropertyName()) | |
| 4459 ? (prop->IsSuperAccess() ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) | |
| 4460 : KEYED_PROPERTY; | |
| 4461 } | |
| 4462 | 4467 |
| 4463 // Evaluate expression and get value. | 4468 // Evaluate expression and get value. |
| 4464 if (assign_type == VARIABLE) { | 4469 if (assign_type == VARIABLE) { |
| 4465 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 4470 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); |
| 4466 AccumulatorValueContext context(this); | 4471 AccumulatorValueContext context(this); |
| 4467 EmitVariableLoad(expr->expression()->AsVariableProxy()); | 4472 EmitVariableLoad(expr->expression()->AsVariableProxy()); |
| 4468 } else { | 4473 } else { |
| 4469 // Reserve space for result of postfix operation. | 4474 // Reserve space for result of postfix operation. |
| 4470 if (expr->is_postfix() && !context()->IsEffect()) { | 4475 if (expr->is_postfix() && !context()->IsEffect()) { |
| 4471 __ li(at, Operand(Smi::FromInt(0))); | 4476 __ li(at, Operand(Smi::FromInt(0))); |
| 4472 __ push(at); | 4477 __ push(at); |
| 4473 } | 4478 } |
| 4474 if (assign_type == NAMED_PROPERTY) { | 4479 switch (assign_type) { |
| 4475 // Put the object both on the stack and in the register. | 4480 case NAMED_PROPERTY: { |
| 4476 VisitForStackValue(prop->obj()); | 4481 // Put the object both on the stack and in the register. |
| 4477 __ ld(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 4482 VisitForStackValue(prop->obj()); |
| 4478 EmitNamedPropertyLoad(prop); | 4483 __ ld(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
| 4479 } else if (assign_type == NAMED_SUPER_PROPERTY) { | 4484 EmitNamedPropertyLoad(prop); |
| 4480 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4485 break; |
| 4481 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4486 } |
| 4482 __ Push(result_register()); | 4487 |
| 4483 const Register scratch = a1; | 4488 case NAMED_SUPER_PROPERTY: { |
| 4484 __ ld(scratch, MemOperand(sp, kPointerSize)); | 4489 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4485 __ Push(scratch, result_register()); | 4490 EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
| 4486 EmitNamedSuperPropertyLoad(prop); | 4491 __ Push(result_register()); |
| 4487 } else { | 4492 const Register scratch = a1; |
| 4488 VisitForStackValue(prop->obj()); | 4493 __ ld(scratch, MemOperand(sp, kPointerSize)); |
| 4489 VisitForStackValue(prop->key()); | 4494 __ Push(scratch, result_register()); |
| 4490 __ ld(LoadDescriptor::ReceiverRegister(), | 4495 EmitNamedSuperPropertyLoad(prop); |
| 4491 MemOperand(sp, 1 * kPointerSize)); | 4496 break; |
| 4492 __ ld(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); | 4497 } |
| 4493 EmitKeyedPropertyLoad(prop); | 4498 |
| 4499 case KEYED_SUPER_PROPERTY: { |
| 4500 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4501 EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
| 4502 const Register scratch = a1; |
| 4503 const Register scratch1 = a4; |
| 4504 __ Move(scratch, result_register()); |
| 4505 VisitForAccumulatorValue(prop->key()); |
| 4506 __ Push(scratch, result_register()); |
| 4507 __ ld(scratch1, MemOperand(sp, 2 * kPointerSize)); |
| 4508 __ Push(scratch1, scratch, result_register()); |
| 4509 EmitKeyedSuperPropertyLoad(prop); |
| 4510 break; |
| 4511 } |
| 4512 |
| 4513 case KEYED_PROPERTY: { |
| 4514 VisitForStackValue(prop->obj()); |
| 4515 VisitForStackValue(prop->key()); |
| 4516 __ ld(LoadDescriptor::ReceiverRegister(), |
| 4517 MemOperand(sp, 1 * kPointerSize)); |
| 4518 __ ld(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); |
| 4519 EmitKeyedPropertyLoad(prop); |
| 4520 } |
| 4521 |
| 4522 case VARIABLE: |
| 4523 UNREACHABLE(); |
| 4494 } | 4524 } |
| 4495 } | 4525 } |
| 4496 | 4526 |
| 4497 // We need a second deoptimization point after loading the value | 4527 // We need a second deoptimization point after loading the value |
| 4498 // in case evaluating the property load my have a side effect. | 4528 // in case evaluating the property load my have a side effect. |
| 4499 if (assign_type == VARIABLE) { | 4529 if (assign_type == VARIABLE) { |
| 4500 PrepareForBailout(expr->expression(), TOS_REG); | 4530 PrepareForBailout(expr->expression(), TOS_REG); |
| 4501 } else { | 4531 } else { |
| 4502 PrepareForBailoutForId(prop->LoadId(), TOS_REG); | 4532 PrepareForBailoutForId(prop->LoadId(), TOS_REG); |
| 4503 } | 4533 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 4524 break; | 4554 break; |
| 4525 case NAMED_PROPERTY: | 4555 case NAMED_PROPERTY: |
| 4526 __ sd(v0, MemOperand(sp, kPointerSize)); | 4556 __ sd(v0, MemOperand(sp, kPointerSize)); |
| 4527 break; | 4557 break; |
| 4528 case NAMED_SUPER_PROPERTY: | 4558 case NAMED_SUPER_PROPERTY: |
| 4529 __ sd(v0, MemOperand(sp, 2 * kPointerSize)); | 4559 __ sd(v0, MemOperand(sp, 2 * kPointerSize)); |
| 4530 break; | 4560 break; |
| 4531 case KEYED_PROPERTY: | 4561 case KEYED_PROPERTY: |
| 4532 __ sd(v0, MemOperand(sp, 2 * kPointerSize)); | 4562 __ sd(v0, MemOperand(sp, 2 * kPointerSize)); |
| 4533 break; | 4563 break; |
| 4564 case KEYED_SUPER_PROPERTY: |
| 4565 __ sd(v0, MemOperand(sp, 3 * kPointerSize)); |
| 4566 break; |
| 4534 } | 4567 } |
| 4535 } | 4568 } |
| 4536 } | 4569 } |
| 4537 | 4570 |
| 4538 Register scratch1 = a1; | 4571 Register scratch1 = a1; |
| 4539 Register scratch2 = a4; | 4572 Register scratch2 = a4; |
| 4540 __ li(scratch1, Operand(Smi::FromInt(count_value))); | 4573 __ li(scratch1, Operand(Smi::FromInt(count_value))); |
| 4541 __ AdduAndCheckForOverflow(v0, v0, scratch1, scratch2); | 4574 __ AdduAndCheckForOverflow(v0, v0, scratch1, scratch2); |
| 4542 __ BranchOnNoOverflow(&done, scratch2); | 4575 __ BranchOnNoOverflow(&done, scratch2); |
| 4543 // Call stub. Undo operation first. | 4576 // Call stub. Undo operation first. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 4560 break; | 4593 break; |
| 4561 case NAMED_PROPERTY: | 4594 case NAMED_PROPERTY: |
| 4562 __ sd(v0, MemOperand(sp, kPointerSize)); | 4595 __ sd(v0, MemOperand(sp, kPointerSize)); |
| 4563 break; | 4596 break; |
| 4564 case NAMED_SUPER_PROPERTY: | 4597 case NAMED_SUPER_PROPERTY: |
| 4565 __ sd(v0, MemOperand(sp, 2 * kPointerSize)); | 4598 __ sd(v0, MemOperand(sp, 2 * kPointerSize)); |
| 4566 break; | 4599 break; |
| 4567 case KEYED_PROPERTY: | 4600 case KEYED_PROPERTY: |
| 4568 __ sd(v0, MemOperand(sp, 2 * kPointerSize)); | 4601 __ sd(v0, MemOperand(sp, 2 * kPointerSize)); |
| 4569 break; | 4602 break; |
| 4603 case KEYED_SUPER_PROPERTY: |
| 4604 __ sd(v0, MemOperand(sp, 3 * kPointerSize)); |
| 4605 break; |
| 4570 } | 4606 } |
| 4571 } | 4607 } |
| 4572 } | 4608 } |
| 4573 | 4609 |
| 4574 __ bind(&stub_call); | 4610 __ bind(&stub_call); |
| 4575 __ mov(a1, v0); | 4611 __ mov(a1, v0); |
| 4576 __ li(a0, Operand(Smi::FromInt(count_value))); | 4612 __ li(a0, Operand(Smi::FromInt(count_value))); |
| 4577 | 4613 |
| 4578 // Record position before stub call. | 4614 // Record position before stub call. |
| 4579 SetSourcePosition(expr->position()); | 4615 SetSourcePosition(expr->position()); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4626 EmitNamedSuperPropertyStore(prop); | 4662 EmitNamedSuperPropertyStore(prop); |
| 4627 if (expr->is_postfix()) { | 4663 if (expr->is_postfix()) { |
| 4628 if (!context()->IsEffect()) { | 4664 if (!context()->IsEffect()) { |
| 4629 context()->PlugTOS(); | 4665 context()->PlugTOS(); |
| 4630 } | 4666 } |
| 4631 } else { | 4667 } else { |
| 4632 context()->Plug(v0); | 4668 context()->Plug(v0); |
| 4633 } | 4669 } |
| 4634 break; | 4670 break; |
| 4635 } | 4671 } |
| 4672 case KEYED_SUPER_PROPERTY: { |
| 4673 EmitKeyedSuperPropertyStore(prop); |
| 4674 if (expr->is_postfix()) { |
| 4675 if (!context()->IsEffect()) { |
| 4676 context()->PlugTOS(); |
| 4677 } |
| 4678 } else { |
| 4679 context()->Plug(v0); |
| 4680 } |
| 4681 break; |
| 4682 } |
| 4636 case KEYED_PROPERTY: { | 4683 case KEYED_PROPERTY: { |
| 4637 __ mov(StoreDescriptor::ValueRegister(), result_register()); | 4684 __ mov(StoreDescriptor::ValueRegister(), result_register()); |
| 4638 __ Pop(StoreDescriptor::ReceiverRegister(), | 4685 __ Pop(StoreDescriptor::ReceiverRegister(), |
| 4639 StoreDescriptor::NameRegister()); | 4686 StoreDescriptor::NameRegister()); |
| 4640 Handle<Code> ic = | 4687 Handle<Code> ic = |
| 4641 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 4688 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); |
| 4642 CallIC(ic, expr->CountStoreFeedbackId()); | 4689 CallIC(ic, expr->CountStoreFeedbackId()); |
| 4643 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4690 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4644 if (expr->is_postfix()) { | 4691 if (expr->is_postfix()) { |
| 4645 if (!context()->IsEffect()) { | 4692 if (!context()->IsEffect()) { |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5093 Assembler::target_address_at(pc_immediate_load_address)) == | 5140 Assembler::target_address_at(pc_immediate_load_address)) == |
| 5094 reinterpret_cast<uint64_t>( | 5141 reinterpret_cast<uint64_t>( |
| 5095 isolate->builtins()->OsrAfterStackCheck()->entry())); | 5142 isolate->builtins()->OsrAfterStackCheck()->entry())); |
| 5096 return OSR_AFTER_STACK_CHECK; | 5143 return OSR_AFTER_STACK_CHECK; |
| 5097 } | 5144 } |
| 5098 | 5145 |
| 5099 | 5146 |
| 5100 } } // namespace v8::internal | 5147 } } // namespace v8::internal |
| 5101 | 5148 |
| 5102 #endif // V8_TARGET_ARCH_MIPS64 | 5149 #endif // V8_TARGET_ARCH_MIPS64 |
| OLD | NEW |