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 |