| 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::subl(Register dst, const Address& address) { |
| 1930 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1931 EmitOperandREX(dst, address, REX_NONE); |
| 1932 EmitUint8(0x2B); |
| 1933 EmitOperand(dst & 7, address); |
| 1934 } |
| 1935 |
| 1936 |
| 1937 void Assembler::sbbl(Register dst, Register src) { |
| 1938 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1939 Operand operand(src); |
| 1940 EmitOperandREX(dst, operand, REX_NONE); |
| 1941 EmitUint8(0x1B); |
| 1942 EmitOperand(dst & 7, operand); |
| 1943 } |
| 1944 |
| 1945 |
| 1946 void Assembler::sbbl(Register dst, const Immediate& imm) { |
| 1947 ASSERT(imm.is_int32()); |
| 1948 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1949 EmitRegisterREX(dst, REX_NONE); |
| 1950 EmitComplex(3, Operand(dst), imm); |
| 1951 } |
| 1952 |
| 1953 |
| 1954 void Assembler::sbbl(Register dst, const Address& address) { |
| 1955 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1956 EmitOperandREX(dst, address, REX_NONE); |
| 1957 EmitUint8(0x1B); |
| 1958 EmitOperand(dst & 7, address); |
| 1959 } |
| 1960 |
| 1961 |
| 1902 void Assembler::cdq() { | 1962 void Assembler::cdq() { |
| 1903 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1963 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1904 EmitUint8(0x99); | 1964 EmitUint8(0x99); |
| 1905 } | 1965 } |
| 1906 | 1966 |
| 1907 | 1967 |
| 1908 void Assembler::cqo() { | 1968 void Assembler::cqo() { |
| 1909 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1969 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1910 EmitRegisterREX(RAX, REX_W); | 1970 EmitRegisterREX(RAX, REX_W); |
| 1911 EmitUint8(0x99); | 1971 EmitUint8(0x99); |
| 1912 } | 1972 } |
| 1913 | 1973 |
| 1914 | 1974 |
| 1915 void Assembler::idivl(Register reg) { | 1975 void Assembler::idivl(Register reg) { |
| 1916 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1976 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1917 EmitRegisterREX(reg, REX_NONE); | 1977 EmitRegisterREX(reg, REX_NONE); |
| 1918 EmitUint8(0xF7); | 1978 EmitUint8(0xF7); |
| 1919 EmitUint8(0xF8 | (reg & 7)); | 1979 EmitOperand(7, Operand(reg)); |
| 1980 } |
| 1981 |
| 1982 |
| 1983 void Assembler::divl(Register reg) { |
| 1984 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1985 EmitRegisterREX(reg, REX_NONE); |
| 1986 EmitUint8(0xF7); |
| 1987 EmitOperand(6, Operand(reg)); |
| 1920 } | 1988 } |
| 1921 | 1989 |
| 1922 | 1990 |
| 1923 void Assembler::idivq(Register reg) { | 1991 void Assembler::idivq(Register reg) { |
| 1924 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1992 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1925 EmitRegisterREX(reg, REX_W); | 1993 EmitRegisterREX(reg, REX_W); |
| 1926 EmitUint8(0xF7); | 1994 EmitUint8(0xF7); |
| 1927 EmitUint8(0xF8 | (reg & 7)); | 1995 EmitOperand(7, Operand(reg)); |
| 1928 } | 1996 } |
| 1929 | 1997 |
| 1930 | 1998 |
| 1931 void Assembler::imull(Register dst, Register src) { | 1999 void Assembler::imull(Register dst, Register src) { |
| 1932 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2000 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1933 Operand operand(src); | 2001 Operand operand(src); |
| 1934 EmitOperandREX(dst, operand, REX_NONE); | 2002 EmitOperandREX(dst, operand, REX_NONE); |
| 1935 EmitUint8(0x0F); | 2003 EmitUint8(0x0F); |
| 1936 EmitUint8(0xAF); | 2004 EmitUint8(0xAF); |
| 1937 EmitOperand(dst & 7, Operand(src)); | 2005 EmitOperand(dst & 7, Operand(src)); |
| 1938 } | 2006 } |
| 1939 | 2007 |
| 1940 | 2008 |
| 1941 void Assembler::imull(Register reg, const Immediate& imm) { | 2009 void Assembler::imull(Register reg, const Immediate& imm) { |
| 1942 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2010 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1943 Operand operand(reg); | 2011 Operand operand(reg); |
| 1944 EmitOperandREX(reg, operand, REX_NONE); | 2012 EmitOperandREX(reg, operand, REX_NONE); |
| 1945 EmitUint8(0x69); | 2013 EmitUint8(0x69); |
| 1946 EmitOperand(reg & 7, Operand(reg)); | 2014 EmitOperand(reg & 7, Operand(reg)); |
| 1947 EmitImmediate(imm); | 2015 EmitImmediate(imm); |
| 1948 } | 2016 } |
| 1949 | 2017 |
| 1950 | 2018 |
| 2019 void Assembler::mull(Register reg) { |
| 2020 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 2021 EmitRegisterREX(reg, REX_NONE); |
| 2022 EmitUint8(0xF7); |
| 2023 EmitOperand(4, Operand(reg)); |
| 2024 } |
| 2025 |
| 2026 |
| 1951 void Assembler::imulq(Register dst, Register src) { | 2027 void Assembler::imulq(Register dst, Register src) { |
| 1952 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2028 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1953 Operand operand(src); | 2029 Operand operand(src); |
| 1954 EmitOperandREX(dst, operand, REX_W); | 2030 EmitOperandREX(dst, operand, REX_W); |
| 1955 EmitUint8(0x0F); | 2031 EmitUint8(0x0F); |
| 1956 EmitUint8(0xAF); | 2032 EmitUint8(0xAF); |
| 1957 EmitOperand(dst & 7, operand); | 2033 EmitOperand(dst & 7, operand); |
| 1958 } | 2034 } |
| 1959 | 2035 |
| 1960 | 2036 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2065 void Assembler::sarl(Register reg, const Immediate& imm) { | 2141 void Assembler::sarl(Register reg, const Immediate& imm) { |
| 2066 EmitGenericShift(false, 7, reg, imm); | 2142 EmitGenericShift(false, 7, reg, imm); |
| 2067 } | 2143 } |
| 2068 | 2144 |
| 2069 | 2145 |
| 2070 void Assembler::sarl(Register operand, Register shifter) { | 2146 void Assembler::sarl(Register operand, Register shifter) { |
| 2071 EmitGenericShift(false, 7, operand, shifter); | 2147 EmitGenericShift(false, 7, operand, shifter); |
| 2072 } | 2148 } |
| 2073 | 2149 |
| 2074 | 2150 |
| 2151 void Assembler::shldl(Register dst, Register src, const Immediate& imm) { |
| 2152 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 2153 ASSERT(imm.is_int8()); |
| 2154 Operand operand(src); |
| 2155 EmitOperandREX(dst, operand, REX_NONE); |
| 2156 EmitUint8(0x0F); |
| 2157 EmitUint8(0xA4); |
| 2158 EmitOperand(src & 7, Operand(dst)); |
| 2159 EmitUint8(imm.value() & 0xFF); |
| 2160 } |
| 2161 |
| 2162 |
| 2075 void Assembler::shlq(Register reg, const Immediate& imm) { | 2163 void Assembler::shlq(Register reg, const Immediate& imm) { |
| 2076 EmitGenericShift(true, 4, reg, imm); | 2164 EmitGenericShift(true, 4, reg, imm); |
| 2077 } | 2165 } |
| 2078 | 2166 |
| 2079 | 2167 |
| 2080 void Assembler::shlq(Register operand, Register shifter) { | 2168 void Assembler::shlq(Register operand, Register shifter) { |
| 2081 EmitGenericShift(true, 4, operand, shifter); | 2169 EmitGenericShift(true, 4, operand, shifter); |
| 2082 } | 2170 } |
| 2083 | 2171 |
| 2084 | 2172 |
| (...skipping 1490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3575 | 3663 |
| 3576 | 3664 |
| 3577 const char* Assembler::FpuRegisterName(FpuRegister reg) { | 3665 const char* Assembler::FpuRegisterName(FpuRegister reg) { |
| 3578 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); | 3666 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); |
| 3579 return xmm_reg_names[reg]; | 3667 return xmm_reg_names[reg]; |
| 3580 } | 3668 } |
| 3581 | 3669 |
| 3582 } // namespace dart | 3670 } // namespace dart |
| 3583 | 3671 |
| 3584 #endif // defined TARGET_ARCH_X64 | 3672 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |