Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- subzero/src/IceTargetLoweringX86BaseImpl.h - x86 lowering -*- C++ -*-==// | 1 //===- subzero/src/IceTargetLoweringX86BaseImpl.h - x86 lowering -*- C++ -*-==// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 /// | 9 /// |
| 10 /// \file | 10 /// \file |
| (...skipping 1832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1843 if (!llvm::isa<Constant>(Src1)) | 1843 if (!llvm::isa<Constant>(Src1)) |
| 1844 Src1 = legalizeToReg(Src1, Traits::RegisterSet::Reg_ecx); | 1844 Src1 = legalizeToReg(Src1, Traits::RegisterSet::Reg_ecx); |
| 1845 _sar(T, Src1); | 1845 _sar(T, Src1); |
| 1846 _mov(Dest, T); | 1846 _mov(Dest, T); |
| 1847 break; | 1847 break; |
| 1848 case InstArithmetic::Udiv: | 1848 case InstArithmetic::Udiv: |
| 1849 // div and idiv are the few arithmetic operators that do not allow | 1849 // div and idiv are the few arithmetic operators that do not allow |
| 1850 // immediates as the operand. | 1850 // immediates as the operand. |
| 1851 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); | 1851 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); |
| 1852 if (isByteSizedArithType(Dest->getType())) { | 1852 if (isByteSizedArithType(Dest->getType())) { |
| 1853 Variable *T_ah = nullptr; | 1853 Variable *T_eax = makeReg(IceType_i16, Traits::RegisterSet::Reg_eax); |
|
Jim Stichnoth
2015/07/28 15:58:23
Add a comment explaining the ah workaround.
jvoung (off chromium)
2015/07/28 16:17:45
For T_eax, why not use IceType_i32 instead of IceT
John
2015/07/28 18:21:16
Regardless of being smaler, using i32 is more effi
John
2015/07/28 18:21:16
Done.
| |
| 1854 Constant *Zero = Ctx->getConstantZero(IceType_i8); | 1854 Context.insert(InstFakeDef::create(Func, T_eax)); |
| 1855 _xor(T_eax, T_eax); | |
| 1855 _mov(T, Src0, Traits::RegisterSet::Reg_eax); | 1856 _mov(T, Src0, Traits::RegisterSet::Reg_eax); |
| 1856 _mov(T_ah, Zero, Traits::RegisterSet::Reg_ah); | 1857 _div(T, Src1, T); |
| 1857 _div(T, Src1, T_ah); | |
| 1858 _mov(Dest, T); | 1858 _mov(Dest, T); |
| 1859 Context.insert(InstFakeUse::create(Func, T_eax)); | |
| 1859 } else { | 1860 } else { |
| 1860 Constant *Zero = Ctx->getConstantZero(IceType_i32); | 1861 Constant *Zero = Ctx->getConstantZero(IceType_i32); |
| 1861 _mov(T, Src0, Traits::RegisterSet::Reg_eax); | 1862 _mov(T, Src0, Traits::RegisterSet::Reg_eax); |
| 1862 _mov(T_edx, Zero, Traits::RegisterSet::Reg_edx); | 1863 _mov(T_edx, Zero, Traits::RegisterSet::Reg_edx); |
| 1863 _div(T, Src1, T_edx); | 1864 _div(T, Src1, T_edx); |
| 1864 _mov(Dest, T); | 1865 _mov(Dest, T); |
| 1865 } | 1866 } |
| 1866 break; | 1867 break; |
| 1867 case InstArithmetic::Sdiv: | 1868 case InstArithmetic::Sdiv: |
| 1868 // TODO(stichnot): Enable this after doing better performance | 1869 // TODO(stichnot): Enable this after doing better performance |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1910 T_edx = makeReg(IceType_i32, Traits::RegisterSet::Reg_edx); | 1911 T_edx = makeReg(IceType_i32, Traits::RegisterSet::Reg_edx); |
| 1911 _mov(T, Src0, Traits::RegisterSet::Reg_eax); | 1912 _mov(T, Src0, Traits::RegisterSet::Reg_eax); |
| 1912 _cbwdq(T_edx, T); | 1913 _cbwdq(T_edx, T); |
| 1913 _idiv(T, Src1, T_edx); | 1914 _idiv(T, Src1, T_edx); |
| 1914 _mov(Dest, T); | 1915 _mov(Dest, T); |
| 1915 } | 1916 } |
| 1916 break; | 1917 break; |
| 1917 case InstArithmetic::Urem: | 1918 case InstArithmetic::Urem: |
| 1918 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); | 1919 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); |
| 1919 if (isByteSizedArithType(Dest->getType())) { | 1920 if (isByteSizedArithType(Dest->getType())) { |
| 1920 Variable *T_ah = nullptr; | 1921 Variable *T_eax = makeReg(IceType_i32, Traits::RegisterSet::Reg_eax); |
| 1921 Constant *Zero = Ctx->getConstantZero(IceType_i8); | 1922 Context.insert(InstFakeDef::create(Func, T_eax)); |
| 1923 _xor(T_eax, T_eax); | |
| 1924 _set_dest_nonkillable(); | |
|
Jim Stichnoth
2015/07/28 15:58:23
I don't think any of these new instances of _set_d
John
2015/07/28 18:21:16
Done.
| |
| 1922 _mov(T, Src0, Traits::RegisterSet::Reg_eax); | 1925 _mov(T, Src0, Traits::RegisterSet::Reg_eax); |
| 1923 _mov(T_ah, Zero, Traits::RegisterSet::Reg_ah); | 1926 Variable *T_al = makeReg(IceType_i8, Traits::RegisterSet::Reg_eax); |
| 1924 _div(T_ah, Src1, T); | 1927 _div(T_al, Src1, T); |
| 1925 _mov(Dest, T_ah); | 1928 // shr $8, %eax shifts ah (i.e., the 8 bit remainder) into al. We don't |
| 1929 // mov %ah, %al because it would make x86-64 codegen more complicated. If | |
| 1930 // this ever becomes a problem we can introduce a pseudo rem instruction | |
| 1931 // that returns the remainder in %al directly (and uses a mov for copying | |
| 1932 // %ah to %al.) | |
| 1933 _shr(T_eax, Ctx->getConstantInt8(8)); | |
|
Jim Stichnoth
2015/07/28 15:58:23
Consider using X86_CHAR_BIT instead of 8.
John
2015/07/28 18:21:16
The name X86_CHAR_BIT is somewhat confusing. In C
| |
| 1934 _mov(Dest, T_al); | |
| 1935 Context.insert(InstFakeUse::create(Func, T_eax)); | |
| 1926 } else { | 1936 } else { |
| 1927 Constant *Zero = Ctx->getConstantZero(IceType_i32); | 1937 Constant *Zero = Ctx->getConstantZero(IceType_i32); |
| 1928 _mov(T_edx, Zero, Traits::RegisterSet::Reg_edx); | 1938 _mov(T_edx, Zero, Traits::RegisterSet::Reg_edx); |
| 1929 _mov(T, Src0, Traits::RegisterSet::Reg_eax); | 1939 _mov(T, Src0, Traits::RegisterSet::Reg_eax); |
| 1930 _div(T_edx, Src1, T); | 1940 _div(T_edx, Src1, T); |
| 1931 _mov(Dest, T_edx); | 1941 _mov(Dest, T_edx); |
| 1932 } | 1942 } |
| 1933 break; | 1943 break; |
| 1934 case InstArithmetic::Srem: | 1944 case InstArithmetic::Srem: |
| 1935 // TODO(stichnot): Enable this after doing better performance | 1945 // TODO(stichnot): Enable this after doing better performance |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1967 _and(T, Ctx->getConstantInt(Ty, -(1 << LogDiv))); | 1977 _and(T, Ctx->getConstantInt(Ty, -(1 << LogDiv))); |
| 1968 _sub(T, Src0); | 1978 _sub(T, Src0); |
| 1969 _neg(T); | 1979 _neg(T); |
| 1970 _mov(Dest, T); | 1980 _mov(Dest, T); |
| 1971 return; | 1981 return; |
| 1972 } | 1982 } |
| 1973 } | 1983 } |
| 1974 } | 1984 } |
| 1975 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); | 1985 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); |
| 1976 if (isByteSizedArithType(Dest->getType())) { | 1986 if (isByteSizedArithType(Dest->getType())) { |
| 1977 Variable *T_ah = makeReg(IceType_i8, Traits::RegisterSet::Reg_ah); | |
| 1978 _mov(T, Src0, Traits::RegisterSet::Reg_eax); | 1987 _mov(T, Src0, Traits::RegisterSet::Reg_eax); |
| 1988 // T is %al. | |
| 1989 _set_dest_nonkillable(); | |
| 1979 _cbwdq(T, T); | 1990 _cbwdq(T, T); |
| 1980 Context.insert(InstFakeDef::create(Func, T_ah)); | 1991 _idiv(T, Src1, T); |
| 1981 _idiv(T_ah, Src1, T); | 1992 Variable *T_eax = makeReg(IceType_i32, Traits::RegisterSet::Reg_eax); |
| 1982 _mov(Dest, T_ah); | 1993 Context.insert(InstFakeDef::create(Func, T_eax)); |
| 1994 // shr $8, %eax shifts ah (i.e., the 8 bit remainder) into al. We don't | |
| 1995 // mov %ah, %al because it would make x86-64 codegen more complicated. If | |
| 1996 // this ever becomes a problem we can introduce a pseudo rem instruction | |
| 1997 // that returns the remainder in %al directly (and uses a mov for copying | |
| 1998 // %ah to %al.) | |
| 1999 _shr(T_eax, Ctx->getConstantInt8(8)); | |
| 2000 _mov(Dest, T); | |
| 2001 Context.insert(InstFakeUse::create(Func, T_eax)); | |
| 1983 } else { | 2002 } else { |
| 1984 T_edx = makeReg(IceType_i32, Traits::RegisterSet::Reg_edx); | 2003 T_edx = makeReg(IceType_i32, Traits::RegisterSet::Reg_edx); |
| 1985 _mov(T, Src0, Traits::RegisterSet::Reg_eax); | 2004 _mov(T, Src0, Traits::RegisterSet::Reg_eax); |
| 1986 _cbwdq(T_edx, T); | 2005 _cbwdq(T_edx, T); |
| 1987 _idiv(T_edx, Src1, T); | 2006 _idiv(T_edx, Src1, T); |
| 1988 _mov(Dest, T_edx); | 2007 _mov(Dest, T_edx); |
| 1989 } | 2008 } |
| 1990 break; | 2009 break; |
| 1991 case InstArithmetic::Fadd: | 2010 case InstArithmetic::Fadd: |
| 1992 _mov(T, Src0); | 2011 _mov(T, Src0); |
| (...skipping 3623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5616 } | 5635 } |
| 5617 // the offset is not eligible for blinding or pooling, return the original | 5636 // the offset is not eligible for blinding or pooling, return the original |
| 5618 // mem operand | 5637 // mem operand |
| 5619 return MemOperand; | 5638 return MemOperand; |
| 5620 } | 5639 } |
| 5621 | 5640 |
| 5622 } // end of namespace X86Internal | 5641 } // end of namespace X86Internal |
| 5623 } // end of namespace Ice | 5642 } // end of namespace Ice |
| 5624 | 5643 |
| 5625 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H | 5644 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H |
| OLD | NEW |