Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1072 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1083 LOperand* temp2 = TempRegister(); | 1083 LOperand* temp2 = TempRegister(); |
| 1084 return new LIsObjectAndBranch(UseRegisterAtStart(compare->value()), | 1084 return new LIsObjectAndBranch(UseRegisterAtStart(compare->value()), |
| 1085 temp1, | 1085 temp1, |
| 1086 temp2); | 1086 temp2); |
| 1087 } else if (v->IsCompareJSObjectEq()) { | 1087 } else if (v->IsCompareJSObjectEq()) { |
| 1088 HCompareJSObjectEq* compare = HCompareJSObjectEq::cast(v); | 1088 HCompareJSObjectEq* compare = HCompareJSObjectEq::cast(v); |
| 1089 return new LCmpJSObjectEqAndBranch(UseRegisterAtStart(compare->left()), | 1089 return new LCmpJSObjectEqAndBranch(UseRegisterAtStart(compare->left()), |
| 1090 UseRegisterAtStart(compare->right())); | 1090 UseRegisterAtStart(compare->right())); |
| 1091 } else if (v->IsInstanceOf()) { | 1091 } else if (v->IsInstanceOf()) { |
| 1092 HInstanceOf* instance_of = HInstanceOf::cast(v); | 1092 HInstanceOf* instance_of = HInstanceOf::cast(v); |
| 1093 LOperand* left = UseFixed(instance_of->left(), InstanceofStub::left()); | |
| 1094 LOperand* right = UseFixed(instance_of->right(), InstanceofStub::right()); | |
| 1095 LOperand* context = UseFixed(instance_of->context(), esi); | |
| 1093 LInstanceOfAndBranch* result = | 1096 LInstanceOfAndBranch* result = |
| 1094 new LInstanceOfAndBranch( | 1097 new LInstanceOfAndBranch(context, left, right); |
| 1095 UseFixed(instance_of->left(), InstanceofStub::left()), | |
| 1096 UseFixed(instance_of->right(), InstanceofStub::right())); | |
| 1097 return MarkAsCall(result, instr); | 1098 return MarkAsCall(result, instr); |
| 1098 } else if (v->IsTypeofIs()) { | 1099 } else if (v->IsTypeofIs()) { |
| 1099 HTypeofIs* typeof_is = HTypeofIs::cast(v); | 1100 HTypeofIs* typeof_is = HTypeofIs::cast(v); |
| 1100 return new LTypeofIsAndBranch(UseTempRegister(typeof_is->value())); | 1101 return new LTypeofIsAndBranch(UseTempRegister(typeof_is->value())); |
| 1101 } else if (v->IsIsConstructCall()) { | 1102 } else if (v->IsIsConstructCall()) { |
| 1102 return new LIsConstructCallAndBranch(TempRegister()); | 1103 return new LIsConstructCallAndBranch(TempRegister()); |
| 1103 } else { | 1104 } else { |
| 1104 if (v->IsConstant()) { | 1105 if (v->IsConstant()) { |
| 1105 if (HConstant::cast(v)->handle()->IsTrue()) { | 1106 if (HConstant::cast(v)->handle()->IsTrue()) { |
| 1106 return new LGoto(instr->FirstSuccessor()->block_id()); | 1107 return new LGoto(instr->FirstSuccessor()->block_id()); |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1127 return DefineAsRegister(new LArgumentsLength(Use(length->value()))); | 1128 return DefineAsRegister(new LArgumentsLength(Use(length->value()))); |
| 1128 } | 1129 } |
| 1129 | 1130 |
| 1130 | 1131 |
| 1131 LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { | 1132 LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { |
| 1132 return DefineAsRegister(new LArgumentsElements); | 1133 return DefineAsRegister(new LArgumentsElements); |
| 1133 } | 1134 } |
| 1134 | 1135 |
| 1135 | 1136 |
| 1136 LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { | 1137 LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { |
| 1137 LInstanceOf* result = | 1138 LOperand* left = UseFixed(instr->left(), InstanceofStub::left()); |
| 1138 new LInstanceOf(UseFixed(instr->left(), InstanceofStub::left()), | 1139 LOperand* right = UseFixed(instr->right(), InstanceofStub::right()); |
| 1139 UseFixed(instr->right(), InstanceofStub::right())); | 1140 LOperand* context = UseFixed(instr->context(), esi); |
| 1141 LInstanceOf* result = new LInstanceOf(context, left, right); | |
| 1140 return MarkAsCall(DefineFixed(result, eax), instr); | 1142 return MarkAsCall(DefineFixed(result, eax), instr); |
| 1141 } | 1143 } |
| 1142 | 1144 |
| 1143 | 1145 |
| 1144 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( | 1146 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( |
| 1145 HInstanceOfKnownGlobal* instr) { | 1147 HInstanceOfKnownGlobal* instr) { |
| 1146 LInstanceOfKnownGlobal* result = | 1148 LInstanceOfKnownGlobal* result = |
| 1147 new LInstanceOfKnownGlobal( | 1149 new LInstanceOfKnownGlobal( |
| 1148 UseFixed(instr->value(), InstanceofStub::left()), | 1150 UseFixed(instr->value(), InstanceofStub::left()), |
| 1149 FixedTemp(edi)); | 1151 FixedTemp(edi)); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1225 default: | 1227 default: |
| 1226 UNREACHABLE(); | 1228 UNREACHABLE(); |
| 1227 return NULL; | 1229 return NULL; |
| 1228 } | 1230 } |
| 1229 } | 1231 } |
| 1230 } | 1232 } |
| 1231 | 1233 |
| 1232 | 1234 |
| 1233 LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { | 1235 LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { |
| 1234 ASSERT(instr->key()->representation().IsTagged()); | 1236 ASSERT(instr->key()->representation().IsTagged()); |
| 1237 LOperand* context = UseFixed(instr->context(), esi); | |
|
fschneider
2011/02/09 13:41:53
I'm not sure if it is worth mentioning the context
| |
| 1238 LOperand* key = UseFixed(instr->key(), ecx); | |
| 1235 argument_count_ -= instr->argument_count(); | 1239 argument_count_ -= instr->argument_count(); |
| 1236 LOperand* key = UseFixed(instr->key(), ecx); | 1240 LCallKeyed* result = new LCallKeyed(context, key); |
| 1237 return MarkAsCall(DefineFixed(new LCallKeyed(key), eax), instr); | 1241 return MarkAsCall(DefineFixed(result, eax), instr); |
| 1238 } | 1242 } |
| 1239 | 1243 |
| 1240 | 1244 |
| 1241 LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { | 1245 LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { |
| 1246 LOperand* context = UseFixed(instr->context(), esi); | |
| 1242 argument_count_ -= instr->argument_count(); | 1247 argument_count_ -= instr->argument_count(); |
| 1243 return MarkAsCall(DefineFixed(new LCallNamed, eax), instr); | 1248 LCallNamed* result = new LCallNamed(context); |
| 1249 return MarkAsCall(DefineFixed(result, eax), instr); | |
| 1244 } | 1250 } |
| 1245 | 1251 |
| 1246 | 1252 |
| 1247 LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) { | 1253 LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) { |
| 1254 LOperand* context = UseFixed(instr->context(), esi); | |
| 1248 argument_count_ -= instr->argument_count(); | 1255 argument_count_ -= instr->argument_count(); |
| 1249 return MarkAsCall(DefineFixed(new LCallGlobal, eax), instr); | 1256 LCallGlobal* result = new LCallGlobal(context); |
| 1257 return MarkAsCall(DefineFixed(result, eax), instr); | |
| 1250 } | 1258 } |
| 1251 | 1259 |
| 1252 | 1260 |
| 1253 LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { | 1261 LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { |
| 1254 argument_count_ -= instr->argument_count(); | 1262 argument_count_ -= instr->argument_count(); |
| 1255 return MarkAsCall(DefineFixed(new LCallKnownGlobal, eax), instr); | 1263 return MarkAsCall(DefineFixed(new LCallKnownGlobal, eax), instr); |
| 1256 } | 1264 } |
| 1257 | 1265 |
| 1258 | 1266 |
| 1259 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { | 1267 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { |
| 1268 LOperand* context = UseFixed(instr->context(), esi); | |
| 1260 LOperand* constructor = UseFixed(instr->constructor(), edi); | 1269 LOperand* constructor = UseFixed(instr->constructor(), edi); |
| 1261 argument_count_ -= instr->argument_count(); | 1270 argument_count_ -= instr->argument_count(); |
| 1262 LCallNew* result = new LCallNew(constructor); | 1271 LCallNew* result = new LCallNew(context, constructor); |
| 1263 return MarkAsCall(DefineFixed(result, eax), instr); | 1272 return MarkAsCall(DefineFixed(result, eax), instr); |
| 1264 } | 1273 } |
| 1265 | 1274 |
| 1266 | 1275 |
| 1267 LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { | 1276 LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { |
| 1277 LOperand* context = UseFixed(instr->context(), esi); | |
| 1268 argument_count_ -= instr->argument_count(); | 1278 argument_count_ -= instr->argument_count(); |
| 1269 return MarkAsCall(DefineFixed(new LCallFunction, eax), instr); | 1279 LCallFunction* result = new LCallFunction(context); |
| 1280 return MarkAsCall(DefineFixed(result, eax), instr); | |
| 1270 } | 1281 } |
| 1271 | 1282 |
| 1272 | 1283 |
| 1273 LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { | 1284 LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { |
| 1274 argument_count_ -= instr->argument_count(); | 1285 argument_count_ -= instr->argument_count(); |
| 1275 return MarkAsCall(DefineFixed(new LCallRuntime, eax), instr); | 1286 return MarkAsCall(DefineFixed(new LCallRuntime, eax), instr); |
| 1276 } | 1287 } |
| 1277 | 1288 |
| 1278 | 1289 |
| 1279 LInstruction* LChunkBuilder::DoShr(HShr* instr) { | 1290 LInstruction* LChunkBuilder::DoShr(HShr* instr) { |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1726 | 1737 |
| 1727 | 1738 |
| 1728 LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { | 1739 LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { |
| 1729 ASSERT(instr->representation().IsTagged()); | 1740 ASSERT(instr->representation().IsTagged()); |
| 1730 LOperand* obj = UseRegisterAtStart(instr->object()); | 1741 LOperand* obj = UseRegisterAtStart(instr->object()); |
| 1731 return DefineAsRegister(new LLoadNamedField(obj)); | 1742 return DefineAsRegister(new LLoadNamedField(obj)); |
| 1732 } | 1743 } |
| 1733 | 1744 |
| 1734 | 1745 |
| 1735 LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { | 1746 LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { |
| 1747 LOperand* context = UseFixed(instr->context(), esi); | |
| 1736 LOperand* object = UseFixed(instr->object(), eax); | 1748 LOperand* object = UseFixed(instr->object(), eax); |
| 1737 LLoadNamedGeneric* result = new LLoadNamedGeneric(object); | 1749 LLoadNamedGeneric* result = new LLoadNamedGeneric(context, object); |
| 1738 return MarkAsCall(DefineFixed(result, eax), instr); | 1750 return MarkAsCall(DefineFixed(result, eax), instr); |
| 1739 } | 1751 } |
| 1740 | 1752 |
| 1741 | 1753 |
| 1742 LInstruction* LChunkBuilder::DoLoadFunctionPrototype( | 1754 LInstruction* LChunkBuilder::DoLoadFunctionPrototype( |
| 1743 HLoadFunctionPrototype* instr) { | 1755 HLoadFunctionPrototype* instr) { |
| 1744 return AssignEnvironment(DefineAsRegister( | 1756 return AssignEnvironment(DefineAsRegister( |
| 1745 new LLoadFunctionPrototype(UseRegister(instr->function()), | 1757 new LLoadFunctionPrototype(UseRegister(instr->function()), |
| 1746 TempRegister()))); | 1758 TempRegister()))); |
| 1747 } | 1759 } |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1758 ASSERT(instr->representation().IsTagged()); | 1770 ASSERT(instr->representation().IsTagged()); |
| 1759 ASSERT(instr->key()->representation().IsInteger32()); | 1771 ASSERT(instr->key()->representation().IsInteger32()); |
| 1760 LOperand* obj = UseRegisterAtStart(instr->object()); | 1772 LOperand* obj = UseRegisterAtStart(instr->object()); |
| 1761 LOperand* key = UseRegisterAtStart(instr->key()); | 1773 LOperand* key = UseRegisterAtStart(instr->key()); |
| 1762 LLoadKeyedFastElement* result = new LLoadKeyedFastElement(obj, key); | 1774 LLoadKeyedFastElement* result = new LLoadKeyedFastElement(obj, key); |
| 1763 return AssignEnvironment(DefineSameAsFirst(result)); | 1775 return AssignEnvironment(DefineSameAsFirst(result)); |
| 1764 } | 1776 } |
| 1765 | 1777 |
| 1766 | 1778 |
| 1767 LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { | 1779 LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { |
| 1780 LOperand* context = UseFixed(instr->context(), esi); | |
| 1768 LOperand* object = UseFixed(instr->object(), edx); | 1781 LOperand* object = UseFixed(instr->object(), edx); |
| 1769 LOperand* key = UseFixed(instr->key(), eax); | 1782 LOperand* key = UseFixed(instr->key(), eax); |
| 1770 | 1783 |
| 1771 LLoadKeyedGeneric* result = new LLoadKeyedGeneric(object, key); | 1784 LLoadKeyedGeneric* result = new LLoadKeyedGeneric(context, object, key); |
| 1772 return MarkAsCall(DefineFixed(result, eax), instr); | 1785 return MarkAsCall(DefineFixed(result, eax), instr); |
| 1773 } | 1786 } |
| 1774 | 1787 |
| 1775 | 1788 |
| 1776 LInstruction* LChunkBuilder::DoStoreKeyedFastElement( | 1789 LInstruction* LChunkBuilder::DoStoreKeyedFastElement( |
| 1777 HStoreKeyedFastElement* instr) { | 1790 HStoreKeyedFastElement* instr) { |
| 1778 bool needs_write_barrier = instr->NeedsWriteBarrier(); | 1791 bool needs_write_barrier = instr->NeedsWriteBarrier(); |
| 1779 ASSERT(instr->value()->representation().IsTagged()); | 1792 ASSERT(instr->value()->representation().IsTagged()); |
| 1780 ASSERT(instr->object()->representation().IsTagged()); | 1793 ASSERT(instr->object()->representation().IsTagged()); |
| 1781 ASSERT(instr->key()->representation().IsInteger32()); | 1794 ASSERT(instr->key()->representation().IsInteger32()); |
| 1782 | 1795 |
| 1783 LOperand* obj = UseTempRegister(instr->object()); | 1796 LOperand* obj = UseTempRegister(instr->object()); |
| 1784 LOperand* val = needs_write_barrier | 1797 LOperand* val = needs_write_barrier |
| 1785 ? UseTempRegister(instr->value()) | 1798 ? UseTempRegister(instr->value()) |
| 1786 : UseRegisterAtStart(instr->value()); | 1799 : UseRegisterAtStart(instr->value()); |
| 1787 LOperand* key = needs_write_barrier | 1800 LOperand* key = needs_write_barrier |
| 1788 ? UseTempRegister(instr->key()) | 1801 ? UseTempRegister(instr->key()) |
| 1789 : UseRegisterOrConstantAtStart(instr->key()); | 1802 : UseRegisterOrConstantAtStart(instr->key()); |
| 1790 | 1803 |
| 1791 return AssignEnvironment(new LStoreKeyedFastElement(obj, key, val)); | 1804 return AssignEnvironment(new LStoreKeyedFastElement(obj, key, val)); |
| 1792 } | 1805 } |
| 1793 | 1806 |
| 1794 | 1807 |
| 1795 LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { | 1808 LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { |
| 1796 LOperand* obj = UseFixed(instr->object(), edx); | 1809 LOperand* context = UseFixed(instr->context(), esi); |
| 1810 LOperand* object = UseFixed(instr->object(), edx); | |
| 1797 LOperand* key = UseFixed(instr->key(), ecx); | 1811 LOperand* key = UseFixed(instr->key(), ecx); |
| 1798 LOperand* val = UseFixed(instr->value(), eax); | 1812 LOperand* value = UseFixed(instr->value(), eax); |
| 1799 | 1813 |
| 1800 ASSERT(instr->object()->representation().IsTagged()); | 1814 ASSERT(instr->object()->representation().IsTagged()); |
| 1801 ASSERT(instr->key()->representation().IsTagged()); | 1815 ASSERT(instr->key()->representation().IsTagged()); |
| 1802 ASSERT(instr->value()->representation().IsTagged()); | 1816 ASSERT(instr->value()->representation().IsTagged()); |
| 1803 | 1817 |
| 1804 return MarkAsCall(new LStoreKeyedGeneric(obj, key, val), instr); | 1818 LStoreKeyedGeneric* result = |
| 1819 new LStoreKeyedGeneric(context, object, key, value); | |
| 1820 return MarkAsCall(result, instr); | |
| 1805 } | 1821 } |
| 1806 | 1822 |
| 1807 | 1823 |
| 1808 LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { | 1824 LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { |
| 1809 bool needs_write_barrier = instr->NeedsWriteBarrier(); | 1825 bool needs_write_barrier = instr->NeedsWriteBarrier(); |
| 1810 | 1826 |
| 1811 LOperand* obj = needs_write_barrier | 1827 LOperand* obj = needs_write_barrier |
| 1812 ? UseTempRegister(instr->object()) | 1828 ? UseTempRegister(instr->object()) |
| 1813 : UseRegisterAtStart(instr->object()); | 1829 : UseRegisterAtStart(instr->object()); |
| 1814 | 1830 |
| 1815 LOperand* val = needs_write_barrier | 1831 LOperand* val = needs_write_barrier |
| 1816 ? UseTempRegister(instr->value()) | 1832 ? UseTempRegister(instr->value()) |
| 1817 : UseRegister(instr->value()); | 1833 : UseRegister(instr->value()); |
| 1818 | 1834 |
| 1819 // We only need a scratch register if we have a write barrier or we | 1835 // We only need a scratch register if we have a write barrier or we |
| 1820 // have a store into the properties array (not in-object-property). | 1836 // have a store into the properties array (not in-object-property). |
| 1821 LOperand* temp = (!instr->is_in_object() || needs_write_barrier) | 1837 LOperand* temp = (!instr->is_in_object() || needs_write_barrier) |
| 1822 ? TempRegister() | 1838 ? TempRegister() |
| 1823 : NULL; | 1839 : NULL; |
| 1824 | 1840 |
| 1825 return new LStoreNamedField(obj, val, temp); | 1841 return new LStoreNamedField(obj, val, temp); |
| 1826 } | 1842 } |
| 1827 | 1843 |
| 1828 | 1844 |
| 1829 LInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { | 1845 LInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { |
| 1830 LOperand* obj = UseFixed(instr->object(), edx); | 1846 LOperand* context = UseFixed(instr->context(), esi); |
| 1831 LOperand* val = UseFixed(instr->value(), eax); | 1847 LOperand* object = UseFixed(instr->object(), edx); |
| 1848 LOperand* value = UseFixed(instr->value(), eax); | |
| 1832 | 1849 |
| 1833 LStoreNamedGeneric* result = new LStoreNamedGeneric(obj, val); | 1850 LStoreNamedGeneric* result = new LStoreNamedGeneric(context, object, value); |
| 1834 return MarkAsCall(result, instr); | 1851 return MarkAsCall(result, instr); |
| 1835 } | 1852 } |
| 1836 | 1853 |
| 1837 | 1854 |
| 1838 LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { | 1855 LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { |
| 1839 LOperand* string = UseRegister(instr->string()); | 1856 LOperand* string = UseRegister(instr->string()); |
| 1840 LOperand* index = UseRegisterOrConstant(instr->index()); | 1857 LOperand* index = UseRegisterOrConstant(instr->index()); |
| 1841 LStringCharCodeAt* result = new LStringCharCodeAt(string, index); | 1858 LStringCharCodeAt* result = new LStringCharCodeAt(string, index); |
| 1842 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); | 1859 return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); |
| 1843 } | 1860 } |
| 1844 | 1861 |
| 1845 | 1862 |
| 1846 LInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) { | 1863 LInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) { |
| 1847 LOperand* string = UseRegisterAtStart(instr->value()); | 1864 LOperand* string = UseRegisterAtStart(instr->value()); |
| 1848 return DefineAsRegister(new LStringLength(string)); | 1865 return DefineAsRegister(new LStringLength(string)); |
| 1849 } | 1866 } |
| 1850 | 1867 |
| 1851 | 1868 |
| 1852 LInstruction* LChunkBuilder::DoArrayLiteral(HArrayLiteral* instr) { | 1869 LInstruction* LChunkBuilder::DoArrayLiteral(HArrayLiteral* instr) { |
| 1853 return MarkAsCall(DefineFixed(new LArrayLiteral, eax), instr); | 1870 return MarkAsCall(DefineFixed(new LArrayLiteral, eax), instr); |
| 1854 } | 1871 } |
| 1855 | 1872 |
| 1856 | 1873 |
| 1857 LInstruction* LChunkBuilder::DoObjectLiteral(HObjectLiteral* instr) { | 1874 LInstruction* LChunkBuilder::DoObjectLiteral(HObjectLiteral* instr) { |
| 1858 return MarkAsCall(DefineFixed(new LObjectLiteral, eax), instr); | 1875 LOperand* context = UseFixed(instr->context(), esi); |
| 1876 return MarkAsCall(DefineFixed(new LObjectLiteral(context), eax), instr); | |
| 1859 } | 1877 } |
| 1860 | 1878 |
| 1861 | 1879 |
| 1862 LInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { | 1880 LInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { |
| 1863 return MarkAsCall(DefineFixed(new LRegExpLiteral, eax), instr); | 1881 return MarkAsCall(DefineFixed(new LRegExpLiteral, eax), instr); |
| 1864 } | 1882 } |
| 1865 | 1883 |
| 1866 | 1884 |
| 1867 LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { | 1885 LInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { |
| 1868 return MarkAsCall(DefineFixed(new LFunctionLiteral, eax), instr); | 1886 return MarkAsCall(DefineFixed(new LFunctionLiteral, eax), instr); |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1889 } | 1907 } |
| 1890 | 1908 |
| 1891 | 1909 |
| 1892 LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { | 1910 LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { |
| 1893 int spill_index = chunk()->GetNextSpillIndex(false); // Not double-width. | 1911 int spill_index = chunk()->GetNextSpillIndex(false); // Not double-width. |
| 1894 return DefineAsSpilled(new LUnknownOSRValue, spill_index); | 1912 return DefineAsSpilled(new LUnknownOSRValue, spill_index); |
| 1895 } | 1913 } |
| 1896 | 1914 |
| 1897 | 1915 |
| 1898 LInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { | 1916 LInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { |
| 1917 LOperand* context = UseFixed(instr->context(), esi); | |
| 1899 argument_count_ -= instr->argument_count(); | 1918 argument_count_ -= instr->argument_count(); |
| 1900 return MarkAsCall(DefineFixed(new LCallStub, eax), instr); | 1919 LCallStub* result = new LCallStub(context); |
| 1920 return MarkAsCall(DefineFixed(result, eax), instr); | |
| 1901 } | 1921 } |
| 1902 | 1922 |
| 1903 | 1923 |
| 1904 LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { | 1924 LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { |
| 1905 // There are no real uses of the arguments object (we bail out in all other | 1925 // There are no real uses of the arguments object (we bail out in all other |
| 1906 // cases). | 1926 // cases). |
| 1907 return NULL; | 1927 return NULL; |
| 1908 } | 1928 } |
| 1909 | 1929 |
| 1910 | 1930 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1987 LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { | 2007 LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { |
| 1988 HEnvironment* outer = current_block_->last_environment()->outer(); | 2008 HEnvironment* outer = current_block_->last_environment()->outer(); |
| 1989 current_block_->UpdateEnvironment(outer); | 2009 current_block_->UpdateEnvironment(outer); |
| 1990 return NULL; | 2010 return NULL; |
| 1991 } | 2011 } |
| 1992 | 2012 |
| 1993 | 2013 |
| 1994 } } // namespace v8::internal | 2014 } } // namespace v8::internal |
| 1995 | 2015 |
| 1996 #endif // V8_TARGET_ARCH_IA32 | 2016 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |