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

Side by Side Diff: runtime/vm/assembler_x64.cc

Issue 648613006: Implement bigint absAdd, absSub, mulAdd, sqrAdd, estQuotientDigit intrinsics, (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 2 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) 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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698