Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: src/full-codegen/ppc/full-codegen-ppc.cc

Issue 2544123004: [fullcodegen] Remove super property access support. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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 #if V8_TARGET_ARCH_PPC 5 #if V8_TARGET_ARCH_PPC
6 6
7 #include "src/full-codegen/full-codegen.h" 7 #include "src/full-codegen/full-codegen.h"
8 #include "src/ast/compile-time-value.h" 8 #include "src/ast/compile-time-value.h"
9 #include "src/ast/scopes.h" 9 #include "src/ast/scopes.h"
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
(...skipping 1369 matching lines...) Expand 10 before | Expand all | Expand 10 after
1380 break; 1380 break;
1381 case NAMED_PROPERTY: 1381 case NAMED_PROPERTY:
1382 if (expr->is_compound()) { 1382 if (expr->is_compound()) {
1383 // We need the receiver both on the stack and in the register. 1383 // We need the receiver both on the stack and in the register.
1384 VisitForStackValue(property->obj()); 1384 VisitForStackValue(property->obj());
1385 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); 1385 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0));
1386 } else { 1386 } else {
1387 VisitForStackValue(property->obj()); 1387 VisitForStackValue(property->obj());
1388 } 1388 }
1389 break; 1389 break;
1390 case NAMED_SUPER_PROPERTY:
1391 VisitForStackValue(
1392 property->obj()->AsSuperPropertyReference()->this_var());
1393 VisitForAccumulatorValue(
1394 property->obj()->AsSuperPropertyReference()->home_object());
1395 PushOperand(result_register());
1396 if (expr->is_compound()) {
1397 const Register scratch = r4;
1398 __ LoadP(scratch, MemOperand(sp, kPointerSize));
1399 PushOperands(scratch, result_register());
1400 }
1401 break;
1402 case KEYED_SUPER_PROPERTY: {
1403 VisitForStackValue(
1404 property->obj()->AsSuperPropertyReference()->this_var());
1405 VisitForStackValue(
1406 property->obj()->AsSuperPropertyReference()->home_object());
1407 VisitForAccumulatorValue(property->key());
1408 PushOperand(result_register());
1409 if (expr->is_compound()) {
1410 const Register scratch1 = r5;
1411 const Register scratch2 = r4;
1412 __ LoadP(scratch1, MemOperand(sp, 2 * kPointerSize));
1413 __ LoadP(scratch2, MemOperand(sp, 1 * kPointerSize));
1414 PushOperands(scratch1, scratch2, result_register());
1415 }
1416 break;
1417 }
1418 case KEYED_PROPERTY: 1390 case KEYED_PROPERTY:
1419 if (expr->is_compound()) { 1391 if (expr->is_compound()) {
1420 VisitForStackValue(property->obj()); 1392 VisitForStackValue(property->obj());
1421 VisitForStackValue(property->key()); 1393 VisitForStackValue(property->key());
1422 __ LoadP(LoadDescriptor::ReceiverRegister(), 1394 __ LoadP(LoadDescriptor::ReceiverRegister(),
1423 MemOperand(sp, 1 * kPointerSize)); 1395 MemOperand(sp, 1 * kPointerSize));
1424 __ LoadP(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); 1396 __ LoadP(LoadDescriptor::NameRegister(), MemOperand(sp, 0));
1425 } else { 1397 } else {
1426 VisitForStackValue(property->obj()); 1398 VisitForStackValue(property->obj());
1427 VisitForStackValue(property->key()); 1399 VisitForStackValue(property->key());
1428 } 1400 }
1429 break; 1401 break;
1402 case NAMED_SUPER_PROPERTY:
1403 case KEYED_SUPER_PROPERTY:
1404 UNREACHABLE();
1405 break;
1430 } 1406 }
1431 1407
1432 // For compound assignments we need another deoptimization point after the 1408 // For compound assignments we need another deoptimization point after the
1433 // variable/property load. 1409 // variable/property load.
1434 if (expr->is_compound()) { 1410 if (expr->is_compound()) {
1435 { 1411 {
1436 AccumulatorValueContext context(this); 1412 AccumulatorValueContext context(this);
1437 switch (assign_type) { 1413 switch (assign_type) {
1438 case VARIABLE: 1414 case VARIABLE:
1439 EmitVariableLoad(expr->target()->AsVariableProxy()); 1415 EmitVariableLoad(expr->target()->AsVariableProxy());
1440 PrepareForBailout(expr->target(), BailoutState::TOS_REGISTER); 1416 PrepareForBailout(expr->target(), BailoutState::TOS_REGISTER);
1441 break; 1417 break;
1442 case NAMED_PROPERTY: 1418 case NAMED_PROPERTY:
1443 EmitNamedPropertyLoad(property); 1419 EmitNamedPropertyLoad(property);
1444 PrepareForBailoutForId(property->LoadId(), 1420 PrepareForBailoutForId(property->LoadId(),
1445 BailoutState::TOS_REGISTER); 1421 BailoutState::TOS_REGISTER);
1446 break; 1422 break;
1447 case NAMED_SUPER_PROPERTY:
1448 EmitNamedSuperPropertyLoad(property);
1449 PrepareForBailoutForId(property->LoadId(),
1450 BailoutState::TOS_REGISTER);
1451 break;
1452 case KEYED_SUPER_PROPERTY:
1453 EmitKeyedSuperPropertyLoad(property);
1454 PrepareForBailoutForId(property->LoadId(),
1455 BailoutState::TOS_REGISTER);
1456 break;
1457 case KEYED_PROPERTY: 1423 case KEYED_PROPERTY:
1458 EmitKeyedPropertyLoad(property); 1424 EmitKeyedPropertyLoad(property);
1459 PrepareForBailoutForId(property->LoadId(), 1425 PrepareForBailoutForId(property->LoadId(),
1460 BailoutState::TOS_REGISTER); 1426 BailoutState::TOS_REGISTER);
1461 break; 1427 break;
1428 case NAMED_SUPER_PROPERTY:
1429 case KEYED_SUPER_PROPERTY:
1430 UNREACHABLE();
1431 break;
1462 } 1432 }
1463 } 1433 }
1464 1434
1465 Token::Value op = expr->binary_op(); 1435 Token::Value op = expr->binary_op();
1466 PushOperand(r3); // Left operand goes on the stack. 1436 PushOperand(r3); // Left operand goes on the stack.
1467 VisitForAccumulatorValue(expr->value()); 1437 VisitForAccumulatorValue(expr->value());
1468 1438
1469 AccumulatorValueContext context(this); 1439 AccumulatorValueContext context(this);
1470 if (ShouldInlineSmiCase(op)) { 1440 if (ShouldInlineSmiCase(op)) {
1471 EmitInlineSmiBinaryOp(expr->binary_operation(), op, expr->target(), 1441 EmitInlineSmiBinaryOp(expr->binary_operation(), op, expr->target(),
(...skipping 16 matching lines...) Expand all
1488 VariableProxy* proxy = expr->target()->AsVariableProxy(); 1458 VariableProxy* proxy = expr->target()->AsVariableProxy();
1489 EmitVariableAssignment(proxy->var(), expr->op(), expr->AssignmentSlot(), 1459 EmitVariableAssignment(proxy->var(), expr->op(), expr->AssignmentSlot(),
1490 proxy->hole_check_mode()); 1460 proxy->hole_check_mode());
1491 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 1461 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
1492 context()->Plug(r3); 1462 context()->Plug(r3);
1493 break; 1463 break;
1494 } 1464 }
1495 case NAMED_PROPERTY: 1465 case NAMED_PROPERTY:
1496 EmitNamedPropertyAssignment(expr); 1466 EmitNamedPropertyAssignment(expr);
1497 break; 1467 break;
1498 case NAMED_SUPER_PROPERTY:
1499 EmitNamedSuperPropertyStore(property);
1500 context()->Plug(r3);
1501 break;
1502 case KEYED_SUPER_PROPERTY:
1503 EmitKeyedSuperPropertyStore(property);
1504 context()->Plug(r3);
1505 break;
1506 case KEYED_PROPERTY: 1468 case KEYED_PROPERTY:
1507 EmitKeyedPropertyAssignment(expr); 1469 EmitKeyedPropertyAssignment(expr);
1508 break; 1470 break;
1471 case NAMED_SUPER_PROPERTY:
1472 case KEYED_SUPER_PROPERTY:
1473 UNREACHABLE();
1474 break;
1509 } 1475 }
1510 } 1476 }
1511 1477
1512 1478
1513 void FullCodeGenerator::VisitYield(Yield* expr) { 1479 void FullCodeGenerator::VisitYield(Yield* expr) {
1514 // Resumable functions are not supported. 1480 // Resumable functions are not supported.
1515 UNREACHABLE(); 1481 UNREACHABLE();
1516 } 1482 }
1517 1483
1518 void FullCodeGenerator::PushOperands(Register reg1, Register reg2) { 1484 void FullCodeGenerator::PushOperands(Register reg1, Register reg2) {
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
1723 break; 1689 break;
1724 } 1690 }
1725 case NAMED_PROPERTY: { 1691 case NAMED_PROPERTY: {
1726 PushOperand(r3); // Preserve value. 1692 PushOperand(r3); // Preserve value.
1727 VisitForAccumulatorValue(prop->obj()); 1693 VisitForAccumulatorValue(prop->obj());
1728 __ Move(StoreDescriptor::ReceiverRegister(), r3); 1694 __ Move(StoreDescriptor::ReceiverRegister(), r3);
1729 PopOperand(StoreDescriptor::ValueRegister()); // Restore value. 1695 PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
1730 CallStoreIC(slot, prop->key()->AsLiteral()->value()); 1696 CallStoreIC(slot, prop->key()->AsLiteral()->value());
1731 break; 1697 break;
1732 } 1698 }
1733 case NAMED_SUPER_PROPERTY: {
1734 PushOperand(r3);
1735 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
1736 VisitForAccumulatorValue(
1737 prop->obj()->AsSuperPropertyReference()->home_object());
1738 // stack: value, this; r3: home_object
1739 Register scratch = r5;
1740 Register scratch2 = r6;
1741 __ mr(scratch, result_register()); // home_object
1742 __ LoadP(r3, MemOperand(sp, kPointerSize)); // value
1743 __ LoadP(scratch2, MemOperand(sp, 0)); // this
1744 __ StoreP(scratch2, MemOperand(sp, kPointerSize)); // this
1745 __ StoreP(scratch, MemOperand(sp, 0)); // home_object
1746 // stack: this, home_object; r3: value
1747 EmitNamedSuperPropertyStore(prop);
1748 break;
1749 }
1750 case KEYED_SUPER_PROPERTY: {
1751 PushOperand(r3);
1752 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
1753 VisitForStackValue(
1754 prop->obj()->AsSuperPropertyReference()->home_object());
1755 VisitForAccumulatorValue(prop->key());
1756 Register scratch = r5;
1757 Register scratch2 = r6;
1758 __ LoadP(scratch2, MemOperand(sp, 2 * kPointerSize)); // value
1759 // stack: value, this, home_object; r3: key, r6: value
1760 __ LoadP(scratch, MemOperand(sp, kPointerSize)); // this
1761 __ StoreP(scratch, MemOperand(sp, 2 * kPointerSize));
1762 __ LoadP(scratch, MemOperand(sp, 0)); // home_object
1763 __ StoreP(scratch, MemOperand(sp, kPointerSize));
1764 __ StoreP(r3, MemOperand(sp, 0));
1765 __ Move(r3, scratch2);
1766 // stack: this, home_object, key; r3: value.
1767 EmitKeyedSuperPropertyStore(prop);
1768 break;
1769 }
1770 case KEYED_PROPERTY: { 1699 case KEYED_PROPERTY: {
1771 PushOperand(r3); // Preserve value. 1700 PushOperand(r3); // Preserve value.
1772 VisitForStackValue(prop->obj()); 1701 VisitForStackValue(prop->obj());
1773 VisitForAccumulatorValue(prop->key()); 1702 VisitForAccumulatorValue(prop->key());
1774 __ Move(StoreDescriptor::NameRegister(), r3); 1703 __ Move(StoreDescriptor::NameRegister(), r3);
1775 PopOperands(StoreDescriptor::ValueRegister(), 1704 PopOperands(StoreDescriptor::ValueRegister(),
1776 StoreDescriptor::ReceiverRegister()); 1705 StoreDescriptor::ReceiverRegister());
1777 CallKeyedStoreIC(slot); 1706 CallKeyedStoreIC(slot);
1778 break; 1707 break;
1779 } 1708 }
1709 case NAMED_SUPER_PROPERTY:
1710 case KEYED_SUPER_PROPERTY:
1711 UNREACHABLE();
1712 break;
1780 } 1713 }
1781 context()->Plug(r3); 1714 context()->Plug(r3);
1782 } 1715 }
1783 1716
1784 1717
1785 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( 1718 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot(
1786 Variable* var, MemOperand location) { 1719 Variable* var, MemOperand location) {
1787 __ StoreP(result_register(), location, r0); 1720 __ StoreP(result_register(), location, r0);
1788 if (var->IsContextSlot()) { 1721 if (var->IsContextSlot()) {
1789 // RecordWrite may destroy all its register arguments. 1722 // RecordWrite may destroy all its register arguments.
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1861 DCHECK(prop->key()->IsLiteral()); 1794 DCHECK(prop->key()->IsLiteral());
1862 1795
1863 PopOperand(StoreDescriptor::ReceiverRegister()); 1796 PopOperand(StoreDescriptor::ReceiverRegister());
1864 CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value()); 1797 CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value());
1865 1798
1866 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 1799 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
1867 context()->Plug(r3); 1800 context()->Plug(r3);
1868 } 1801 }
1869 1802
1870 1803
1871 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) {
1872 // Assignment to named property of super.
1873 // r3 : value
1874 // stack : receiver ('this'), home_object
1875 DCHECK(prop != NULL);
1876 Literal* key = prop->key()->AsLiteral();
1877 DCHECK(key != NULL);
1878
1879 PushOperand(key->value());
1880 PushOperand(r3);
1881 CallRuntimeWithOperands((is_strict(language_mode())
1882 ? Runtime::kStoreToSuper_Strict
1883 : Runtime::kStoreToSuper_Sloppy));
1884 }
1885
1886
1887 void FullCodeGenerator::EmitKeyedSuperPropertyStore(Property* prop) {
1888 // Assignment to named property of super.
1889 // r3 : value
1890 // stack : receiver ('this'), home_object, key
1891 DCHECK(prop != NULL);
1892
1893 PushOperand(r3);
1894 CallRuntimeWithOperands((is_strict(language_mode())
1895 ? Runtime::kStoreKeyedToSuper_Strict
1896 : Runtime::kStoreKeyedToSuper_Sloppy));
1897 }
1898
1899
1900 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { 1804 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
1901 // Assignment to a property, using a keyed store IC. 1805 // Assignment to a property, using a keyed store IC.
1902 PopOperands(StoreDescriptor::ReceiverRegister(), 1806 PopOperands(StoreDescriptor::ReceiverRegister(),
1903 StoreDescriptor::NameRegister()); 1807 StoreDescriptor::NameRegister());
1904 DCHECK(StoreDescriptor::ValueRegister().is(r3)); 1808 DCHECK(StoreDescriptor::ValueRegister().is(r3));
1905 1809
1906 CallKeyedStoreIC(expr->AssignmentSlot()); 1810 CallKeyedStoreIC(expr->AssignmentSlot());
1907 1811
1908 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 1812 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
1909 context()->Plug(r3); 1813 context()->Plug(r3);
(...skipping 28 matching lines...) Expand all
1938 __ LoadP(r0, MemOperand(sp, 0)); 1842 __ LoadP(r0, MemOperand(sp, 0));
1939 PushOperand(r0); 1843 PushOperand(r0);
1940 __ StoreP(r3, MemOperand(sp, kPointerSize)); 1844 __ StoreP(r3, MemOperand(sp, kPointerSize));
1941 convert_mode = ConvertReceiverMode::kNotNullOrUndefined; 1845 convert_mode = ConvertReceiverMode::kNotNullOrUndefined;
1942 } 1846 }
1943 1847
1944 EmitCall(expr, convert_mode); 1848 EmitCall(expr, convert_mode);
1945 } 1849 }
1946 1850
1947 1851
1948 void FullCodeGenerator::EmitSuperCallWithLoadIC(Call* expr) {
1949 Expression* callee = expr->expression();
1950 DCHECK(callee->IsProperty());
1951 Property* prop = callee->AsProperty();
1952 DCHECK(prop->IsSuperAccess());
1953 SetExpressionPosition(prop);
1954
1955 Literal* key = prop->key()->AsLiteral();
1956 DCHECK(!key->value()->IsSmi());
1957 // Load the function from the receiver.
1958 const Register scratch = r4;
1959 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference();
1960 VisitForAccumulatorValue(super_ref->home_object());
1961 __ mr(scratch, r3);
1962 VisitForAccumulatorValue(super_ref->this_var());
1963 PushOperands(scratch, r3, r3, scratch);
1964 PushOperand(key->value());
1965
1966 // Stack here:
1967 // - home_object
1968 // - this (receiver)
1969 // - this (receiver) <-- LoadFromSuper will pop here and below.
1970 // - home_object
1971 // - key
1972 CallRuntimeWithOperands(Runtime::kLoadFromSuper);
1973 PrepareForBailoutForId(prop->LoadId(), BailoutState::TOS_REGISTER);
1974
1975 // Replace home_object with target function.
1976 __ StoreP(r3, MemOperand(sp, kPointerSize));
1977
1978 // Stack here:
1979 // - target function
1980 // - this (receiver)
1981 EmitCall(expr);
1982 }
1983
1984
1985 // Code common for calls using the IC. 1852 // Code common for calls using the IC.
1986 void FullCodeGenerator::EmitKeyedCallWithLoadIC(Call* expr, Expression* key) { 1853 void FullCodeGenerator::EmitKeyedCallWithLoadIC(Call* expr, Expression* key) {
1987 // Load the key. 1854 // Load the key.
1988 VisitForAccumulatorValue(key); 1855 VisitForAccumulatorValue(key);
1989 1856
1990 Expression* callee = expr->expression(); 1857 Expression* callee = expr->expression();
1991 1858
1992 // Load the function from the receiver. 1859 // Load the function from the receiver.
1993 DCHECK(callee->IsProperty()); 1860 DCHECK(callee->IsProperty());
1994 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); 1861 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0));
1995 __ Move(LoadDescriptor::NameRegister(), r3); 1862 __ Move(LoadDescriptor::NameRegister(), r3);
1996 EmitKeyedPropertyLoad(callee->AsProperty()); 1863 EmitKeyedPropertyLoad(callee->AsProperty());
1997 PrepareForBailoutForId(callee->AsProperty()->LoadId(), 1864 PrepareForBailoutForId(callee->AsProperty()->LoadId(),
1998 BailoutState::TOS_REGISTER); 1865 BailoutState::TOS_REGISTER);
1999 1866
2000 // Push the target function under the receiver. 1867 // Push the target function under the receiver.
2001 __ LoadP(ip, MemOperand(sp, 0)); 1868 __ LoadP(ip, MemOperand(sp, 0));
2002 PushOperand(ip); 1869 PushOperand(ip);
2003 __ StoreP(r3, MemOperand(sp, kPointerSize)); 1870 __ StoreP(r3, MemOperand(sp, kPointerSize));
2004 1871
2005 EmitCall(expr, ConvertReceiverMode::kNotNullOrUndefined); 1872 EmitCall(expr, ConvertReceiverMode::kNotNullOrUndefined);
2006 } 1873 }
2007 1874
2008 1875
2009 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) {
2010 Expression* callee = expr->expression();
2011 DCHECK(callee->IsProperty());
2012 Property* prop = callee->AsProperty();
2013 DCHECK(prop->IsSuperAccess());
2014
2015 SetExpressionPosition(prop);
2016 // Load the function from the receiver.
2017 const Register scratch = r4;
2018 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference();
2019 VisitForAccumulatorValue(super_ref->home_object());
2020 __ mr(scratch, r3);
2021 VisitForAccumulatorValue(super_ref->this_var());
2022 PushOperands(scratch, r3, r3, scratch);
2023 VisitForStackValue(prop->key());
2024
2025 // Stack here:
2026 // - home_object
2027 // - this (receiver)
2028 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below.
2029 // - home_object
2030 // - key
2031 CallRuntimeWithOperands(Runtime::kLoadKeyedFromSuper);
2032 PrepareForBailoutForId(prop->LoadId(), BailoutState::TOS_REGISTER);
2033
2034 // Replace home_object with target function.
2035 __ StoreP(r3, MemOperand(sp, kPointerSize));
2036
2037 // Stack here:
2038 // - target function
2039 // - this (receiver)
2040 EmitCall(expr);
2041 }
2042
2043
2044 void FullCodeGenerator::EmitCall(Call* expr, ConvertReceiverMode mode) { 1876 void FullCodeGenerator::EmitCall(Call* expr, ConvertReceiverMode mode) {
2045 // Load the arguments. 1877 // Load the arguments.
2046 ZoneList<Expression*>* args = expr->arguments(); 1878 ZoneList<Expression*>* args = expr->arguments();
2047 int arg_count = args->length(); 1879 int arg_count = args->length();
2048 for (int i = 0; i < arg_count; i++) { 1880 for (int i = 0; i < arg_count; i++) {
2049 VisitForStackValue(args->at(i)); 1881 VisitForStackValue(args->at(i));
2050 } 1882 }
2051 1883
2052 PrepareForBailoutForId(expr->CallId(), BailoutState::NO_REGISTERS); 1884 PrepareForBailoutForId(expr->CallId(), BailoutState::NO_REGISTERS);
2053 SetCallPosition(expr, expr->tail_call_mode()); 1885 SetCallPosition(expr, expr->tail_call_mode());
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
2557 } 2389 }
2558 switch (assign_type) { 2390 switch (assign_type) {
2559 case NAMED_PROPERTY: { 2391 case NAMED_PROPERTY: {
2560 // Put the object both on the stack and in the register. 2392 // Put the object both on the stack and in the register.
2561 VisitForStackValue(prop->obj()); 2393 VisitForStackValue(prop->obj());
2562 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); 2394 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0));
2563 EmitNamedPropertyLoad(prop); 2395 EmitNamedPropertyLoad(prop);
2564 break; 2396 break;
2565 } 2397 }
2566 2398
2567 case NAMED_SUPER_PROPERTY: {
2568 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
2569 VisitForAccumulatorValue(
2570 prop->obj()->AsSuperPropertyReference()->home_object());
2571 const Register scratch = r4;
2572 __ LoadP(scratch, MemOperand(sp, 0)); // this
2573 PushOperands(result_register(), scratch, result_register());
2574 EmitNamedSuperPropertyLoad(prop);
2575 break;
2576 }
2577
2578 case KEYED_SUPER_PROPERTY: {
2579 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
2580 VisitForStackValue(
2581 prop->obj()->AsSuperPropertyReference()->home_object());
2582 VisitForAccumulatorValue(prop->key());
2583 const Register scratch1 = r4;
2584 const Register scratch2 = r5;
2585 __ LoadP(scratch1, MemOperand(sp, 1 * kPointerSize)); // this
2586 __ LoadP(scratch2, MemOperand(sp, 0 * kPointerSize)); // home object
2587 PushOperands(result_register(), scratch1, scratch2, result_register());
2588 EmitKeyedSuperPropertyLoad(prop);
2589 break;
2590 }
2591
2592 case KEYED_PROPERTY: { 2399 case KEYED_PROPERTY: {
2593 VisitForStackValue(prop->obj()); 2400 VisitForStackValue(prop->obj());
2594 VisitForStackValue(prop->key()); 2401 VisitForStackValue(prop->key());
2595 __ LoadP(LoadDescriptor::ReceiverRegister(), 2402 __ LoadP(LoadDescriptor::ReceiverRegister(),
2596 MemOperand(sp, 1 * kPointerSize)); 2403 MemOperand(sp, 1 * kPointerSize));
2597 __ LoadP(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); 2404 __ LoadP(LoadDescriptor::NameRegister(), MemOperand(sp, 0));
2598 EmitKeyedPropertyLoad(prop); 2405 EmitKeyedPropertyLoad(prop);
2599 break; 2406 break;
2600 } 2407 }
2601 2408
2409 case NAMED_SUPER_PROPERTY:
2410 case KEYED_SUPER_PROPERTY:
2602 case VARIABLE: 2411 case VARIABLE:
2603 UNREACHABLE(); 2412 UNREACHABLE();
2604 } 2413 }
2605 } 2414 }
2606 2415
2607 // We need a second deoptimization point after loading the value 2416 // We need a second deoptimization point after loading the value
2608 // in case evaluating the property load my have a side effect. 2417 // in case evaluating the property load my have a side effect.
2609 if (assign_type == VARIABLE) { 2418 if (assign_type == VARIABLE) {
2610 PrepareForBailout(expr->expression(), BailoutState::TOS_REGISTER); 2419 PrepareForBailout(expr->expression(), BailoutState::TOS_REGISTER);
2611 } else { 2420 } else {
(...skipping 15 matching lines...) Expand all
2627 // Save the result on the stack. If we have a named or keyed property 2436 // Save the result on the stack. If we have a named or keyed property
2628 // we store the result under the receiver that is currently on top 2437 // we store the result under the receiver that is currently on top
2629 // of the stack. 2438 // of the stack.
2630 switch (assign_type) { 2439 switch (assign_type) {
2631 case VARIABLE: 2440 case VARIABLE:
2632 __ push(r3); 2441 __ push(r3);
2633 break; 2442 break;
2634 case NAMED_PROPERTY: 2443 case NAMED_PROPERTY:
2635 __ StoreP(r3, MemOperand(sp, kPointerSize)); 2444 __ StoreP(r3, MemOperand(sp, kPointerSize));
2636 break; 2445 break;
2637 case NAMED_SUPER_PROPERTY:
2638 __ StoreP(r3, MemOperand(sp, 2 * kPointerSize));
2639 break;
2640 case KEYED_PROPERTY: 2446 case KEYED_PROPERTY:
2641 __ StoreP(r3, MemOperand(sp, 2 * kPointerSize)); 2447 __ StoreP(r3, MemOperand(sp, 2 * kPointerSize));
2642 break; 2448 break;
2449 case NAMED_SUPER_PROPERTY:
2643 case KEYED_SUPER_PROPERTY: 2450 case KEYED_SUPER_PROPERTY:
2644 __ StoreP(r3, MemOperand(sp, 3 * kPointerSize)); 2451 UNREACHABLE();
2645 break; 2452 break;
2646 } 2453 }
2647 } 2454 }
2648 } 2455 }
2649 2456
2650 Register scratch1 = r4; 2457 Register scratch1 = r4;
2651 Register scratch2 = r5; 2458 Register scratch2 = r5;
2652 __ LoadSmiLiteral(scratch1, Smi::FromInt(count_value)); 2459 __ LoadSmiLiteral(scratch1, Smi::FromInt(count_value));
2653 __ AddAndCheckForOverflow(r3, r3, scratch1, scratch2, r0); 2460 __ AddAndCheckForOverflow(r3, r3, scratch1, scratch2, r0);
2654 __ BranchOnNoOverflow(&done); 2461 __ BranchOnNoOverflow(&done);
(...skipping 14 matching lines...) Expand all
2669 // Save the result on the stack. If we have a named or keyed property 2476 // Save the result on the stack. If we have a named or keyed property
2670 // we store the result under the receiver that is currently on top 2477 // we store the result under the receiver that is currently on top
2671 // of the stack. 2478 // of the stack.
2672 switch (assign_type) { 2479 switch (assign_type) {
2673 case VARIABLE: 2480 case VARIABLE:
2674 PushOperand(r3); 2481 PushOperand(r3);
2675 break; 2482 break;
2676 case NAMED_PROPERTY: 2483 case NAMED_PROPERTY:
2677 __ StoreP(r3, MemOperand(sp, kPointerSize)); 2484 __ StoreP(r3, MemOperand(sp, kPointerSize));
2678 break; 2485 break;
2679 case NAMED_SUPER_PROPERTY:
2680 __ StoreP(r3, MemOperand(sp, 2 * kPointerSize));
2681 break;
2682 case KEYED_PROPERTY: 2486 case KEYED_PROPERTY:
2683 __ StoreP(r3, MemOperand(sp, 2 * kPointerSize)); 2487 __ StoreP(r3, MemOperand(sp, 2 * kPointerSize));
2684 break; 2488 break;
2489 case NAMED_SUPER_PROPERTY:
2685 case KEYED_SUPER_PROPERTY: 2490 case KEYED_SUPER_PROPERTY:
2686 __ StoreP(r3, MemOperand(sp, 3 * kPointerSize)); 2491 UNREACHABLE();
2687 break; 2492 break;
2688 } 2493 }
2689 } 2494 }
2690 } 2495 }
2691 2496
2692 __ bind(&stub_call); 2497 __ bind(&stub_call);
2693 __ mr(r4, r3); 2498 __ mr(r4, r3);
2694 __ LoadSmiLiteral(r3, Smi::FromInt(count_value)); 2499 __ LoadSmiLiteral(r3, Smi::FromInt(count_value));
2695 2500
2696 SetExpressionPosition(expr); 2501 SetExpressionPosition(expr);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2733 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 2538 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
2734 if (expr->is_postfix()) { 2539 if (expr->is_postfix()) {
2735 if (!context()->IsEffect()) { 2540 if (!context()->IsEffect()) {
2736 context()->PlugTOS(); 2541 context()->PlugTOS();
2737 } 2542 }
2738 } else { 2543 } else {
2739 context()->Plug(r3); 2544 context()->Plug(r3);
2740 } 2545 }
2741 break; 2546 break;
2742 } 2547 }
2743 case NAMED_SUPER_PROPERTY: {
2744 EmitNamedSuperPropertyStore(prop);
2745 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
2746 if (expr->is_postfix()) {
2747 if (!context()->IsEffect()) {
2748 context()->PlugTOS();
2749 }
2750 } else {
2751 context()->Plug(r3);
2752 }
2753 break;
2754 }
2755 case KEYED_SUPER_PROPERTY: {
2756 EmitKeyedSuperPropertyStore(prop);
2757 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
2758 if (expr->is_postfix()) {
2759 if (!context()->IsEffect()) {
2760 context()->PlugTOS();
2761 }
2762 } else {
2763 context()->Plug(r3);
2764 }
2765 break;
2766 }
2767 case KEYED_PROPERTY: { 2548 case KEYED_PROPERTY: {
2768 PopOperands(StoreDescriptor::ReceiverRegister(), 2549 PopOperands(StoreDescriptor::ReceiverRegister(),
2769 StoreDescriptor::NameRegister()); 2550 StoreDescriptor::NameRegister());
2770 CallKeyedStoreIC(expr->CountSlot()); 2551 CallKeyedStoreIC(expr->CountSlot());
2771 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 2552 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
2772 if (expr->is_postfix()) { 2553 if (expr->is_postfix()) {
2773 if (!context()->IsEffect()) { 2554 if (!context()->IsEffect()) {
2774 context()->PlugTOS(); 2555 context()->PlugTOS();
2775 } 2556 }
2776 } else { 2557 } else {
2777 context()->Plug(r3); 2558 context()->Plug(r3);
2778 } 2559 }
2779 break; 2560 break;
2780 } 2561 }
2562 case NAMED_SUPER_PROPERTY:
2563 case KEYED_SUPER_PROPERTY:
2564 UNREACHABLE();
2565 break;
2781 } 2566 }
2782 } 2567 }
2783 2568
2784 2569
2785 void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr, 2570 void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr,
2786 Expression* sub_expr, 2571 Expression* sub_expr,
2787 Handle<String> check) { 2572 Handle<String> check) {
2788 Label materialize_true, materialize_false; 2573 Label materialize_true, materialize_false;
2789 Label* if_true = NULL; 2574 Label* if_true = NULL;
2790 Label* if_false = NULL; 2575 Label* if_false = NULL;
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
3073 2858
3074 DCHECK(Assembler::IsCrSet(Assembler::instr_at(cmp_address))); 2859 DCHECK(Assembler::IsCrSet(Assembler::instr_at(cmp_address)));
3075 2860
3076 DCHECK(interrupt_address == 2861 DCHECK(interrupt_address ==
3077 isolate->builtins()->OnStackReplacement()->entry()); 2862 isolate->builtins()->OnStackReplacement()->entry());
3078 return ON_STACK_REPLACEMENT; 2863 return ON_STACK_REPLACEMENT;
3079 } 2864 }
3080 } // namespace internal 2865 } // namespace internal
3081 } // namespace v8 2866 } // namespace v8
3082 #endif // V8_TARGET_ARCH_PPC 2867 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « src/full-codegen/mips64/full-codegen-mips64.cc ('k') | src/full-codegen/s390/full-codegen-s390.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698