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

Side by Side Diff: src/arm/assembler-arm.cc

Issue 6311010: ARM: Port new version of ParallelMove's GapResolver to ARM. Add MemOperand s... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 9 years, 11 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 (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions 5 // modification, are permitted provided that the following conditions
6 // are met: 6 // are met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 1829 matching lines...) Expand 10 before | Expand all | Expand 10 after
1840 // Ddst = MEM(Rbase + offset). 1840 // Ddst = MEM(Rbase + offset).
1841 // Instruction details available in ARM DDI 0406A, A8-628. 1841 // Instruction details available in ARM DDI 0406A, A8-628.
1842 // cond(31-28) | 1101(27-24)| U001(23-20) | Rbase(19-16) | 1842 // cond(31-28) | 1101(27-24)| U001(23-20) | Rbase(19-16) |
1843 // Vdst(15-12) | 1011(11-8) | offset 1843 // Vdst(15-12) | 1011(11-8) | offset
1844 ASSERT(CpuFeatures::IsEnabled(VFP3)); 1844 ASSERT(CpuFeatures::IsEnabled(VFP3));
1845 int u = 1; 1845 int u = 1;
1846 if (offset < 0) { 1846 if (offset < 0) {
1847 offset = -offset; 1847 offset = -offset;
1848 u = 0; 1848 u = 0;
1849 } 1849 }
1850 ASSERT(offset % 4 == 0); 1850
1851 ASSERT((offset / 4) < 256);
1852 ASSERT(offset >= 0); 1851 ASSERT(offset >= 0);
1853 emit(cond | u*B23 | 0xD1*B20 | base.code()*B16 | dst.code()*B12 | 1852 if ((offset % 4) == 0 && (offset / 4) < 256) {
1854 0xB*B8 | ((offset / 4) & 255)); 1853 emit(cond | u*B23 | 0xD1*B20 | base.code()*B16 | dst.code()*B12 |
1854 0xB*B8 | ((offset / 4) & 255));
1855 } else {
1856 // Larger offsets must be handled by computing the correct address
1857 // in the ip register.
1858 ASSERT(!base.is(ip));
1859 mov(ip, Operand(offset));
1860 if (u == 1) {
1861 add(ip, ip, base);
Søren Thygesen Gjesse 2011/01/25 08:33:20 add(ip, base, ip) to have same order as the sub be
William Hesse 2011/01/25 17:25:13 Done.
1862 } else {
1863 sub(ip, base, ip);
1864 }
1865 emit(cond | 0xD1*B20 | ip.code()*B16 | dst.code()*B12 | 0xB*B8);
1866 }
1867 }
1868
1869
1870 void Assembler::vldr(const DwVfpRegister dst,
1871 const MemOperand& operand,
1872 const Condition cond) {
1873 ASSERT(!operand.rm().is_valid());
Søren Thygesen Gjesse 2011/01/25 08:33:20 Assert for the supported addressing mode.
William Hesse 2011/01/25 17:25:13 Done.
1874 vldr(dst, operand.rn(), operand.offset(), cond);
1855 } 1875 }
1856 1876
1857 1877
1858 void Assembler::vldr(const SwVfpRegister dst, 1878 void Assembler::vldr(const SwVfpRegister dst,
1859 const Register base, 1879 const Register base,
1860 int offset, 1880 int offset,
1861 const Condition cond) { 1881 const Condition cond) {
1862 // Sdst = MEM(Rbase + offset). 1882 // Sdst = MEM(Rbase + offset).
1863 // Instruction details available in ARM DDI 0406A, A8-628. 1883 // Instruction details available in ARM DDI 0406A, A8-628.
1864 // cond(31-28) | 1101(27-24)| U001(23-20) | Rbase(19-16) | 1884 // cond(31-28) | 1101(27-24)| U001(23-20) | Rbase(19-16) |
1865 // Vdst(15-12) | 1010(11-8) | offset 1885 // Vdst(15-12) | 1010(11-8) | offset
1866 ASSERT(CpuFeatures::IsEnabled(VFP3)); 1886 ASSERT(CpuFeatures::IsEnabled(VFP3));
1867 int u = 1; 1887 int u = 1;
1868 if (offset < 0) { 1888 if (offset < 0) {
1869 offset = -offset; 1889 offset = -offset;
1870 u = 0; 1890 u = 0;
1871 } 1891 }
1872 ASSERT(offset % 4 == 0);
1873 ASSERT((offset / 4) < 256);
1874 ASSERT(offset >= 0);
1875 int sd, d; 1892 int sd, d;
1876 dst.split_code(&sd, &d); 1893 dst.split_code(&sd, &d);
1894 ASSERT(offset >= 0);
1895
1896 if ((offset % 4) == 0 && (offset / 4) < 256) {
1877 emit(cond | u*B23 | d*B22 | 0xD1*B20 | base.code()*B16 | sd*B12 | 1897 emit(cond | u*B23 | d*B22 | 0xD1*B20 | base.code()*B16 | sd*B12 |
1878 0xA*B8 | ((offset / 4) & 255)); 1898 0xA*B8 | ((offset / 4) & 255));
1899 } else {
1900 // Larger offsets must be handled by computing the correct address
1901 // in the ip register.
1902 ASSERT(!base.is(ip));
1903 mov(ip, Operand(offset));
1904 if (u == 1) {
1905 add(ip, ip, base);
1906 } else {
1907 sub(ip, base, ip);
1908 }
1909 emit(cond | d*B22 | 0xD1*B20 | ip.code()*B16 | sd*B12 | 0xA*B8);
1910 }
1911 }
1912
1913
1914 void Assembler::vldr(const SwVfpRegister dst,
1915 const MemOperand& operand,
1916 const Condition cond) {
1917 ASSERT(!operand.rm().is_valid());
1918 vldr(dst, operand.rn(), operand.offset(), cond);
1879 } 1919 }
1880 1920
1881 1921
1882 void Assembler::vstr(const DwVfpRegister src, 1922 void Assembler::vstr(const DwVfpRegister src,
1883 const Register base, 1923 const Register base,
1884 int offset, 1924 int offset,
1885 const Condition cond) { 1925 const Condition cond) {
1886 // MEM(Rbase + offset) = Dsrc. 1926 // MEM(Rbase + offset) = Dsrc.
1887 // Instruction details available in ARM DDI 0406A, A8-786. 1927 // Instruction details available in ARM DDI 0406A, A8-786.
1888 // cond(31-28) | 1101(27-24)| U000(23-20) | | Rbase(19-16) | 1928 // cond(31-28) | 1101(27-24)| U000(23-20) | | Rbase(19-16) |
1889 // Vsrc(15-12) | 1011(11-8) | (offset/4) 1929 // Vsrc(15-12) | 1011(11-8) | (offset/4)
1890 ASSERT(CpuFeatures::IsEnabled(VFP3)); 1930 ASSERT(CpuFeatures::IsEnabled(VFP3));
1891 int u = 1; 1931 int u = 1;
1892 if (offset < 0) { 1932 if (offset < 0) {
1893 offset = -offset; 1933 offset = -offset;
1894 u = 0; 1934 u = 0;
1895 } 1935 }
1896 ASSERT(offset % 4 == 0);
1897 ASSERT((offset / 4) < 256);
1898 ASSERT(offset >= 0); 1936 ASSERT(offset >= 0);
1899 emit(cond | u*B23 | 0xD0*B20 | base.code()*B16 | src.code()*B12 | 1937 if ((offset % 4) == 0 && (offset / 4) < 256) {
1900 0xB*B8 | ((offset / 4) & 255)); 1938 emit(cond | u*B23 | 0xD0*B20 | base.code()*B16 | src.code()*B12 |
1939 0xB*B8 | ((offset / 4) & 255));
1940 } else {
1941 // Larger offsets must be handled by computing the correct address
1942 // in the ip register.
1943 ASSERT(!base.is(ip));
1944 mov(ip, Operand(offset));
1945 if (u == 1) {
1946 add(ip, ip, base);
1947 } else {
1948 sub(ip, base, ip);
1949 }
1950 emit(cond | 0xD0*B20 | ip.code()*B16 | src.code()*B12 | 0xB*B8);
1951 }
1952 }
1953
1954
1955 void Assembler::vstr(const DwVfpRegister src,
1956 const MemOperand& operand,
1957 const Condition cond) {
1958 ASSERT(!operand.rm().is_valid());
Søren Thygesen Gjesse 2011/01/25 08:33:20 Assert for the supported addressing mode.
William Hesse 2011/01/25 17:25:13 Done.
1959 vldr(src, operand.rn(), operand.offset(), cond);
1901 } 1960 }
1902 1961
1903 1962
1904 void Assembler::vstr(const SwVfpRegister src, 1963 void Assembler::vstr(const SwVfpRegister src,
1905 const Register base, 1964 const Register base,
1906 int offset, 1965 int offset,
1907 const Condition cond) { 1966 const Condition cond) {
1908 // MEM(Rbase + offset) = SSrc. 1967 // MEM(Rbase + offset) = SSrc.
1909 // Instruction details available in ARM DDI 0406A, A8-786. 1968 // Instruction details available in ARM DDI 0406A, A8-786.
1910 // cond(31-28) | 1101(27-24)| U000(23-20) | Rbase(19-16) | 1969 // cond(31-28) | 1101(27-24)| U000(23-20) | Rbase(19-16) |
1911 // Vdst(15-12) | 1010(11-8) | (offset/4) 1970 // Vdst(15-12) | 1010(11-8) | (offset/4)
1912 ASSERT(CpuFeatures::IsEnabled(VFP3)); 1971 ASSERT(CpuFeatures::IsEnabled(VFP3));
1913 int u = 1; 1972 int u = 1;
1914 if (offset < 0) { 1973 if (offset < 0) {
1915 offset = -offset; 1974 offset = -offset;
1916 u = 0; 1975 u = 0;
1917 } 1976 }
1918 ASSERT(offset % 4 == 0);
1919 ASSERT((offset / 4) < 256);
1920 ASSERT(offset >= 0);
1921 int sd, d; 1977 int sd, d;
1922 src.split_code(&sd, &d); 1978 src.split_code(&sd, &d);
1923 emit(cond | u*B23 | d*B22 | 0xD0*B20 | base.code()*B16 | sd*B12 | 1979 ASSERT(offset >= 0);
1924 0xA*B8 | ((offset / 4) & 255)); 1980 if ((offset % 4) == 0 && (offset / 4) < 256) {
1981 emit(cond | u*B23 | d*B22 | 0xD0*B20 | base.code()*B16 | sd*B12 |
1982 0xA*B8 | ((offset / 4) & 255));
1983 } else {
1984 // Larger offsets must be handled by computing the correct address
1985 // in the ip register.
1986 ASSERT(!base.is(ip));
1987 mov(ip, Operand(offset));
1988 if (u == 1) {
1989 add(ip, ip, base);
1990 } else {
1991 sub(ip, base, ip);
1992 }
1993 emit(cond | d*B22 | 0xD0*B20 | ip.code()*B16 | sd*B12 | 0xA*B8);
1994 }
1995 }
1996
1997
1998 void Assembler::vstr(const SwVfpRegister src,
1999 const MemOperand& operand,
2000 const Condition cond) {
2001 ASSERT(!operand.rm().is_valid());
2002 vldr(src, operand.rn(), operand.offset(), cond);
1925 } 2003 }
1926 2004
1927 2005
1928 static void DoubleAsTwoUInt32(double d, uint32_t* lo, uint32_t* hi) { 2006 static void DoubleAsTwoUInt32(double d, uint32_t* lo, uint32_t* hi) {
1929 uint64_t i; 2007 uint64_t i;
1930 memcpy(&i, &d, 8); 2008 memcpy(&i, &d, 8);
1931 2009
1932 *lo = i & 0xffffffff; 2010 *lo = i & 0xffffffff;
1933 *hi = i >> 32; 2011 *hi = i >> 32;
1934 } 2012 }
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after
2660 2738
2661 // Since a constant pool was just emitted, move the check offset forward by 2739 // Since a constant pool was just emitted, move the check offset forward by
2662 // the standard interval. 2740 // the standard interval.
2663 next_buffer_check_ = pc_offset() + kCheckConstInterval; 2741 next_buffer_check_ = pc_offset() + kCheckConstInterval;
2664 } 2742 }
2665 2743
2666 2744
2667 } } // namespace v8::internal 2745 } } // namespace v8::internal
2668 2746
2669 #endif // V8_TARGET_ARCH_ARM 2747 #endif // V8_TARGET_ARCH_ARM
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698