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

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
« no previous file with comments | « runtime/vm/assembler_x64.h ('k') | runtime/vm/assembler_x64_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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::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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/assembler_x64.h ('k') | runtime/vm/assembler_x64_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698