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

Side by Side Diff: src/mips/lithium-mips.cc

Issue 11238016: Consolidated all the key store/load classes in the Hydrogen and Lithium (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fixed the 2 failing mjsunit tests Created 8 years, 2 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 365
366 void LStoreNamedGeneric::PrintDataTo(StringStream* stream) { 366 void LStoreNamedGeneric::PrintDataTo(StringStream* stream) {
367 object()->PrintTo(stream); 367 object()->PrintTo(stream);
368 stream->Add("."); 368 stream->Add(".");
369 stream->Add(*String::cast(*name())->ToCString()); 369 stream->Add(*String::cast(*name())->ToCString());
370 stream->Add(" <- "); 370 stream->Add(" <- ");
371 value()->PrintTo(stream); 371 value()->PrintTo(stream);
372 } 372 }
373 373
374 374
375 void LStoreKeyedFastElement::PrintDataTo(StringStream* stream) { 375 void LStoreKeyed::PrintDataTo(StringStream* stream) {
376 object()->PrintTo(stream); 376 object()->PrintTo(stream);
377 stream->Add("["); 377 stream->Add("[");
378 key()->PrintTo(stream); 378 key()->PrintTo(stream);
379 stream->Add("] <- "); 379 stream->Add("] <- ");
380 value()->PrintTo(stream); 380 value()->PrintTo(stream);
381 } 381 }
382 382
383 383
384 void LStoreKeyedFastDoubleElement::PrintDataTo(StringStream* stream) {
385 elements()->PrintTo(stream);
386 stream->Add("[");
387 key()->PrintTo(stream);
388 stream->Add("] <- ");
389 value()->PrintTo(stream);
390 }
391
392
393 void LStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
394 object()->PrintTo(stream);
395 stream->Add("[");
396 key()->PrintTo(stream);
397 stream->Add("] <- ");
398 value()->PrintTo(stream);
399 }
400
401
402 void LTransitionElementsKind::PrintDataTo(StringStream* stream) {
403 object()->PrintTo(stream);
404 stream->Add(" %p -> %p", *original_map(), *transitioned_map());
405 }
406
407
408 int LPlatformChunk::GetNextSpillIndex(bool is_double) { 384 int LPlatformChunk::GetNextSpillIndex(bool is_double) {
409 // Skip a slot if for a double-width slot. 385 // Skip a slot if for a double-width slot.
410 if (is_double) spill_slot_count_++; 386 if (is_double) spill_slot_count_++;
411 return spill_slot_count_++; 387 return spill_slot_count_++;
412 } 388 }
413 389
414 390
415 LOperand* LPlatformChunk::GetNextSpillSlot(bool is_double) { 391 LOperand* LPlatformChunk::GetNextSpillSlot(bool is_double) {
416 int index = GetNextSpillIndex(is_double); 392 int index = GetNextSpillIndex(is_double);
417 if (is_double) { 393 if (is_double) {
(...skipping 1375 matching lines...) Expand 10 before | Expand all | Expand 10 after
1793 } 1769 }
1794 1770
1795 1771
1796 LInstruction* LChunkBuilder::DoLoadExternalArrayPointer( 1772 LInstruction* LChunkBuilder::DoLoadExternalArrayPointer(
1797 HLoadExternalArrayPointer* instr) { 1773 HLoadExternalArrayPointer* instr) {
1798 LOperand* input = UseRegisterAtStart(instr->value()); 1774 LOperand* input = UseRegisterAtStart(instr->value());
1799 return DefineAsRegister(new(zone()) LLoadExternalArrayPointer(input)); 1775 return DefineAsRegister(new(zone()) LLoadExternalArrayPointer(input));
1800 } 1776 }
1801 1777
1802 1778
1803 LInstruction* LChunkBuilder::DoLoadKeyedFastElement( 1779 LInstruction* LChunkBuilder::DoLoadKeyed(
1804 HLoadKeyedFastElement* instr) { 1780 HLoadKeyed* instr) {
1805 ASSERT(instr->representation().IsTagged());
1806 ASSERT(instr->key()->representation().IsInteger32() || 1781 ASSERT(instr->key()->representation().IsInteger32() ||
1807 instr->key()->representation().IsTagged()); 1782 instr->key()->representation().IsTagged());
1808 LOperand* obj = UseRegisterAtStart(instr->object());
1809 LOperand* key = UseRegisterOrConstantAtStart(instr->key());
1810 LLoadKeyedFastElement* result = new(zone()) LLoadKeyedFastElement(obj, key);
1811 if (instr->RequiresHoleCheck()) AssignEnvironment(result);
1812 return DefineAsRegister(result);
1813 }
1814 1783
1784 if (!instr->is_external()) {
1785 LOperand* key = UseRegisterOrConstantAtStart(instr->key());
1786 LOperand* obj = NULL;
1787 if (instr->representation.IsDouble()) {
1788 obj = UseTempRegister(instr->object());
1789 } else {
1790 ASSERT(instr->representation().IsTagged());
1791 obj = UseRegisterAtStart(instr->object());
1792 }
1815 1793
1816 LInstruction* LChunkBuilder::DoLoadKeyedFastDoubleElement( 1794 LLoadKeyed* result = new(zone()) LLoadKeyed(obj, key);
1817 HLoadKeyedFastDoubleElement* instr) { 1795 if (instr->RequiresHoleCheck()) AssignEnvironment(result);
1818 ASSERT(instr->representation().IsDouble()); 1796 return DefineAsRegister(result);
1819 ASSERT(instr->key()->representation().IsInteger32() || 1797 }
1820 instr->key()->representation().IsTagged());
1821 LOperand* elements = UseTempRegister(instr->elements());
1822 LOperand* key = UseRegisterOrConstantAtStart(instr->key());
1823 LLoadKeyedFastDoubleElement* result =
1824 new(zone()) LLoadKeyedFastDoubleElement(elements, key);
1825 return AssignEnvironment(DefineAsRegister(result));
1826 }
1827 1798
1828
1829 LInstruction* LChunkBuilder::DoLoadKeyedSpecializedArrayElement(
1830 HLoadKeyedSpecializedArrayElement* instr) {
1831 ElementsKind elements_kind = instr->elements_kind(); 1799 ElementsKind elements_kind = instr->elements_kind();
1832 ASSERT( 1800 ASSERT(
1833 (instr->representation().IsInteger32() && 1801 (instr->representation().IsInteger32() &&
1834 (elements_kind != EXTERNAL_FLOAT_ELEMENTS) && 1802 (elements_kind != EXTERNAL_FLOAT_ELEMENTS) &&
1835 (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) || 1803 (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) ||
1836 (instr->representation().IsDouble() && 1804 (instr->representation().IsDouble() &&
1837 ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) || 1805 ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) ||
1838 (elements_kind == EXTERNAL_DOUBLE_ELEMENTS)))); 1806 (elements_kind == EXTERNAL_DOUBLE_ELEMENTS))));
1839 ASSERT(instr->key()->representation().IsInteger32() ||
1840 instr->key()->representation().IsTagged());
1841 LOperand* external_pointer = UseRegister(instr->external_pointer()); 1807 LOperand* external_pointer = UseRegister(instr->external_pointer());
1842 LOperand* key = UseRegisterOrConstant(instr->key()); 1808 LOperand* key = UseRegisterOrConstant(instr->key());
1843 LLoadKeyedSpecializedArrayElement* result = 1809 LLoadKeyed* result = new(zone()) LLoadKeyed(external_pointer, key);
1844 new(zone()) LLoadKeyedSpecializedArrayElement(external_pointer, key);
1845 LInstruction* load_instr = DefineAsRegister(result); 1810 LInstruction* load_instr = DefineAsRegister(result);
1846 // An unsigned int array load might overflow and cause a deopt, make sure it 1811 // An unsigned int array load might overflow and cause a deopt, make sure it
1847 // has an environment. 1812 // has an environment.
1848 return (elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) ? 1813 return (elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) ?
1849 AssignEnvironment(load_instr) : load_instr; 1814 AssignEnvironment(load_instr) : load_instr;
1850 } 1815 }
1851 1816
1852 1817
1853 LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { 1818 LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) {
1854 LOperand* object = UseFixed(instr->object(), a1); 1819 LOperand* object = UseFixed(instr->object(), a1);
1855 LOperand* key = UseFixed(instr->key(), a0); 1820 LOperand* key = UseFixed(instr->key(), a0);
1856 1821
1857 LInstruction* result = 1822 LInstruction* result =
1858 DefineFixed(new(zone()) LLoadKeyedGeneric(object, key), v0); 1823 DefineFixed(new(zone()) LLoadKeyedGeneric(object, key), v0);
1859 return MarkAsCall(result, instr); 1824 return MarkAsCall(result, instr);
1860 } 1825 }
1861 1826
1862 1827
1863 LInstruction* LChunkBuilder::DoStoreKeyedFastElement( 1828 LInstruction* LChunkBuilder::DoStoreKeyed(
1864 HStoreKeyedFastElement* instr) { 1829 HStoreKeyed* instr) {
1865 bool needs_write_barrier = instr->NeedsWriteBarrier();
1866 ASSERT(instr->value()->representation().IsTagged());
1867 ASSERT(instr->object()->representation().IsTagged());
1868 ASSERT(instr->key()->representation().IsInteger32() || 1830 ASSERT(instr->key()->representation().IsInteger32() ||
1869 instr->key()->representation().IsTagged()); 1831 instr->key()->representation().IsTagged());
1870 1832
1871 LOperand* obj = UseTempRegister(instr->object()); 1833 if (!instr->is_external()) {
1872 LOperand* val = needs_write_barrier 1834 ASSERT(instr->object()->representation().IsTagged());
1873 ? UseTempRegister(instr->value()) 1835
1874 : UseRegisterAtStart(instr->value()); 1836 if (instr->value()->representation().IsDouble()) {
1875 LOperand* key = needs_write_barrier 1837 LOperand* object = UseRegisterAtStart(instr->object());
1876 ? UseTempRegister(instr->key()) 1838 LOperand* val = UseTempRegister(instr->value());
1877 : UseRegisterOrConstantAtStart(instr->key()); 1839 LOperand* key = UseRegisterOrConstantAtStart(instr->key());
1878 return new(zone()) LStoreKeyedFastElement(obj, key, val); 1840
1841 return new(zone()) LStoreKeyed(object, key, val);
1842 } else {
1843 bool needs_write_barrier = instr->NeedsWriteBarrier();
1844 ASSERT(instr->value()->representation().IsTagged());
1845
1846 LOperand* obj = UseTempRegister(instr->object());
1847 LOperand* val = needs_write_barrier
1848 ? UseTempRegister(instr->value())
1849 : UseRegisterAtStart(instr->value());
1850 LOperand* key = needs_write_barrier
1851 ? UseTempRegister(instr->key())
1852 : UseRegisterOrConstantAtStart(instr->key());
1853 return new(zone()) LStoreKeyed(obj, key, val);
1854 }
1855 } else {
1856 ElementsKind elements_kind = instr->elements_kind();
1857 ASSERT(
1858 (instr->value()->representation().IsInteger32() &&
1859 (elements_kind != EXTERNAL_FLOAT_ELEMENTS) &&
1860 (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) ||
1861 (instr->value()->representation().IsDouble() &&
1862 ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) ||
1863 (elements_kind == EXTERNAL_DOUBLE_ELEMENTS))));
1864 ASSERT(instr->external_pointer()->representation().IsExternal());
1865
1866 LOperand* external_pointer = UseRegister(instr->external_pointer());
1867 bool val_is_temp_register =
1868 elements_kind == EXTERNAL_PIXEL_ELEMENTS ||
1869 elements_kind == EXTERNAL_FLOAT_ELEMENTS;
1870 LOperand* val = val_is_temp_register
1871 ? UseTempRegister(instr->value())
1872 : UseRegister(instr->value());
1873 LOperand* key = UseRegisterOrConstant(instr->key());
1874
1875 return new(zone()) LStoreKeyed(external_pointer, key, val);
1876 }
1879 } 1877 }
1880 1878
1881 1879
1882 LInstruction* LChunkBuilder::DoStoreKeyedFastDoubleElement(
1883 HStoreKeyedFastDoubleElement* instr) {
1884 ASSERT(instr->value()->representation().IsDouble());
1885 ASSERT(instr->elements()->representation().IsTagged());
1886 ASSERT(instr->key()->representation().IsInteger32() ||
1887 instr->key()->representation().IsTagged());
1888
1889 LOperand* elements = UseRegisterAtStart(instr->elements());
1890 LOperand* val = UseTempRegister(instr->value());
1891 LOperand* key = UseRegisterOrConstantAtStart(instr->key());
1892
1893 return new(zone()) LStoreKeyedFastDoubleElement(elements, key, val);
1894 }
1895
1896
1897 LInstruction* LChunkBuilder::DoStoreKeyedSpecializedArrayElement(
1898 HStoreKeyedSpecializedArrayElement* instr) {
1899 ElementsKind elements_kind = instr->elements_kind();
1900 ASSERT(
1901 (instr->value()->representation().IsInteger32() &&
1902 (elements_kind != EXTERNAL_FLOAT_ELEMENTS) &&
1903 (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) ||
1904 (instr->value()->representation().IsDouble() &&
1905 ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) ||
1906 (elements_kind == EXTERNAL_DOUBLE_ELEMENTS))));
1907 ASSERT(instr->external_pointer()->representation().IsExternal());
1908 ASSERT(instr->key()->representation().IsInteger32() ||
1909 instr->key()->representation().IsTagged());
1910
1911 LOperand* external_pointer = UseRegister(instr->external_pointer());
1912 bool val_is_temp_register =
1913 elements_kind == EXTERNAL_PIXEL_ELEMENTS ||
1914 elements_kind == EXTERNAL_FLOAT_ELEMENTS;
1915 LOperand* val = val_is_temp_register
1916 ? UseTempRegister(instr->value())
1917 : UseRegister(instr->value());
1918 LOperand* key = UseRegisterOrConstant(instr->key());
1919
1920 return new(zone()) LStoreKeyedSpecializedArrayElement(external_pointer,
1921 key,
1922 val);
1923 }
1924
1925
1926 LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { 1880 LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
1927 LOperand* obj = UseFixed(instr->object(), a2); 1881 LOperand* obj = UseFixed(instr->object(), a2);
1928 LOperand* key = UseFixed(instr->key(), a1); 1882 LOperand* key = UseFixed(instr->key(), a1);
1929 LOperand* val = UseFixed(instr->value(), a0); 1883 LOperand* val = UseFixed(instr->value(), a0);
1930 1884
1931 ASSERT(instr->object()->representation().IsTagged()); 1885 ASSERT(instr->object()->representation().IsTagged());
1932 ASSERT(instr->key()->representation().IsTagged()); 1886 ASSERT(instr->key()->representation().IsTagged());
1933 ASSERT(instr->value()->representation().IsTagged()); 1887 ASSERT(instr->value()->representation().IsTagged());
1934 1888
1935 return MarkAsCall(new(zone()) LStoreKeyedGeneric(obj, key, val), instr); 1889 return MarkAsCall(new(zone()) LStoreKeyedGeneric(obj, key, val), instr);
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
2246 2200
2247 2201
2248 LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 2202 LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
2249 LOperand* object = UseRegister(instr->object()); 2203 LOperand* object = UseRegister(instr->object());
2250 LOperand* index = UseRegister(instr->index()); 2204 LOperand* index = UseRegister(instr->index());
2251 return DefineAsRegister(new(zone()) LLoadFieldByIndex(object, index)); 2205 return DefineAsRegister(new(zone()) LLoadFieldByIndex(object, index));
2252 } 2206 }
2253 2207
2254 2208
2255 } } // namespace v8::internal 2209 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698