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

Side by Side Diff: src/x64/lithium-x64.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: Oops, missed a section of commented-out code Created 8 years, 1 month 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
« src/x64/lithium-x64.h ('K') | « src/x64/lithium-x64.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 376 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 387
388 void LStoreNamedGeneric::PrintDataTo(StringStream* stream) { 388 void LStoreNamedGeneric::PrintDataTo(StringStream* stream) {
389 object()->PrintTo(stream); 389 object()->PrintTo(stream);
390 stream->Add("."); 390 stream->Add(".");
391 stream->Add(*String::cast(*name())->ToCString()); 391 stream->Add(*String::cast(*name())->ToCString());
392 stream->Add(" <- "); 392 stream->Add(" <- ");
393 value()->PrintTo(stream); 393 value()->PrintTo(stream);
394 } 394 }
395 395
396 396
397 void LStoreKeyedFastElement::PrintDataTo(StringStream* stream) { 397 void LStoreKeyed::PrintDataTo(StringStream* stream) {
398 object()->PrintTo(stream); 398 object()->PrintTo(stream);
399 stream->Add("["); 399 stream->Add("[");
400 key()->PrintTo(stream); 400 key()->PrintTo(stream);
401 stream->Add("] <- "); 401 stream->Add("] <- ");
402 value()->PrintTo(stream); 402 value()->PrintTo(stream);
403 } 403 }
404 404
405 405
406 void LStoreKeyedFastDoubleElement::PrintDataTo(StringStream* stream) {
407 elements()->PrintTo(stream);
408 stream->Add("[");
409 key()->PrintTo(stream);
410 stream->Add("] <- ");
411 value()->PrintTo(stream);
412 }
413
414
415 void LStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 406 void LStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
416 object()->PrintTo(stream); 407 object()->PrintTo(stream);
417 stream->Add("["); 408 stream->Add("[");
418 key()->PrintTo(stream); 409 key()->PrintTo(stream);
419 stream->Add("] <- "); 410 stream->Add("] <- ");
420 value()->PrintTo(stream); 411 value()->PrintTo(stream);
421 } 412 }
422 413
423 414
424 void LTransitionElementsKind::PrintDataTo(StringStream* stream) { 415 void LTransitionElementsKind::PrintDataTo(StringStream* stream) {
(...skipping 1411 matching lines...) Expand 10 before | Expand all | Expand 10 after
1836 } 1827 }
1837 1828
1838 1829
1839 LInstruction* LChunkBuilder::DoLoadExternalArrayPointer( 1830 LInstruction* LChunkBuilder::DoLoadExternalArrayPointer(
1840 HLoadExternalArrayPointer* instr) { 1831 HLoadExternalArrayPointer* instr) {
1841 LOperand* input = UseRegisterAtStart(instr->value()); 1832 LOperand* input = UseRegisterAtStart(instr->value());
1842 return DefineAsRegister(new(zone()) LLoadExternalArrayPointer(input)); 1833 return DefineAsRegister(new(zone()) LLoadExternalArrayPointer(input));
1843 } 1834 }
1844 1835
1845 1836
1846 LInstruction* LChunkBuilder::DoLoadKeyedFastElement( 1837 LInstruction* LChunkBuilder::DoLoadKeyed(
1847 HLoadKeyedFastElement* instr) { 1838 HLoadKeyed* instr) {
1848 ASSERT(instr->representation().IsTagged());
1849 ASSERT(instr->key()->representation().IsInteger32() || 1839 ASSERT(instr->key()->representation().IsInteger32() ||
1850 instr->key()->representation().IsTagged()); 1840 instr->key()->representation().IsTagged());
1851 LOperand* obj = UseRegisterAtStart(instr->object()); 1841 ElementsKind elements_kind = instr->elements_kind();
1852 bool clobbers_key = instr->key()->representation().IsTagged(); 1842 bool clobbers_key = instr->key()->representation().IsTagged();
1853 LOperand* key = clobbers_key 1843 LOperand* key = clobbers_key
1854 ? UseTempRegister(instr->key()) 1844 ? UseTempRegister(instr->key())
1855 : UseRegisterOrConstantAtStart(instr->key()); 1845 : UseRegisterOrConstantAtStart(instr->key());
1856 LLoadKeyedFastElement* result = 1846 LLoadKeyed* result = NULL;
1857 new(zone()) LLoadKeyedFastElement(obj, key); 1847
1858 if (instr->RequiresHoleCheck()) AssignEnvironment(result); 1848 if (!instr->is_external()) {
1859 return DefineAsRegister(result); 1849 LOperand* obj = UseRegisterAtStart(instr->object());
1850 result = new(zone()) LLoadKeyed(obj, key);
1851 } else {
1852 ASSERT(
1853 (instr->representation().IsInteger32() &&
1854 (elements_kind != EXTERNAL_FLOAT_ELEMENTS) &&
1855 (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) ||
1856 (instr->representation().IsDouble() &&
1857 ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) ||
1858 (elements_kind == EXTERNAL_DOUBLE_ELEMENTS))));
1859 LOperand* external_pointer = UseRegister(instr->object());
1860 result = new(zone()) LLoadKeyed(external_pointer, key);
1861 }
1862
1863 DefineAsRegister(result);
1864 bool can_deoptimize = instr->RequiresHoleCheck() ||
1865 (elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS);
1866 // An unsigned int array load might overflow and cause a deopt, make sure it
1867 // has an environment.
1868 return can_deoptimize ? AssignEnvironment(result) : result;
1860 } 1869 }
1861 1870
1862 1871
1863 LInstruction* LChunkBuilder::DoLoadKeyedFastDoubleElement(
1864 HLoadKeyedFastDoubleElement* instr) {
1865 ASSERT(instr->representation().IsDouble());
1866 ASSERT(instr->key()->representation().IsInteger32() ||
1867 instr->key()->representation().IsTagged());
1868 LOperand* elements = UseRegisterAtStart(instr->elements());
1869 bool clobbers_key = instr->key()->representation().IsTagged();
1870 LOperand* key = clobbers_key
1871 ? UseTempRegister(instr->key())
1872 : UseRegisterOrConstantAtStart(instr->key());
1873 LLoadKeyedFastDoubleElement* result =
1874 new(zone()) LLoadKeyedFastDoubleElement(elements, key);
1875 return AssignEnvironment(DefineAsRegister(result));
1876 }
1877
1878
1879 LInstruction* LChunkBuilder::DoLoadKeyedSpecializedArrayElement(
1880 HLoadKeyedSpecializedArrayElement* instr) {
1881 ElementsKind elements_kind = instr->elements_kind();
1882 ASSERT(
1883 (instr->representation().IsInteger32() &&
1884 (elements_kind != EXTERNAL_FLOAT_ELEMENTS) &&
1885 (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) ||
1886 (instr->representation().IsDouble() &&
1887 ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) ||
1888 (elements_kind == EXTERNAL_DOUBLE_ELEMENTS))));
1889 ASSERT(instr->key()->representation().IsInteger32() ||
1890 instr->key()->representation().IsTagged());
1891 LOperand* external_pointer = UseRegister(instr->external_pointer());
1892 bool clobbers_key = instr->key()->representation().IsTagged();
1893 LOperand* key = clobbers_key
1894 ? UseTempRegister(instr->key())
1895 : UseRegisterOrConstantAtStart(instr->key());
1896 LLoadKeyedSpecializedArrayElement* result =
1897 new(zone()) LLoadKeyedSpecializedArrayElement(external_pointer, key);
1898 LInstruction* load_instr = DefineAsRegister(result);
1899 // An unsigned int array load might overflow and cause a deopt, make sure it
1900 // has an environment.
1901 return (elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) ?
1902 AssignEnvironment(load_instr) : load_instr;
1903 }
1904
1905
1906 LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { 1872 LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) {
1907 LOperand* object = UseFixed(instr->object(), rdx); 1873 LOperand* object = UseFixed(instr->object(), rdx);
1908 LOperand* key = UseFixed(instr->key(), rax); 1874 LOperand* key = UseFixed(instr->key(), rax);
1909 1875
1910 LLoadKeyedGeneric* result = new(zone()) LLoadKeyedGeneric(object, key); 1876 LLoadKeyedGeneric* result = new(zone()) LLoadKeyedGeneric(object, key);
1911 return MarkAsCall(DefineFixed(result, rax), instr); 1877 return MarkAsCall(DefineFixed(result, rax), instr);
1912 } 1878 }
1913 1879
1914 1880
1915 LInstruction* LChunkBuilder::DoStoreKeyedFastElement( 1881 LInstruction* LChunkBuilder::DoStoreKeyed(
1916 HStoreKeyedFastElement* instr) { 1882 HStoreKeyed* instr) {
1883 ElementsKind elements_kind = instr->elements_kind();
1917 bool needs_write_barrier = instr->NeedsWriteBarrier(); 1884 bool needs_write_barrier = instr->NeedsWriteBarrier();
1918 ASSERT(instr->value()->representation().IsTagged()); 1885 bool clobbers_key = instr->key()->representation().IsTagged();
1919 ASSERT(instr->object()->representation().IsTagged()); 1886 LOperand* key = (clobbers_key || needs_write_barrier)
1920 ASSERT(instr->key()->representation().IsInteger32() || 1887 ? UseTempRegister(instr->key())
1921 instr->key()->representation().IsTagged()); 1888 : UseRegisterOrConstantAtStart(instr->key());
1922 1889 bool val_is_temp_register =
1923 LOperand* obj = UseTempRegister(instr->object()); 1890 elements_kind == EXTERNAL_PIXEL_ELEMENTS ||
1924 LOperand* val = needs_write_barrier 1891 elements_kind == EXTERNAL_FLOAT_ELEMENTS;
1892 LOperand* val = (needs_write_barrier || val_is_temp_register)
1925 ? UseTempRegister(instr->value()) 1893 ? UseTempRegister(instr->value())
1926 : UseRegisterAtStart(instr->value()); 1894 : UseRegisterAtStart(instr->value());
1927 bool clobbers_key = needs_write_barrier || 1895 LStoreKeyed* result = NULL;
1928 instr->key()->representation().IsTagged(); 1896
1929 LOperand* key = clobbers_key 1897 if (!instr->is_external()) {
1930 ? UseTempRegister(instr->key()) 1898 ASSERT(instr->object()->representation().IsTagged());
1931 : UseRegisterOrConstantAtStart(instr->key()); 1899
1932 return new(zone()) LStoreKeyedFastElement(obj, key, val); 1900 LOperand* object = NULL;
1901 if (instr->value()->representation().IsDouble()) {
1902 object = UseRegisterAtStart(instr->object());
1903 } else {
1904 ASSERT(instr->value()->representation().IsTagged());
1905 object = UseTempRegister(instr->object());
1906 }
1907
1908 result = new(zone()) LStoreKeyed(object, key, val);
1909 } else {
1910 ASSERT(
1911 (instr->value()->representation().IsInteger32() &&
1912 (elements_kind != EXTERNAL_FLOAT_ELEMENTS) &&
1913 (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) ||
1914 (instr->value()->representation().IsDouble() &&
1915 ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) ||
1916 (elements_kind == EXTERNAL_DOUBLE_ELEMENTS))));
1917 ASSERT(instr->object()->representation().IsExternal());
1918
1919 LOperand* external_pointer = UseRegister(instr->object());
1920 result = new(zone()) LStoreKeyed(external_pointer, key, val);
1921 }
1922
1923 ASSERT(result != NULL);
1924 return result;
1933 } 1925 }
1934 1926
1935 1927
1936 LInstruction* LChunkBuilder::DoStoreKeyedFastDoubleElement(
1937 HStoreKeyedFastDoubleElement* instr) {
1938 ASSERT(instr->value()->representation().IsDouble());
1939 ASSERT(instr->elements()->representation().IsTagged());
1940 ASSERT(instr->key()->representation().IsInteger32() ||
1941 instr->key()->representation().IsTagged());
1942
1943 LOperand* elements = UseRegisterAtStart(instr->elements());
1944 LOperand* val = UseTempRegister(instr->value());
1945 bool clobbers_key = instr->key()->representation().IsTagged();
1946 LOperand* key = clobbers_key
1947 ? UseTempRegister(instr->key())
1948 : UseRegisterOrConstantAtStart(instr->key());
1949 return new(zone()) LStoreKeyedFastDoubleElement(elements, key, val);
1950 }
1951
1952
1953 LInstruction* LChunkBuilder::DoStoreKeyedSpecializedArrayElement(
1954 HStoreKeyedSpecializedArrayElement* instr) {
1955 ElementsKind elements_kind = instr->elements_kind();
1956 ASSERT(
1957 (instr->value()->representation().IsInteger32() &&
1958 (elements_kind != EXTERNAL_FLOAT_ELEMENTS) &&
1959 (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) ||
1960 (instr->value()->representation().IsDouble() &&
1961 ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) ||
1962 (elements_kind == EXTERNAL_DOUBLE_ELEMENTS))));
1963 ASSERT(instr->external_pointer()->representation().IsExternal());
1964 ASSERT(instr->key()->representation().IsInteger32() ||
1965 instr->key()->representation().IsTagged());
1966
1967 LOperand* external_pointer = UseRegister(instr->external_pointer());
1968 bool val_is_temp_register =
1969 elements_kind == EXTERNAL_PIXEL_ELEMENTS ||
1970 elements_kind == EXTERNAL_FLOAT_ELEMENTS;
1971 LOperand* val = val_is_temp_register
1972 ? UseTempRegister(instr->value())
1973 : UseRegister(instr->value());
1974 bool clobbers_key = instr->key()->representation().IsTagged();
1975 LOperand* key = clobbers_key
1976 ? UseTempRegister(instr->key())
1977 : UseRegisterOrConstantAtStart(instr->key());
1978 return new(zone()) LStoreKeyedSpecializedArrayElement(external_pointer,
1979 key, val);
1980 }
1981
1982
1983 LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { 1928 LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
1984 LOperand* object = UseFixed(instr->object(), rdx); 1929 LOperand* object = UseFixed(instr->object(), rdx);
1985 LOperand* key = UseFixed(instr->key(), rcx); 1930 LOperand* key = UseFixed(instr->key(), rcx);
1986 LOperand* value = UseFixed(instr->value(), rax); 1931 LOperand* value = UseFixed(instr->value(), rax);
1987 1932
1988 ASSERT(instr->object()->representation().IsTagged()); 1933 ASSERT(instr->object()->representation().IsTagged());
1989 ASSERT(instr->key()->representation().IsTagged()); 1934 ASSERT(instr->key()->representation().IsTagged());
1990 ASSERT(instr->value()->representation().IsTagged()); 1935 ASSERT(instr->value()->representation().IsTagged());
1991 1936
1992 LStoreKeyedGeneric* result = 1937 LStoreKeyedGeneric* result =
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
2310 LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 2255 LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
2311 LOperand* object = UseRegister(instr->object()); 2256 LOperand* object = UseRegister(instr->object());
2312 LOperand* index = UseTempRegister(instr->index()); 2257 LOperand* index = UseTempRegister(instr->index());
2313 return DefineSameAsFirst(new(zone()) LLoadFieldByIndex(object, index)); 2258 return DefineSameAsFirst(new(zone()) LLoadFieldByIndex(object, index));
2314 } 2259 }
2315 2260
2316 2261
2317 } } // namespace v8::internal 2262 } } // namespace v8::internal
2318 2263
2319 #endif // V8_TARGET_ARCH_X64 2264 #endif // V8_TARGET_ARCH_X64
OLDNEW
« src/x64/lithium-x64.h ('K') | « src/x64/lithium-x64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698