| 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_ARM | 7 #if V8_TARGET_ARCH_ARM |
| 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 1865 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1876 context()->Plug(r0); | 1876 context()->Plug(r0); |
| 1877 } | 1877 } |
| 1878 } | 1878 } |
| 1879 | 1879 |
| 1880 | 1880 |
| 1881 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 1881 void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
| 1882 DCHECK(expr->target()->IsValidReferenceExpression()); | 1882 DCHECK(expr->target()->IsValidReferenceExpression()); |
| 1883 | 1883 |
| 1884 Comment cmnt(masm_, "[ Assignment"); | 1884 Comment cmnt(masm_, "[ Assignment"); |
| 1885 | 1885 |
| 1886 // Left-hand side can only be a property, a global or a (parameter or local) | |
| 1887 // slot. | |
| 1888 enum LhsKind { | |
| 1889 VARIABLE, | |
| 1890 NAMED_PROPERTY, | |
| 1891 KEYED_PROPERTY, | |
| 1892 NAMED_SUPER_PROPERTY | |
| 1893 }; | |
| 1894 LhsKind assign_type = VARIABLE; | |
| 1895 Property* property = expr->target()->AsProperty(); | 1886 Property* property = expr->target()->AsProperty(); |
| 1896 if (property != NULL) { | 1887 LhsKind assign_type = GetAssignType(property); |
| 1897 assign_type = (property->key()->IsPropertyName()) | |
| 1898 ? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY | |
| 1899 : NAMED_PROPERTY) | |
| 1900 : KEYED_PROPERTY; | |
| 1901 } | |
| 1902 | 1888 |
| 1903 // Evaluate LHS expression. | 1889 // Evaluate LHS expression. |
| 1904 switch (assign_type) { | 1890 switch (assign_type) { |
| 1905 case VARIABLE: | 1891 case VARIABLE: |
| 1906 // Nothing to do here. | 1892 // Nothing to do here. |
| 1907 break; | 1893 break; |
| 1908 case NAMED_PROPERTY: | 1894 case NAMED_PROPERTY: |
| 1909 if (expr->is_compound()) { | 1895 if (expr->is_compound()) { |
| 1910 // We need the receiver both on the stack and in the register. | 1896 // We need the receiver both on the stack and in the register. |
| 1911 VisitForStackValue(property->obj()); | 1897 VisitForStackValue(property->obj()); |
| 1912 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 1898 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
| 1913 } else { | 1899 } else { |
| 1914 VisitForStackValue(property->obj()); | 1900 VisitForStackValue(property->obj()); |
| 1915 } | 1901 } |
| 1916 break; | 1902 break; |
| 1917 case NAMED_SUPER_PROPERTY: | 1903 case NAMED_SUPER_PROPERTY: |
| 1918 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1904 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1919 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1905 EmitLoadHomeObject(property->obj()->AsSuperReference()); |
| 1920 __ Push(result_register()); | 1906 __ Push(result_register()); |
| 1921 if (expr->is_compound()) { | 1907 if (expr->is_compound()) { |
| 1922 const Register scratch = r1; | 1908 const Register scratch = r1; |
| 1923 __ ldr(scratch, MemOperand(sp, kPointerSize)); | 1909 __ ldr(scratch, MemOperand(sp, kPointerSize)); |
| 1924 __ Push(scratch); | 1910 __ Push(scratch); |
| 1925 __ Push(result_register()); | 1911 __ Push(result_register()); |
| 1926 } | 1912 } |
| 1927 break; | 1913 break; |
| 1914 case KEYED_SUPER_PROPERTY: |
| 1915 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1916 EmitLoadHomeObject(property->obj()->AsSuperReference()); |
| 1917 __ Push(result_register()); |
| 1918 VisitForAccumulatorValue(property->key()); |
| 1919 __ Push(result_register()); |
| 1920 if (expr->is_compound()) { |
| 1921 const Register scratch = r1; |
| 1922 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 1923 __ Push(scratch); |
| 1924 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 1925 __ Push(scratch); |
| 1926 __ Push(result_register()); |
| 1927 } |
| 1928 break; |
| 1928 case KEYED_PROPERTY: | 1929 case KEYED_PROPERTY: |
| 1929 if (expr->is_compound()) { | 1930 if (expr->is_compound()) { |
| 1930 VisitForStackValue(property->obj()); | 1931 VisitForStackValue(property->obj()); |
| 1931 VisitForStackValue(property->key()); | 1932 VisitForStackValue(property->key()); |
| 1932 __ ldr(LoadDescriptor::ReceiverRegister(), | 1933 __ ldr(LoadDescriptor::ReceiverRegister(), |
| 1933 MemOperand(sp, 1 * kPointerSize)); | 1934 MemOperand(sp, 1 * kPointerSize)); |
| 1934 __ ldr(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); | 1935 __ ldr(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); |
| 1935 } else { | 1936 } else { |
| 1936 VisitForStackValue(property->obj()); | 1937 VisitForStackValue(property->obj()); |
| 1937 VisitForStackValue(property->key()); | 1938 VisitForStackValue(property->key()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1949 PrepareForBailout(expr->target(), TOS_REG); | 1950 PrepareForBailout(expr->target(), TOS_REG); |
| 1950 break; | 1951 break; |
| 1951 case NAMED_PROPERTY: | 1952 case NAMED_PROPERTY: |
| 1952 EmitNamedPropertyLoad(property); | 1953 EmitNamedPropertyLoad(property); |
| 1953 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1954 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1954 break; | 1955 break; |
| 1955 case NAMED_SUPER_PROPERTY: | 1956 case NAMED_SUPER_PROPERTY: |
| 1956 EmitNamedSuperPropertyLoad(property); | 1957 EmitNamedSuperPropertyLoad(property); |
| 1957 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1958 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1958 break; | 1959 break; |
| 1960 case KEYED_SUPER_PROPERTY: |
| 1961 EmitKeyedSuperPropertyLoad(property); |
| 1962 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1963 break; |
| 1959 case KEYED_PROPERTY: | 1964 case KEYED_PROPERTY: |
| 1960 EmitKeyedPropertyLoad(property); | 1965 EmitKeyedPropertyLoad(property); |
| 1961 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1966 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1962 break; | 1967 break; |
| 1963 } | 1968 } |
| 1964 } | 1969 } |
| 1965 | 1970 |
| 1966 Token::Value op = expr->binary_op(); | 1971 Token::Value op = expr->binary_op(); |
| 1967 __ push(r0); // Left operand goes on the stack. | 1972 __ push(r0); // Left operand goes on the stack. |
| 1968 VisitForAccumulatorValue(expr->value()); | 1973 VisitForAccumulatorValue(expr->value()); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1999 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2004 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 2000 context()->Plug(r0); | 2005 context()->Plug(r0); |
| 2001 break; | 2006 break; |
| 2002 case NAMED_PROPERTY: | 2007 case NAMED_PROPERTY: |
| 2003 EmitNamedPropertyAssignment(expr); | 2008 EmitNamedPropertyAssignment(expr); |
| 2004 break; | 2009 break; |
| 2005 case NAMED_SUPER_PROPERTY: | 2010 case NAMED_SUPER_PROPERTY: |
| 2006 EmitNamedSuperPropertyStore(property); | 2011 EmitNamedSuperPropertyStore(property); |
| 2007 context()->Plug(r0); | 2012 context()->Plug(r0); |
| 2008 break; | 2013 break; |
| 2014 case KEYED_SUPER_PROPERTY: |
| 2015 EmitKeyedSuperPropertyStore(property); |
| 2016 context()->Plug(r0); |
| 2017 break; |
| 2009 case KEYED_PROPERTY: | 2018 case KEYED_PROPERTY: |
| 2010 EmitKeyedPropertyAssignment(expr); | 2019 EmitKeyedPropertyAssignment(expr); |
| 2011 break; | 2020 break; |
| 2012 } | 2021 } |
| 2013 } | 2022 } |
| 2014 | 2023 |
| 2015 | 2024 |
| 2016 void FullCodeGenerator::VisitYield(Yield* expr) { | 2025 void FullCodeGenerator::VisitYield(Yield* expr) { |
| 2017 Comment cmnt(masm_, "[ Yield"); | 2026 Comment cmnt(masm_, "[ Yield"); |
| 2018 // Evaluate yielded value first; the initial iterator definition depends on | 2027 // Evaluate yielded value first; the initial iterator definition depends on |
| (...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2644 | 2653 |
| 2645 | 2654 |
| 2646 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { | 2655 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { |
| 2647 // Assignment to named property of super. | 2656 // Assignment to named property of super. |
| 2648 // r0 : value | 2657 // r0 : value |
| 2649 // stack : receiver ('this'), home_object | 2658 // stack : receiver ('this'), home_object |
| 2650 DCHECK(prop != NULL); | 2659 DCHECK(prop != NULL); |
| 2651 Literal* key = prop->key()->AsLiteral(); | 2660 Literal* key = prop->key()->AsLiteral(); |
| 2652 DCHECK(key != NULL); | 2661 DCHECK(key != NULL); |
| 2653 | 2662 |
| 2663 __ Push(key->value()); |
| 2654 __ Push(r0); | 2664 __ Push(r0); |
| 2655 __ Push(key->value()); | |
| 2656 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict | 2665 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict |
| 2657 : Runtime::kStoreToSuper_Sloppy), | 2666 : Runtime::kStoreToSuper_Sloppy), |
| 2658 4); | 2667 4); |
| 2659 } | 2668 } |
| 2660 | 2669 |
| 2661 | 2670 |
| 2671 void FullCodeGenerator::EmitKeyedSuperPropertyStore(Property* prop) { |
| 2672 // Assignment to named property of super. |
| 2673 // r0 : value |
| 2674 // stack : receiver ('this'), home_object, key |
| 2675 DCHECK(prop != NULL); |
| 2676 |
| 2677 __ Push(r0); |
| 2678 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreKeyedToSuper_Strict |
| 2679 : Runtime::kStoreKeyedToSuper_Sloppy), |
| 2680 4); |
| 2681 } |
| 2682 |
| 2683 |
| 2662 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 2684 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
| 2663 // Assignment to a property, using a keyed store IC. | 2685 // Assignment to a property, using a keyed store IC. |
| 2664 | 2686 |
| 2665 // Record source code position before IC call. | 2687 // Record source code position before IC call. |
| 2666 SetSourcePosition(expr->position()); | 2688 SetSourcePosition(expr->position()); |
| 2667 __ Pop(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister()); | 2689 __ Pop(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister()); |
| 2668 DCHECK(StoreDescriptor::ValueRegister().is(r0)); | 2690 DCHECK(StoreDescriptor::ValueRegister().is(r0)); |
| 2669 | 2691 |
| 2670 Handle<Code> ic = CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 2692 Handle<Code> ic = CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); |
| 2671 CallIC(ic, expr->AssignmentFeedbackId()); | 2693 CallIC(ic, expr->AssignmentFeedbackId()); |
| (...skipping 1751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4423 } | 4445 } |
| 4424 } | 4446 } |
| 4425 | 4447 |
| 4426 | 4448 |
| 4427 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { | 4449 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
| 4428 DCHECK(expr->expression()->IsValidReferenceExpression()); | 4450 DCHECK(expr->expression()->IsValidReferenceExpression()); |
| 4429 | 4451 |
| 4430 Comment cmnt(masm_, "[ CountOperation"); | 4452 Comment cmnt(masm_, "[ CountOperation"); |
| 4431 SetSourcePosition(expr->position()); | 4453 SetSourcePosition(expr->position()); |
| 4432 | 4454 |
| 4433 // Expression can only be a property, a global or a (parameter or local) | |
| 4434 // slot. | |
| 4435 enum LhsKind { | |
| 4436 VARIABLE, | |
| 4437 NAMED_PROPERTY, | |
| 4438 KEYED_PROPERTY, | |
| 4439 NAMED_SUPER_PROPERTY | |
| 4440 }; | |
| 4441 LhsKind assign_type = VARIABLE; | |
| 4442 Property* prop = expr->expression()->AsProperty(); | 4455 Property* prop = expr->expression()->AsProperty(); |
| 4443 // In case of a property we use the uninitialized expression context | 4456 LhsKind assign_type = GetAssignType(prop); |
| 4444 // of the key to detect a named property. | |
| 4445 if (prop != NULL) { | |
| 4446 assign_type = | |
| 4447 (prop->key()->IsPropertyName()) | |
| 4448 ? (prop->IsSuperAccess() ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) | |
| 4449 : KEYED_PROPERTY; | |
| 4450 } | |
| 4451 | 4457 |
| 4452 // Evaluate expression and get value. | 4458 // Evaluate expression and get value. |
| 4453 if (assign_type == VARIABLE) { | 4459 if (assign_type == VARIABLE) { |
| 4454 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 4460 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); |
| 4455 AccumulatorValueContext context(this); | 4461 AccumulatorValueContext context(this); |
| 4456 EmitVariableLoad(expr->expression()->AsVariableProxy()); | 4462 EmitVariableLoad(expr->expression()->AsVariableProxy()); |
| 4457 } else { | 4463 } else { |
| 4458 // Reserve space for result of postfix operation. | 4464 // Reserve space for result of postfix operation. |
| 4459 if (expr->is_postfix() && !context()->IsEffect()) { | 4465 if (expr->is_postfix() && !context()->IsEffect()) { |
| 4460 __ mov(ip, Operand(Smi::FromInt(0))); | 4466 __ mov(ip, Operand(Smi::FromInt(0))); |
| 4461 __ push(ip); | 4467 __ push(ip); |
| 4462 } | 4468 } |
| 4463 if (assign_type == NAMED_PROPERTY) { | 4469 switch (assign_type) { |
| 4464 // Put the object both on the stack and in the register. | 4470 case NAMED_PROPERTY: { |
| 4465 VisitForStackValue(prop->obj()); | 4471 // Put the object both on the stack and in the register. |
| 4466 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 4472 VisitForStackValue(prop->obj()); |
| 4467 EmitNamedPropertyLoad(prop); | 4473 __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
| 4468 } else if (assign_type == NAMED_SUPER_PROPERTY) { | 4474 EmitNamedPropertyLoad(prop); |
| 4469 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4475 break; |
| 4470 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4476 } |
| 4471 __ Push(result_register()); | 4477 |
| 4472 const Register scratch = r1; | 4478 case NAMED_SUPER_PROPERTY: { |
| 4473 __ ldr(scratch, MemOperand(sp, kPointerSize)); | 4479 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4474 __ Push(scratch); | 4480 EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
| 4475 __ Push(result_register()); | 4481 __ Push(result_register()); |
| 4476 EmitNamedSuperPropertyLoad(prop); | 4482 const Register scratch = r1; |
| 4477 } else { | 4483 __ ldr(scratch, MemOperand(sp, kPointerSize)); |
| 4478 VisitForStackValue(prop->obj()); | 4484 __ Push(scratch); |
| 4479 VisitForStackValue(prop->key()); | 4485 __ Push(result_register()); |
| 4480 __ ldr(LoadDescriptor::ReceiverRegister(), | 4486 EmitNamedSuperPropertyLoad(prop); |
| 4481 MemOperand(sp, 1 * kPointerSize)); | 4487 break; |
| 4482 __ ldr(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); | 4488 } |
| 4483 EmitKeyedPropertyLoad(prop); | 4489 |
| 4490 case KEYED_SUPER_PROPERTY: { |
| 4491 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4492 EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
| 4493 __ Push(result_register()); |
| 4494 VisitForAccumulatorValue(prop->key()); |
| 4495 __ Push(result_register()); |
| 4496 const Register scratch = r1; |
| 4497 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 4498 __ Push(scratch); |
| 4499 __ ldr(scratch, MemOperand(sp, 2 * kPointerSize)); |
| 4500 __ Push(scratch); |
| 4501 __ Push(result_register()); |
| 4502 EmitKeyedSuperPropertyLoad(prop); |
| 4503 break; |
| 4504 } |
| 4505 |
| 4506 case KEYED_PROPERTY: { |
| 4507 VisitForStackValue(prop->obj()); |
| 4508 VisitForStackValue(prop->key()); |
| 4509 __ ldr(LoadDescriptor::ReceiverRegister(), |
| 4510 MemOperand(sp, 1 * kPointerSize)); |
| 4511 __ ldr(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); |
| 4512 EmitKeyedPropertyLoad(prop); |
| 4513 break; |
| 4514 } |
| 4515 |
| 4516 case VARIABLE: |
| 4517 UNREACHABLE(); |
| 4484 } | 4518 } |
| 4485 } | 4519 } |
| 4486 | 4520 |
| 4487 // We need a second deoptimization point after loading the value | 4521 // We need a second deoptimization point after loading the value |
| 4488 // in case evaluating the property load my have a side effect. | 4522 // in case evaluating the property load my have a side effect. |
| 4489 if (assign_type == VARIABLE) { | 4523 if (assign_type == VARIABLE) { |
| 4490 PrepareForBailout(expr->expression(), TOS_REG); | 4524 PrepareForBailout(expr->expression(), TOS_REG); |
| 4491 } else { | 4525 } else { |
| 4492 PrepareForBailoutForId(prop->LoadId(), TOS_REG); | 4526 PrepareForBailoutForId(prop->LoadId(), TOS_REG); |
| 4493 } | 4527 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 4513 break; | 4547 break; |
| 4514 case NAMED_PROPERTY: | 4548 case NAMED_PROPERTY: |
| 4515 __ str(r0, MemOperand(sp, kPointerSize)); | 4549 __ str(r0, MemOperand(sp, kPointerSize)); |
| 4516 break; | 4550 break; |
| 4517 case NAMED_SUPER_PROPERTY: | 4551 case NAMED_SUPER_PROPERTY: |
| 4518 __ str(r0, MemOperand(sp, 2 * kPointerSize)); | 4552 __ str(r0, MemOperand(sp, 2 * kPointerSize)); |
| 4519 break; | 4553 break; |
| 4520 case KEYED_PROPERTY: | 4554 case KEYED_PROPERTY: |
| 4521 __ str(r0, MemOperand(sp, 2 * kPointerSize)); | 4555 __ str(r0, MemOperand(sp, 2 * kPointerSize)); |
| 4522 break; | 4556 break; |
| 4557 case KEYED_SUPER_PROPERTY: |
| 4558 __ str(r0, MemOperand(sp, 3 * kPointerSize)); |
| 4559 break; |
| 4523 } | 4560 } |
| 4524 } | 4561 } |
| 4525 } | 4562 } |
| 4526 | 4563 |
| 4527 __ add(r0, r0, Operand(Smi::FromInt(count_value)), SetCC); | 4564 __ add(r0, r0, Operand(Smi::FromInt(count_value)), SetCC); |
| 4528 __ b(vc, &done); | 4565 __ b(vc, &done); |
| 4529 // Call stub. Undo operation first. | 4566 // Call stub. Undo operation first. |
| 4530 __ sub(r0, r0, Operand(Smi::FromInt(count_value))); | 4567 __ sub(r0, r0, Operand(Smi::FromInt(count_value))); |
| 4531 __ jmp(&stub_call); | 4568 __ jmp(&stub_call); |
| 4532 __ bind(&slow); | 4569 __ bind(&slow); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 4546 break; | 4583 break; |
| 4547 case NAMED_PROPERTY: | 4584 case NAMED_PROPERTY: |
| 4548 __ str(r0, MemOperand(sp, kPointerSize)); | 4585 __ str(r0, MemOperand(sp, kPointerSize)); |
| 4549 break; | 4586 break; |
| 4550 case NAMED_SUPER_PROPERTY: | 4587 case NAMED_SUPER_PROPERTY: |
| 4551 __ str(r0, MemOperand(sp, 2 * kPointerSize)); | 4588 __ str(r0, MemOperand(sp, 2 * kPointerSize)); |
| 4552 break; | 4589 break; |
| 4553 case KEYED_PROPERTY: | 4590 case KEYED_PROPERTY: |
| 4554 __ str(r0, MemOperand(sp, 2 * kPointerSize)); | 4591 __ str(r0, MemOperand(sp, 2 * kPointerSize)); |
| 4555 break; | 4592 break; |
| 4593 case KEYED_SUPER_PROPERTY: |
| 4594 __ str(r0, MemOperand(sp, 3 * kPointerSize)); |
| 4595 break; |
| 4556 } | 4596 } |
| 4557 } | 4597 } |
| 4558 } | 4598 } |
| 4559 | 4599 |
| 4560 | 4600 |
| 4561 __ bind(&stub_call); | 4601 __ bind(&stub_call); |
| 4562 __ mov(r1, r0); | 4602 __ mov(r1, r0); |
| 4563 __ mov(r0, Operand(Smi::FromInt(count_value))); | 4603 __ mov(r0, Operand(Smi::FromInt(count_value))); |
| 4564 | 4604 |
| 4565 // Record position before stub call. | 4605 // Record position before stub call. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4612 EmitNamedSuperPropertyStore(prop); | 4652 EmitNamedSuperPropertyStore(prop); |
| 4613 if (expr->is_postfix()) { | 4653 if (expr->is_postfix()) { |
| 4614 if (!context()->IsEffect()) { | 4654 if (!context()->IsEffect()) { |
| 4615 context()->PlugTOS(); | 4655 context()->PlugTOS(); |
| 4616 } | 4656 } |
| 4617 } else { | 4657 } else { |
| 4618 context()->Plug(r0); | 4658 context()->Plug(r0); |
| 4619 } | 4659 } |
| 4620 break; | 4660 break; |
| 4621 } | 4661 } |
| 4662 case KEYED_SUPER_PROPERTY: { |
| 4663 EmitKeyedSuperPropertyStore(prop); |
| 4664 if (expr->is_postfix()) { |
| 4665 if (!context()->IsEffect()) { |
| 4666 context()->PlugTOS(); |
| 4667 } |
| 4668 } else { |
| 4669 context()->Plug(r0); |
| 4670 } |
| 4671 break; |
| 4672 } |
| 4622 case KEYED_PROPERTY: { | 4673 case KEYED_PROPERTY: { |
| 4623 __ Pop(StoreDescriptor::ReceiverRegister(), | 4674 __ Pop(StoreDescriptor::ReceiverRegister(), |
| 4624 StoreDescriptor::NameRegister()); | 4675 StoreDescriptor::NameRegister()); |
| 4625 Handle<Code> ic = | 4676 Handle<Code> ic = |
| 4626 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 4677 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); |
| 4627 CallIC(ic, expr->CountStoreFeedbackId()); | 4678 CallIC(ic, expr->CountStoreFeedbackId()); |
| 4628 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4679 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4629 if (expr->is_postfix()) { | 4680 if (expr->is_postfix()) { |
| 4630 if (!context()->IsEffect()) { | 4681 if (!context()->IsEffect()) { |
| 4631 context()->PlugTOS(); | 4682 context()->PlugTOS(); |
| (...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5142 | 5193 |
| 5143 DCHECK(interrupt_address == | 5194 DCHECK(interrupt_address == |
| 5144 isolate->builtins()->OsrAfterStackCheck()->entry()); | 5195 isolate->builtins()->OsrAfterStackCheck()->entry()); |
| 5145 return OSR_AFTER_STACK_CHECK; | 5196 return OSR_AFTER_STACK_CHECK; |
| 5146 } | 5197 } |
| 5147 | 5198 |
| 5148 | 5199 |
| 5149 } } // namespace v8::internal | 5200 } } // namespace v8::internal |
| 5150 | 5201 |
| 5151 #endif // V8_TARGET_ARCH_ARM | 5202 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |