| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|