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

Side by Side Diff: src/full-codegen/s390/full-codegen-s390.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
« no previous file with comments | « src/full-codegen/ppc/full-codegen-ppc.cc ('k') | src/full-codegen/x64/full-codegen-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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_S390 5 #if V8_TARGET_ARCH_S390
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 1330 matching lines...) Expand 10 before | Expand all | Expand 10 after
1341 break; 1341 break;
1342 case NAMED_PROPERTY: 1342 case NAMED_PROPERTY:
1343 if (expr->is_compound()) { 1343 if (expr->is_compound()) {
1344 // We need the receiver both on the stack and in the register. 1344 // We need the receiver both on the stack and in the register.
1345 VisitForStackValue(property->obj()); 1345 VisitForStackValue(property->obj());
1346 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); 1346 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0));
1347 } else { 1347 } else {
1348 VisitForStackValue(property->obj()); 1348 VisitForStackValue(property->obj());
1349 } 1349 }
1350 break; 1350 break;
1351 case NAMED_SUPER_PROPERTY:
1352 VisitForStackValue(
1353 property->obj()->AsSuperPropertyReference()->this_var());
1354 VisitForAccumulatorValue(
1355 property->obj()->AsSuperPropertyReference()->home_object());
1356 PushOperand(result_register());
1357 if (expr->is_compound()) {
1358 const Register scratch = r3;
1359 __ LoadP(scratch, MemOperand(sp, kPointerSize));
1360 PushOperands(scratch, result_register());
1361 }
1362 break;
1363 case KEYED_SUPER_PROPERTY: {
1364 VisitForStackValue(
1365 property->obj()->AsSuperPropertyReference()->this_var());
1366 VisitForStackValue(
1367 property->obj()->AsSuperPropertyReference()->home_object());
1368 VisitForAccumulatorValue(property->key());
1369 PushOperand(result_register());
1370 if (expr->is_compound()) {
1371 const Register scratch1 = r4;
1372 const Register scratch2 = r3;
1373 __ LoadP(scratch1, MemOperand(sp, 2 * kPointerSize));
1374 __ LoadP(scratch2, MemOperand(sp, 1 * kPointerSize));
1375 PushOperands(scratch1, scratch2, result_register());
1376 }
1377 break;
1378 }
1379 case KEYED_PROPERTY: 1351 case KEYED_PROPERTY:
1380 if (expr->is_compound()) { 1352 if (expr->is_compound()) {
1381 VisitForStackValue(property->obj()); 1353 VisitForStackValue(property->obj());
1382 VisitForStackValue(property->key()); 1354 VisitForStackValue(property->key());
1383 __ LoadP(LoadDescriptor::ReceiverRegister(), 1355 __ LoadP(LoadDescriptor::ReceiverRegister(),
1384 MemOperand(sp, 1 * kPointerSize)); 1356 MemOperand(sp, 1 * kPointerSize));
1385 __ LoadP(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); 1357 __ LoadP(LoadDescriptor::NameRegister(), MemOperand(sp, 0));
1386 } else { 1358 } else {
1387 VisitForStackValue(property->obj()); 1359 VisitForStackValue(property->obj());
1388 VisitForStackValue(property->key()); 1360 VisitForStackValue(property->key());
1389 } 1361 }
1390 break; 1362 break;
1363 case NAMED_SUPER_PROPERTY:
1364 case KEYED_SUPER_PROPERTY:
1365 UNREACHABLE();
1366 break;
1391 } 1367 }
1392 1368
1393 // For compound assignments we need another deoptimization point after the 1369 // For compound assignments we need another deoptimization point after the
1394 // variable/property load. 1370 // variable/property load.
1395 if (expr->is_compound()) { 1371 if (expr->is_compound()) {
1396 { 1372 {
1397 AccumulatorValueContext context(this); 1373 AccumulatorValueContext context(this);
1398 switch (assign_type) { 1374 switch (assign_type) {
1399 case VARIABLE: 1375 case VARIABLE:
1400 EmitVariableLoad(expr->target()->AsVariableProxy()); 1376 EmitVariableLoad(expr->target()->AsVariableProxy());
1401 PrepareForBailout(expr->target(), BailoutState::TOS_REGISTER); 1377 PrepareForBailout(expr->target(), BailoutState::TOS_REGISTER);
1402 break; 1378 break;
1403 case NAMED_PROPERTY: 1379 case NAMED_PROPERTY:
1404 EmitNamedPropertyLoad(property); 1380 EmitNamedPropertyLoad(property);
1405 PrepareForBailoutForId(property->LoadId(), 1381 PrepareForBailoutForId(property->LoadId(),
1406 BailoutState::TOS_REGISTER); 1382 BailoutState::TOS_REGISTER);
1407 break; 1383 break;
1408 case NAMED_SUPER_PROPERTY:
1409 EmitNamedSuperPropertyLoad(property);
1410 PrepareForBailoutForId(property->LoadId(),
1411 BailoutState::TOS_REGISTER);
1412 break;
1413 case KEYED_SUPER_PROPERTY:
1414 EmitKeyedSuperPropertyLoad(property);
1415 PrepareForBailoutForId(property->LoadId(),
1416 BailoutState::TOS_REGISTER);
1417 break;
1418 case KEYED_PROPERTY: 1384 case KEYED_PROPERTY:
1419 EmitKeyedPropertyLoad(property); 1385 EmitKeyedPropertyLoad(property);
1420 PrepareForBailoutForId(property->LoadId(), 1386 PrepareForBailoutForId(property->LoadId(),
1421 BailoutState::TOS_REGISTER); 1387 BailoutState::TOS_REGISTER);
1422 break; 1388 break;
1389 case NAMED_SUPER_PROPERTY:
1390 case KEYED_SUPER_PROPERTY:
1391 UNREACHABLE();
1392 break;
1423 } 1393 }
1424 } 1394 }
1425 1395
1426 Token::Value op = expr->binary_op(); 1396 Token::Value op = expr->binary_op();
1427 PushOperand(r2); // Left operand goes on the stack. 1397 PushOperand(r2); // Left operand goes on the stack.
1428 VisitForAccumulatorValue(expr->value()); 1398 VisitForAccumulatorValue(expr->value());
1429 1399
1430 AccumulatorValueContext context(this); 1400 AccumulatorValueContext context(this);
1431 if (ShouldInlineSmiCase(op)) { 1401 if (ShouldInlineSmiCase(op)) {
1432 EmitInlineSmiBinaryOp(expr->binary_operation(), op, expr->target(), 1402 EmitInlineSmiBinaryOp(expr->binary_operation(), op, expr->target(),
(...skipping 16 matching lines...) Expand all
1449 VariableProxy* proxy = expr->target()->AsVariableProxy(); 1419 VariableProxy* proxy = expr->target()->AsVariableProxy();
1450 EmitVariableAssignment(proxy->var(), expr->op(), expr->AssignmentSlot(), 1420 EmitVariableAssignment(proxy->var(), expr->op(), expr->AssignmentSlot(),
1451 proxy->hole_check_mode()); 1421 proxy->hole_check_mode());
1452 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 1422 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
1453 context()->Plug(r2); 1423 context()->Plug(r2);
1454 break; 1424 break;
1455 } 1425 }
1456 case NAMED_PROPERTY: 1426 case NAMED_PROPERTY:
1457 EmitNamedPropertyAssignment(expr); 1427 EmitNamedPropertyAssignment(expr);
1458 break; 1428 break;
1459 case NAMED_SUPER_PROPERTY:
1460 EmitNamedSuperPropertyStore(property);
1461 context()->Plug(r2);
1462 break;
1463 case KEYED_SUPER_PROPERTY:
1464 EmitKeyedSuperPropertyStore(property);
1465 context()->Plug(r2);
1466 break;
1467 case KEYED_PROPERTY: 1429 case KEYED_PROPERTY:
1468 EmitKeyedPropertyAssignment(expr); 1430 EmitKeyedPropertyAssignment(expr);
1469 break; 1431 break;
1432 case NAMED_SUPER_PROPERTY:
1433 case KEYED_SUPER_PROPERTY:
1434 UNREACHABLE();
1435 break;
1470 } 1436 }
1471 } 1437 }
1472 1438
1473 void FullCodeGenerator::VisitYield(Yield* expr) { 1439 void FullCodeGenerator::VisitYield(Yield* expr) {
1474 // Resumable functions are not supported. 1440 // Resumable functions are not supported.
1475 UNREACHABLE(); 1441 UNREACHABLE();
1476 } 1442 }
1477 1443
1478 void FullCodeGenerator::PushOperands(Register reg1, Register reg2) { 1444 void FullCodeGenerator::PushOperands(Register reg1, Register reg2) {
1479 OperandStackDepthIncrement(2); 1445 OperandStackDepthIncrement(2);
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
1683 break; 1649 break;
1684 } 1650 }
1685 case NAMED_PROPERTY: { 1651 case NAMED_PROPERTY: {
1686 PushOperand(r2); // Preserve value. 1652 PushOperand(r2); // Preserve value.
1687 VisitForAccumulatorValue(prop->obj()); 1653 VisitForAccumulatorValue(prop->obj());
1688 __ Move(StoreDescriptor::ReceiverRegister(), r2); 1654 __ Move(StoreDescriptor::ReceiverRegister(), r2);
1689 PopOperand(StoreDescriptor::ValueRegister()); // Restore value. 1655 PopOperand(StoreDescriptor::ValueRegister()); // Restore value.
1690 CallStoreIC(slot, prop->key()->AsLiteral()->value()); 1656 CallStoreIC(slot, prop->key()->AsLiteral()->value());
1691 break; 1657 break;
1692 } 1658 }
1693 case NAMED_SUPER_PROPERTY: {
1694 PushOperand(r2);
1695 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
1696 VisitForAccumulatorValue(
1697 prop->obj()->AsSuperPropertyReference()->home_object());
1698 // stack: value, this; r2: home_object
1699 Register scratch = r4;
1700 Register scratch2 = r5;
1701 __ LoadRR(scratch, result_register()); // home_object
1702 __ LoadP(r2, MemOperand(sp, kPointerSize)); // value
1703 __ LoadP(scratch2, MemOperand(sp, 0)); // this
1704 __ StoreP(scratch2, MemOperand(sp, kPointerSize)); // this
1705 __ StoreP(scratch, MemOperand(sp, 0)); // home_object
1706 // stack: this, home_object; r2: value
1707 EmitNamedSuperPropertyStore(prop);
1708 break;
1709 }
1710 case KEYED_SUPER_PROPERTY: {
1711 PushOperand(r2);
1712 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
1713 VisitForStackValue(
1714 prop->obj()->AsSuperPropertyReference()->home_object());
1715 VisitForAccumulatorValue(prop->key());
1716 Register scratch = r4;
1717 Register scratch2 = r5;
1718 __ LoadP(scratch2, MemOperand(sp, 2 * kPointerSize)); // value
1719 // stack: value, this, home_object; r3: key, r6: value
1720 __ LoadP(scratch, MemOperand(sp, kPointerSize)); // this
1721 __ StoreP(scratch, MemOperand(sp, 2 * kPointerSize));
1722 __ LoadP(scratch, MemOperand(sp, 0)); // home_object
1723 __ StoreP(scratch, MemOperand(sp, kPointerSize));
1724 __ StoreP(r2, MemOperand(sp, 0));
1725 __ Move(r2, scratch2);
1726 // stack: this, home_object, key; r2: value.
1727 EmitKeyedSuperPropertyStore(prop);
1728 break;
1729 }
1730 case KEYED_PROPERTY: { 1659 case KEYED_PROPERTY: {
1731 PushOperand(r2); // Preserve value. 1660 PushOperand(r2); // Preserve value.
1732 VisitForStackValue(prop->obj()); 1661 VisitForStackValue(prop->obj());
1733 VisitForAccumulatorValue(prop->key()); 1662 VisitForAccumulatorValue(prop->key());
1734 __ Move(StoreDescriptor::NameRegister(), r2); 1663 __ Move(StoreDescriptor::NameRegister(), r2);
1735 PopOperands(StoreDescriptor::ValueRegister(), 1664 PopOperands(StoreDescriptor::ValueRegister(),
1736 StoreDescriptor::ReceiverRegister()); 1665 StoreDescriptor::ReceiverRegister());
1737 CallKeyedStoreIC(slot); 1666 CallKeyedStoreIC(slot);
1738 break; 1667 break;
1739 } 1668 }
1669 case NAMED_SUPER_PROPERTY:
1670 case KEYED_SUPER_PROPERTY:
1671 UNREACHABLE();
1672 break;
1740 } 1673 }
1741 context()->Plug(r2); 1674 context()->Plug(r2);
1742 } 1675 }
1743 1676
1744 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( 1677 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot(
1745 Variable* var, MemOperand location) { 1678 Variable* var, MemOperand location) {
1746 __ StoreP(result_register(), location); 1679 __ StoreP(result_register(), location);
1747 if (var->IsContextSlot()) { 1680 if (var->IsContextSlot()) {
1748 // RecordWrite may destroy all its register arguments. 1681 // RecordWrite may destroy all its register arguments.
1749 __ LoadRR(r5, result_register()); 1682 __ LoadRR(r5, result_register());
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1818 DCHECK(prop != NULL); 1751 DCHECK(prop != NULL);
1819 DCHECK(prop->key()->IsLiteral()); 1752 DCHECK(prop->key()->IsLiteral());
1820 1753
1821 PopOperand(StoreDescriptor::ReceiverRegister()); 1754 PopOperand(StoreDescriptor::ReceiverRegister());
1822 CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value()); 1755 CallStoreIC(expr->AssignmentSlot(), prop->key()->AsLiteral()->value());
1823 1756
1824 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 1757 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
1825 context()->Plug(r2); 1758 context()->Plug(r2);
1826 } 1759 }
1827 1760
1828 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) {
1829 // Assignment to named property of super.
1830 // r2 : value
1831 // stack : receiver ('this'), home_object
1832 DCHECK(prop != NULL);
1833 Literal* key = prop->key()->AsLiteral();
1834 DCHECK(key != NULL);
1835
1836 PushOperand(key->value());
1837 PushOperand(r2);
1838 CallRuntimeWithOperands((is_strict(language_mode())
1839 ? Runtime::kStoreToSuper_Strict
1840 : Runtime::kStoreToSuper_Sloppy));
1841 }
1842
1843 void FullCodeGenerator::EmitKeyedSuperPropertyStore(Property* prop) {
1844 // Assignment to named property of super.
1845 // r2 : value
1846 // stack : receiver ('this'), home_object, key
1847 DCHECK(prop != NULL);
1848
1849 PushOperand(r2);
1850 CallRuntimeWithOperands((is_strict(language_mode())
1851 ? Runtime::kStoreKeyedToSuper_Strict
1852 : Runtime::kStoreKeyedToSuper_Sloppy));
1853 }
1854
1855 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { 1761 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
1856 // Assignment to a property, using a keyed store IC. 1762 // Assignment to a property, using a keyed store IC.
1857 PopOperands(StoreDescriptor::ReceiverRegister(), 1763 PopOperands(StoreDescriptor::ReceiverRegister(),
1858 StoreDescriptor::NameRegister()); 1764 StoreDescriptor::NameRegister());
1859 DCHECK(StoreDescriptor::ValueRegister().is(r2)); 1765 DCHECK(StoreDescriptor::ValueRegister().is(r2));
1860 1766
1861 CallKeyedStoreIC(expr->AssignmentSlot()); 1767 CallKeyedStoreIC(expr->AssignmentSlot());
1862 1768
1863 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 1769 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
1864 context()->Plug(r2); 1770 context()->Plug(r2);
(...skipping 27 matching lines...) Expand all
1892 // Push the target function under the receiver. 1798 // Push the target function under the receiver.
1893 __ LoadP(r1, MemOperand(sp, 0)); 1799 __ LoadP(r1, MemOperand(sp, 0));
1894 PushOperand(r1); 1800 PushOperand(r1);
1895 __ StoreP(r2, MemOperand(sp, kPointerSize)); 1801 __ StoreP(r2, MemOperand(sp, kPointerSize));
1896 convert_mode = ConvertReceiverMode::kNotNullOrUndefined; 1802 convert_mode = ConvertReceiverMode::kNotNullOrUndefined;
1897 } 1803 }
1898 1804
1899 EmitCall(expr, convert_mode); 1805 EmitCall(expr, convert_mode);
1900 } 1806 }
1901 1807
1902 void FullCodeGenerator::EmitSuperCallWithLoadIC(Call* expr) {
1903 Expression* callee = expr->expression();
1904 DCHECK(callee->IsProperty());
1905 Property* prop = callee->AsProperty();
1906 DCHECK(prop->IsSuperAccess());
1907 SetExpressionPosition(prop);
1908
1909 Literal* key = prop->key()->AsLiteral();
1910 DCHECK(!key->value()->IsSmi());
1911 // Load the function from the receiver.
1912 const Register scratch = r3;
1913 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference();
1914 VisitForAccumulatorValue(super_ref->home_object());
1915 __ LoadRR(scratch, r2);
1916 VisitForAccumulatorValue(super_ref->this_var());
1917 PushOperands(scratch, r2, r2, scratch);
1918 PushOperand(key->value());
1919
1920 // Stack here:
1921 // - home_object
1922 // - this (receiver)
1923 // - this (receiver) <-- LoadFromSuper will pop here and below.
1924 // - home_object
1925 // - key
1926 CallRuntimeWithOperands(Runtime::kLoadFromSuper);
1927 PrepareForBailoutForId(prop->LoadId(), BailoutState::TOS_REGISTER);
1928
1929 // Replace home_object with target function.
1930 __ StoreP(r2, MemOperand(sp, kPointerSize));
1931
1932 // Stack here:
1933 // - target function
1934 // - this (receiver)
1935 EmitCall(expr);
1936 }
1937
1938 // Code common for calls using the IC. 1808 // Code common for calls using the IC.
1939 void FullCodeGenerator::EmitKeyedCallWithLoadIC(Call* expr, Expression* key) { 1809 void FullCodeGenerator::EmitKeyedCallWithLoadIC(Call* expr, Expression* key) {
1940 // Load the key. 1810 // Load the key.
1941 VisitForAccumulatorValue(key); 1811 VisitForAccumulatorValue(key);
1942 1812
1943 Expression* callee = expr->expression(); 1813 Expression* callee = expr->expression();
1944 1814
1945 // Load the function from the receiver. 1815 // Load the function from the receiver.
1946 DCHECK(callee->IsProperty()); 1816 DCHECK(callee->IsProperty());
1947 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); 1817 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0));
1948 __ Move(LoadDescriptor::NameRegister(), r2); 1818 __ Move(LoadDescriptor::NameRegister(), r2);
1949 EmitKeyedPropertyLoad(callee->AsProperty()); 1819 EmitKeyedPropertyLoad(callee->AsProperty());
1950 PrepareForBailoutForId(callee->AsProperty()->LoadId(), 1820 PrepareForBailoutForId(callee->AsProperty()->LoadId(),
1951 BailoutState::TOS_REGISTER); 1821 BailoutState::TOS_REGISTER);
1952 1822
1953 // Push the target function under the receiver. 1823 // Push the target function under the receiver.
1954 __ LoadP(ip, MemOperand(sp, 0)); 1824 __ LoadP(ip, MemOperand(sp, 0));
1955 PushOperand(ip); 1825 PushOperand(ip);
1956 __ StoreP(r2, MemOperand(sp, kPointerSize)); 1826 __ StoreP(r2, MemOperand(sp, kPointerSize));
1957 1827
1958 EmitCall(expr, ConvertReceiverMode::kNotNullOrUndefined); 1828 EmitCall(expr, ConvertReceiverMode::kNotNullOrUndefined);
1959 } 1829 }
1960 1830
1961 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) {
1962 Expression* callee = expr->expression();
1963 DCHECK(callee->IsProperty());
1964 Property* prop = callee->AsProperty();
1965 DCHECK(prop->IsSuperAccess());
1966
1967 SetExpressionPosition(prop);
1968 // Load the function from the receiver.
1969 const Register scratch = r3;
1970 SuperPropertyReference* super_ref = prop->obj()->AsSuperPropertyReference();
1971 VisitForAccumulatorValue(super_ref->home_object());
1972 __ LoadRR(scratch, r2);
1973 VisitForAccumulatorValue(super_ref->this_var());
1974 PushOperands(scratch, r2, r2, scratch);
1975 VisitForStackValue(prop->key());
1976
1977 // Stack here:
1978 // - home_object
1979 // - this (receiver)
1980 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below.
1981 // - home_object
1982 // - key
1983 CallRuntimeWithOperands(Runtime::kLoadKeyedFromSuper);
1984 PrepareForBailoutForId(prop->LoadId(), BailoutState::TOS_REGISTER);
1985
1986 // Replace home_object with target function.
1987 __ StoreP(r2, MemOperand(sp, kPointerSize));
1988
1989 // Stack here:
1990 // - target function
1991 // - this (receiver)
1992 EmitCall(expr);
1993 }
1994
1995 void FullCodeGenerator::EmitCall(Call* expr, ConvertReceiverMode mode) { 1831 void FullCodeGenerator::EmitCall(Call* expr, ConvertReceiverMode mode) {
1996 // Load the arguments. 1832 // Load the arguments.
1997 ZoneList<Expression*>* args = expr->arguments(); 1833 ZoneList<Expression*>* args = expr->arguments();
1998 int arg_count = args->length(); 1834 int arg_count = args->length();
1999 for (int i = 0; i < arg_count; i++) { 1835 for (int i = 0; i < arg_count; i++) {
2000 VisitForStackValue(args->at(i)); 1836 VisitForStackValue(args->at(i));
2001 } 1837 }
2002 1838
2003 PrepareForBailoutForId(expr->CallId(), BailoutState::NO_REGISTERS); 1839 PrepareForBailoutForId(expr->CallId(), BailoutState::NO_REGISTERS);
2004 SetCallPosition(expr, expr->tail_call_mode()); 1840 SetCallPosition(expr, expr->tail_call_mode());
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after
2494 } 2330 }
2495 switch (assign_type) { 2331 switch (assign_type) {
2496 case NAMED_PROPERTY: { 2332 case NAMED_PROPERTY: {
2497 // Put the object both on the stack and in the register. 2333 // Put the object both on the stack and in the register.
2498 VisitForStackValue(prop->obj()); 2334 VisitForStackValue(prop->obj());
2499 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); 2335 __ LoadP(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0));
2500 EmitNamedPropertyLoad(prop); 2336 EmitNamedPropertyLoad(prop);
2501 break; 2337 break;
2502 } 2338 }
2503 2339
2504 case NAMED_SUPER_PROPERTY: {
2505 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
2506 VisitForAccumulatorValue(
2507 prop->obj()->AsSuperPropertyReference()->home_object());
2508 const Register scratch = r3;
2509 __ LoadP(scratch, MemOperand(sp, 0)); // this
2510 PushOperands(result_register(), scratch, result_register());
2511 EmitNamedSuperPropertyLoad(prop);
2512 break;
2513 }
2514
2515 case KEYED_SUPER_PROPERTY: {
2516 VisitForStackValue(prop->obj()->AsSuperPropertyReference()->this_var());
2517 VisitForStackValue(
2518 prop->obj()->AsSuperPropertyReference()->home_object());
2519 VisitForAccumulatorValue(prop->key());
2520 const Register scratch1 = r3;
2521 const Register scratch2 = r4;
2522 __ LoadP(scratch1, MemOperand(sp, 1 * kPointerSize)); // this
2523 __ LoadP(scratch2, MemOperand(sp, 0 * kPointerSize)); // home object
2524 PushOperands(result_register(), scratch1, scratch2, result_register());
2525 EmitKeyedSuperPropertyLoad(prop);
2526 break;
2527 }
2528
2529 case KEYED_PROPERTY: { 2340 case KEYED_PROPERTY: {
2530 VisitForStackValue(prop->obj()); 2341 VisitForStackValue(prop->obj());
2531 VisitForStackValue(prop->key()); 2342 VisitForStackValue(prop->key());
2532 __ LoadP(LoadDescriptor::ReceiverRegister(), 2343 __ LoadP(LoadDescriptor::ReceiverRegister(),
2533 MemOperand(sp, 1 * kPointerSize)); 2344 MemOperand(sp, 1 * kPointerSize));
2534 __ LoadP(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); 2345 __ LoadP(LoadDescriptor::NameRegister(), MemOperand(sp, 0));
2535 EmitKeyedPropertyLoad(prop); 2346 EmitKeyedPropertyLoad(prop);
2536 break; 2347 break;
2537 } 2348 }
2538 2349
2350 case NAMED_SUPER_PROPERTY:
2351 case KEYED_SUPER_PROPERTY:
2539 case VARIABLE: 2352 case VARIABLE:
2540 UNREACHABLE(); 2353 UNREACHABLE();
2541 } 2354 }
2542 } 2355 }
2543 2356
2544 // We need a second deoptimization point after loading the value 2357 // We need a second deoptimization point after loading the value
2545 // in case evaluating the property load my have a side effect. 2358 // in case evaluating the property load my have a side effect.
2546 if (assign_type == VARIABLE) { 2359 if (assign_type == VARIABLE) {
2547 PrepareForBailout(expr->expression(), BailoutState::TOS_REGISTER); 2360 PrepareForBailout(expr->expression(), BailoutState::TOS_REGISTER);
2548 } else { 2361 } else {
(...skipping 15 matching lines...) Expand all
2564 // Save the result on the stack. If we have a named or keyed property 2377 // Save the result on the stack. If we have a named or keyed property
2565 // we store the result under the receiver that is currently on top 2378 // we store the result under the receiver that is currently on top
2566 // of the stack. 2379 // of the stack.
2567 switch (assign_type) { 2380 switch (assign_type) {
2568 case VARIABLE: 2381 case VARIABLE:
2569 __ push(r2); 2382 __ push(r2);
2570 break; 2383 break;
2571 case NAMED_PROPERTY: 2384 case NAMED_PROPERTY:
2572 __ StoreP(r2, MemOperand(sp, kPointerSize)); 2385 __ StoreP(r2, MemOperand(sp, kPointerSize));
2573 break; 2386 break;
2574 case NAMED_SUPER_PROPERTY:
2575 __ StoreP(r2, MemOperand(sp, 2 * kPointerSize));
2576 break;
2577 case KEYED_PROPERTY: 2387 case KEYED_PROPERTY:
2578 __ StoreP(r2, MemOperand(sp, 2 * kPointerSize)); 2388 __ StoreP(r2, MemOperand(sp, 2 * kPointerSize));
2579 break; 2389 break;
2390 case NAMED_SUPER_PROPERTY:
2580 case KEYED_SUPER_PROPERTY: 2391 case KEYED_SUPER_PROPERTY:
2581 __ StoreP(r2, MemOperand(sp, 3 * kPointerSize)); 2392 UNREACHABLE();
2582 break; 2393 break;
2583 } 2394 }
2584 } 2395 }
2585 } 2396 }
2586 2397
2587 Register scratch1 = r3; 2398 Register scratch1 = r3;
2588 Register scratch2 = r4; 2399 Register scratch2 = r4;
2589 __ LoadSmiLiteral(scratch1, Smi::FromInt(count_value)); 2400 __ LoadSmiLiteral(scratch1, Smi::FromInt(count_value));
2590 __ AddP(scratch2, r2, scratch1); 2401 __ AddP(scratch2, r2, scratch1);
2591 __ LoadOnConditionP(nooverflow, r2, scratch2); 2402 __ LoadOnConditionP(nooverflow, r2, scratch2);
(...skipping 14 matching lines...) Expand all
2606 // Save the result on the stack. If we have a named or keyed property 2417 // Save the result on the stack. If we have a named or keyed property
2607 // we store the result under the receiver that is currently on top 2418 // we store the result under the receiver that is currently on top
2608 // of the stack. 2419 // of the stack.
2609 switch (assign_type) { 2420 switch (assign_type) {
2610 case VARIABLE: 2421 case VARIABLE:
2611 PushOperand(r2); 2422 PushOperand(r2);
2612 break; 2423 break;
2613 case NAMED_PROPERTY: 2424 case NAMED_PROPERTY:
2614 __ StoreP(r2, MemOperand(sp, kPointerSize)); 2425 __ StoreP(r2, MemOperand(sp, kPointerSize));
2615 break; 2426 break;
2616 case NAMED_SUPER_PROPERTY:
2617 __ StoreP(r2, MemOperand(sp, 2 * kPointerSize));
2618 break;
2619 case KEYED_PROPERTY: 2427 case KEYED_PROPERTY:
2620 __ StoreP(r2, MemOperand(sp, 2 * kPointerSize)); 2428 __ StoreP(r2, MemOperand(sp, 2 * kPointerSize));
2621 break; 2429 break;
2430 case NAMED_SUPER_PROPERTY:
2622 case KEYED_SUPER_PROPERTY: 2431 case KEYED_SUPER_PROPERTY:
2623 __ StoreP(r2, MemOperand(sp, 3 * kPointerSize)); 2432 UNREACHABLE();
2624 break; 2433 break;
2625 } 2434 }
2626 } 2435 }
2627 } 2436 }
2628 2437
2629 __ bind(&stub_call); 2438 __ bind(&stub_call);
2630 __ LoadRR(r3, r2); 2439 __ LoadRR(r3, r2);
2631 __ LoadSmiLiteral(r2, Smi::FromInt(count_value)); 2440 __ LoadSmiLiteral(r2, Smi::FromInt(count_value));
2632 2441
2633 SetExpressionPosition(expr); 2442 SetExpressionPosition(expr);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2670 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 2479 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
2671 if (expr->is_postfix()) { 2480 if (expr->is_postfix()) {
2672 if (!context()->IsEffect()) { 2481 if (!context()->IsEffect()) {
2673 context()->PlugTOS(); 2482 context()->PlugTOS();
2674 } 2483 }
2675 } else { 2484 } else {
2676 context()->Plug(r2); 2485 context()->Plug(r2);
2677 } 2486 }
2678 break; 2487 break;
2679 } 2488 }
2680 case NAMED_SUPER_PROPERTY: {
2681 EmitNamedSuperPropertyStore(prop);
2682 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
2683 if (expr->is_postfix()) {
2684 if (!context()->IsEffect()) {
2685 context()->PlugTOS();
2686 }
2687 } else {
2688 context()->Plug(r2);
2689 }
2690 break;
2691 }
2692 case KEYED_SUPER_PROPERTY: {
2693 EmitKeyedSuperPropertyStore(prop);
2694 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
2695 if (expr->is_postfix()) {
2696 if (!context()->IsEffect()) {
2697 context()->PlugTOS();
2698 }
2699 } else {
2700 context()->Plug(r2);
2701 }
2702 break;
2703 }
2704 case KEYED_PROPERTY: { 2489 case KEYED_PROPERTY: {
2705 PopOperands(StoreDescriptor::ReceiverRegister(), 2490 PopOperands(StoreDescriptor::ReceiverRegister(),
2706 StoreDescriptor::NameRegister()); 2491 StoreDescriptor::NameRegister());
2707 CallKeyedStoreIC(expr->CountSlot()); 2492 CallKeyedStoreIC(expr->CountSlot());
2708 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER); 2493 PrepareForBailoutForId(expr->AssignmentId(), BailoutState::TOS_REGISTER);
2709 if (expr->is_postfix()) { 2494 if (expr->is_postfix()) {
2710 if (!context()->IsEffect()) { 2495 if (!context()->IsEffect()) {
2711 context()->PlugTOS(); 2496 context()->PlugTOS();
2712 } 2497 }
2713 } else { 2498 } else {
2714 context()->Plug(r2); 2499 context()->Plug(r2);
2715 } 2500 }
2716 break; 2501 break;
2717 } 2502 }
2503 case NAMED_SUPER_PROPERTY:
2504 case KEYED_SUPER_PROPERTY:
2505 UNREACHABLE();
2506 break;
2718 } 2507 }
2719 } 2508 }
2720 2509
2721 void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr, 2510 void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr,
2722 Expression* sub_expr, 2511 Expression* sub_expr,
2723 Handle<String> check) { 2512 Handle<String> check) {
2724 Label materialize_true, materialize_false; 2513 Label materialize_true, materialize_false;
2725 Label* if_true = NULL; 2514 Label* if_true = NULL;
2726 Label* if_false = NULL; 2515 Label* if_false = NULL;
2727 Label* fall_through = NULL; 2516 Label* fall_through = NULL;
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
3006 DCHECK(kOSRBranchInstruction == br_instr); 2795 DCHECK(kOSRBranchInstruction == br_instr);
3007 2796
3008 DCHECK(interrupt_address == 2797 DCHECK(interrupt_address ==
3009 isolate->builtins()->OnStackReplacement()->entry()); 2798 isolate->builtins()->OnStackReplacement()->entry());
3010 return ON_STACK_REPLACEMENT; 2799 return ON_STACK_REPLACEMENT;
3011 } 2800 }
3012 2801
3013 } // namespace internal 2802 } // namespace internal
3014 } // namespace v8 2803 } // namespace v8
3015 #endif // V8_TARGET_ARCH_S390 2804 #endif // V8_TARGET_ARCH_S390
OLDNEW
« no previous file with comments | « src/full-codegen/ppc/full-codegen-ppc.cc ('k') | src/full-codegen/x64/full-codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698