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 |