| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
| 6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
| 10 #include "vm/heap.h" | 10 #include "vm/heap.h" |
| (...skipping 1809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1820 | 1820 |
| 1821 void Assembler::addl(Register dst, Register src) { | 1821 void Assembler::addl(Register dst, Register src) { |
| 1822 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1822 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1823 Operand operand(src); | 1823 Operand operand(src); |
| 1824 EmitOperandREX(dst, operand, REX_NONE); | 1824 EmitOperandREX(dst, operand, REX_NONE); |
| 1825 EmitUint8(0x03); | 1825 EmitUint8(0x03); |
| 1826 EmitOperand(dst & 7, operand); | 1826 EmitOperand(dst & 7, operand); |
| 1827 } | 1827 } |
| 1828 | 1828 |
| 1829 | 1829 |
| 1830 void Assembler::addl(Register dst, const Address& address) { |
| 1831 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1832 EmitOperandREX(dst, address, REX_NONE); |
| 1833 EmitUint8(0x03); |
| 1834 EmitOperand(dst & 7, address); |
| 1835 } |
| 1836 |
| 1837 |
| 1838 void Assembler::addl(const Address& address, Register src) { |
| 1839 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1840 EmitOperandREX(src, address, REX_NONE); |
| 1841 EmitUint8(0x01); |
| 1842 EmitOperand(src & 7, address); |
| 1843 } |
| 1844 |
| 1845 |
| 1846 void Assembler::adcl(Register dst, Register src) { |
| 1847 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1848 Operand operand(src); |
| 1849 EmitOperandREX(dst, operand, REX_NONE); |
| 1850 EmitUint8(0x13); |
| 1851 EmitOperand(dst & 7, operand); |
| 1852 } |
| 1853 |
| 1854 |
| 1855 void Assembler::adcl(Register dst, const Immediate& imm) { |
| 1856 ASSERT(imm.is_int32()); |
| 1857 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1858 EmitRegisterREX(dst, REX_NONE); |
| 1859 EmitComplex(2, Operand(dst), imm); |
| 1860 } |
| 1861 |
| 1862 |
| 1863 void Assembler::adcl(Register dst, const Address& address) { |
| 1864 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1865 EmitOperandREX(dst, address, REX_NONE); |
| 1866 EmitUint8(0x13); |
| 1867 EmitOperand(dst & 7, address); |
| 1868 } |
| 1869 |
| 1870 |
| 1830 void Assembler::addq(Register dst, Register src) { | 1871 void Assembler::addq(Register dst, Register src) { |
| 1831 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1872 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1832 Operand operand(src); | 1873 Operand operand(src); |
| 1833 EmitOperandREX(dst, operand, REX_W); | 1874 EmitOperandREX(dst, operand, REX_W); |
| 1834 EmitUint8(0x03); | 1875 EmitUint8(0x03); |
| 1835 EmitOperand(dst & 7, operand); | 1876 EmitOperand(dst & 7, operand); |
| 1836 } | 1877 } |
| 1837 | 1878 |
| 1838 | 1879 |
| 1839 void Assembler::addq(Register dst, const Address& address) { | 1880 void Assembler::addq(Register dst, const Address& address) { |
| 1840 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1881 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1841 EmitOperandREX(dst, address, REX_W); | 1882 EmitOperandREX(dst, address, REX_W); |
| 1842 EmitUint8(0x03); | 1883 EmitUint8(0x03); |
| 1843 EmitOperand(dst & 7, address); | 1884 EmitOperand(dst & 7, address); |
| 1844 } | 1885 } |
| 1845 | 1886 |
| 1846 | 1887 |
| 1847 void Assembler::addl(const Address& address, const Immediate& imm) { | 1888 void Assembler::addq(Register dst, const Immediate& imm) { |
| 1848 UNIMPLEMENTED(); | |
| 1849 } | |
| 1850 | |
| 1851 | |
| 1852 void Assembler::addq(Register reg, const Immediate& imm) { | |
| 1853 if (imm.is_int32()) { | 1889 if (imm.is_int32()) { |
| 1854 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1890 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1855 EmitRegisterREX(reg, REX_W); | 1891 EmitRegisterREX(dst, REX_W); |
| 1856 EmitComplex(0, Operand(reg), imm); | 1892 EmitComplex(0, Operand(dst), imm); |
| 1857 } else { | 1893 } else { |
| 1858 movq(TMP, imm); | 1894 movq(TMP, imm); |
| 1859 addq(reg, TMP); | 1895 addq(dst, TMP); |
| 1860 } | 1896 } |
| 1861 } | 1897 } |
| 1862 | 1898 |
| 1863 | 1899 |
| 1864 void Assembler::addq(const Address& address, const Immediate& imm) { | 1900 void Assembler::addq(const Address& address, const Immediate& imm) { |
| 1865 if (imm.is_int32()) { | 1901 if (imm.is_int32()) { |
| 1866 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1902 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1867 EmitOperandREX(0, address, REX_W); | 1903 EmitOperandREX(0, address, REX_W); |
| 1868 EmitComplex(0, Operand(address), imm); | 1904 EmitComplex(0, Operand(address), imm); |
| 1869 } else { | 1905 } else { |
| 1870 movq(TMP, imm); | 1906 movq(TMP, imm); |
| 1871 addq(address, TMP); | 1907 addq(address, TMP); |
| 1872 } | 1908 } |
| 1873 } | 1909 } |
| 1874 | 1910 |
| 1875 | 1911 |
| 1876 void Assembler::addq(const Address& address, Register reg) { | 1912 void Assembler::addq(const Address& address, Register src) { |
| 1877 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1913 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1878 EmitOperandREX(reg, address, REX_W); | 1914 EmitOperandREX(src, address, REX_W); |
| 1879 EmitUint8(0x01); | 1915 EmitUint8(0x01); |
| 1880 EmitOperand(reg & 7, address); | 1916 EmitOperand(src & 7, address); |
| 1881 } | |
| 1882 | |
| 1883 | |
| 1884 void Assembler::adcl(Register dst, Register src) { | |
| 1885 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
| 1886 Operand operand(src); | |
| 1887 EmitOperandREX(dst, operand, REX_NONE); | |
| 1888 EmitUint8(0x13); | |
| 1889 EmitOperand(dst & 7, operand); | |
| 1890 } | 1917 } |
| 1891 | 1918 |
| 1892 | 1919 |
| 1893 void Assembler::subl(Register dst, Register src) { | 1920 void Assembler::subl(Register dst, Register src) { |
| 1894 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1921 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1895 Operand operand(src); | 1922 Operand operand(src); |
| 1896 EmitOperandREX(dst, operand, REX_NONE); | 1923 EmitOperandREX(dst, operand, REX_NONE); |
| 1897 EmitUint8(0x2B); | 1924 EmitUint8(0x2B); |
| 1898 EmitOperand(dst & 7, operand); | 1925 EmitOperand(dst & 7, operand); |
| 1899 } | 1926 } |
| 1900 | 1927 |
| 1901 | 1928 |
| 1929 void Assembler::sbbl(Register dst, const Immediate& imm) { |
| 1930 ASSERT(imm.is_int32()); |
| 1931 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1932 EmitRegisterREX(dst, REX_NONE); |
| 1933 EmitComplex(3, Operand(dst), imm); |
| 1934 } |
| 1935 |
| 1936 |
| 1937 void Assembler::sbbl(Register dst, const Address& address) { |
| 1938 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1939 EmitOperandREX(dst, address, REX_NONE); |
| 1940 EmitUint8(0x1B); |
| 1941 EmitOperand(dst & 7, address); |
| 1942 } |
| 1943 |
| 1944 |
| 1902 void Assembler::cdq() { | 1945 void Assembler::cdq() { |
| 1903 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1946 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1904 EmitUint8(0x99); | 1947 EmitUint8(0x99); |
| 1905 } | 1948 } |
| 1906 | 1949 |
| 1907 | 1950 |
| 1908 void Assembler::cqo() { | 1951 void Assembler::cqo() { |
| 1909 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1952 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1910 EmitRegisterREX(RAX, REX_W); | 1953 EmitRegisterREX(RAX, REX_W); |
| 1911 EmitUint8(0x99); | 1954 EmitUint8(0x99); |
| 1912 } | 1955 } |
| 1913 | 1956 |
| 1914 | 1957 |
| 1915 void Assembler::idivl(Register reg) { | 1958 void Assembler::idivl(Register reg) { |
| 1916 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1959 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1917 EmitRegisterREX(reg, REX_NONE); | 1960 EmitRegisterREX(reg, REX_NONE); |
| 1918 EmitUint8(0xF7); | 1961 EmitUint8(0xF7); |
| 1919 EmitUint8(0xF8 | (reg & 7)); | 1962 EmitOperand(7, Operand(reg)); |
| 1963 } |
| 1964 |
| 1965 |
| 1966 void Assembler::divl(Register reg) { |
| 1967 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1968 EmitRegisterREX(reg, REX_NONE); |
| 1969 EmitUint8(0xF7); |
| 1970 EmitOperand(6, Operand(reg)); |
| 1920 } | 1971 } |
| 1921 | 1972 |
| 1922 | 1973 |
| 1923 void Assembler::idivq(Register reg) { | 1974 void Assembler::idivq(Register reg) { |
| 1924 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1975 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1925 EmitRegisterREX(reg, REX_W); | 1976 EmitRegisterREX(reg, REX_W); |
| 1926 EmitUint8(0xF7); | 1977 EmitUint8(0xF7); |
| 1927 EmitUint8(0xF8 | (reg & 7)); | 1978 EmitOperand(7, Operand(reg)); |
| 1928 } | 1979 } |
| 1929 | 1980 |
| 1930 | 1981 |
| 1931 void Assembler::imull(Register dst, Register src) { | 1982 void Assembler::imull(Register dst, Register src) { |
| 1932 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1983 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1933 Operand operand(src); | 1984 Operand operand(src); |
| 1934 EmitOperandREX(dst, operand, REX_NONE); | 1985 EmitOperandREX(dst, operand, REX_NONE); |
| 1935 EmitUint8(0x0F); | 1986 EmitUint8(0x0F); |
| 1936 EmitUint8(0xAF); | 1987 EmitUint8(0xAF); |
| 1937 EmitOperand(dst & 7, Operand(src)); | 1988 EmitOperand(dst & 7, Operand(src)); |
| 1938 } | 1989 } |
| 1939 | 1990 |
| 1940 | 1991 |
| 1941 void Assembler::imull(Register reg, const Immediate& imm) { | 1992 void Assembler::imull(Register reg, const Immediate& imm) { |
| 1942 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1993 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1943 Operand operand(reg); | 1994 Operand operand(reg); |
| 1944 EmitOperandREX(reg, operand, REX_NONE); | 1995 EmitOperandREX(reg, operand, REX_NONE); |
| 1945 EmitUint8(0x69); | 1996 EmitUint8(0x69); |
| 1946 EmitOperand(reg & 7, Operand(reg)); | 1997 EmitOperand(reg & 7, Operand(reg)); |
| 1947 EmitImmediate(imm); | 1998 EmitImmediate(imm); |
| 1948 } | 1999 } |
| 1949 | 2000 |
| 1950 | 2001 |
| 2002 void Assembler::mull(Register reg) { |
| 2003 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 2004 EmitRegisterREX(reg, REX_NONE); |
| 2005 EmitUint8(0xF7); |
| 2006 EmitOperand(4, Operand(reg)); |
| 2007 } |
| 2008 |
| 2009 |
| 1951 void Assembler::imulq(Register dst, Register src) { | 2010 void Assembler::imulq(Register dst, Register src) { |
| 1952 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2011 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1953 Operand operand(src); | 2012 Operand operand(src); |
| 1954 EmitOperandREX(dst, operand, REX_W); | 2013 EmitOperandREX(dst, operand, REX_W); |
| 1955 EmitUint8(0x0F); | 2014 EmitUint8(0x0F); |
| 1956 EmitUint8(0xAF); | 2015 EmitUint8(0xAF); |
| 1957 EmitOperand(dst & 7, operand); | 2016 EmitOperand(dst & 7, operand); |
| 1958 } | 2017 } |
| 1959 | 2018 |
| 1960 | 2019 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2065 void Assembler::sarl(Register reg, const Immediate& imm) { | 2124 void Assembler::sarl(Register reg, const Immediate& imm) { |
| 2066 EmitGenericShift(false, 7, reg, imm); | 2125 EmitGenericShift(false, 7, reg, imm); |
| 2067 } | 2126 } |
| 2068 | 2127 |
| 2069 | 2128 |
| 2070 void Assembler::sarl(Register operand, Register shifter) { | 2129 void Assembler::sarl(Register operand, Register shifter) { |
| 2071 EmitGenericShift(false, 7, operand, shifter); | 2130 EmitGenericShift(false, 7, operand, shifter); |
| 2072 } | 2131 } |
| 2073 | 2132 |
| 2074 | 2133 |
| 2134 void Assembler::shldl(Register dst, Register src, const Immediate& imm) { |
| 2135 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 2136 ASSERT(imm.is_int8()); |
| 2137 Operand operand(src); |
| 2138 EmitOperandREX(dst, operand, REX_NONE); |
| 2139 EmitUint8(0x0F); |
| 2140 EmitUint8(0xA4); |
| 2141 EmitOperand(src & 7, Operand(dst)); |
| 2142 EmitUint8(imm.value() & 0xFF); |
| 2143 } |
| 2144 |
| 2145 |
| 2075 void Assembler::shlq(Register reg, const Immediate& imm) { | 2146 void Assembler::shlq(Register reg, const Immediate& imm) { |
| 2076 EmitGenericShift(true, 4, reg, imm); | 2147 EmitGenericShift(true, 4, reg, imm); |
| 2077 } | 2148 } |
| 2078 | 2149 |
| 2079 | 2150 |
| 2080 void Assembler::shlq(Register operand, Register shifter) { | 2151 void Assembler::shlq(Register operand, Register shifter) { |
| 2081 EmitGenericShift(true, 4, operand, shifter); | 2152 EmitGenericShift(true, 4, operand, shifter); |
| 2082 } | 2153 } |
| 2083 | 2154 |
| 2084 | 2155 |
| (...skipping 1490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3575 | 3646 |
| 3576 | 3647 |
| 3577 const char* Assembler::FpuRegisterName(FpuRegister reg) { | 3648 const char* Assembler::FpuRegisterName(FpuRegister reg) { |
| 3578 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); | 3649 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); |
| 3579 return xmm_reg_names[reg]; | 3650 return xmm_reg_names[reg]; |
| 3580 } | 3651 } |
| 3581 | 3652 |
| 3582 } // namespace dart | 3653 } // namespace dart |
| 3583 | 3654 |
| 3584 #endif // defined TARGET_ARCH_X64 | 3655 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |