Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // | 1 // |
| 2 // The Subzero Code Generator | 2 // The Subzero Code Generator |
| 3 // | 3 // |
| 4 // This file is distributed under the University of Illinois Open Source | 4 // This file is distributed under the University of Illinois Open Source |
| 5 // License. See LICENSE.TXT for details. | 5 // License. See LICENSE.TXT for details. |
| 6 // | 6 // |
| 7 //===----------------------------------------------------------------------===// | 7 //===----------------------------------------------------------------------===// |
| 8 /// | 8 /// |
| 9 /// \file | 9 /// \file |
| 10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost | 10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost |
| (...skipping 1777 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1788 Variable *Dest, Operand *Src0, | 1788 Variable *Dest, Operand *Src0, |
| 1789 Operand *Src1) { | 1789 Operand *Src1) { |
| 1790 InstArithmetic::OpKind Op = Instr->getOp(); | 1790 InstArithmetic::OpKind Op = Instr->getOp(); |
| 1791 switch (Op) { | 1791 switch (Op) { |
| 1792 case InstArithmetic::Add: | 1792 case InstArithmetic::Add: |
| 1793 case InstArithmetic::And: | 1793 case InstArithmetic::And: |
| 1794 case InstArithmetic::Or: | 1794 case InstArithmetic::Or: |
| 1795 case InstArithmetic::Sub: | 1795 case InstArithmetic::Sub: |
| 1796 case InstArithmetic::Xor: | 1796 case InstArithmetic::Xor: |
| 1797 case InstArithmetic::Mul: | 1797 case InstArithmetic::Mul: |
| 1798 case InstArithmetic::Shl: | |
| 1799 case InstArithmetic::Lshr: | |
| 1800 case InstArithmetic::Ashr: | |
| 1798 break; | 1801 break; |
| 1799 default: | 1802 default: |
| 1800 UnimplementedLoweringError(this, Instr); | 1803 UnimplementedLoweringError(this, Instr); |
| 1801 return; | 1804 return; |
| 1802 } | 1805 } |
| 1803 auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); | 1806 auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); |
| 1804 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); | 1807 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); |
| 1805 Variable *Src0LoR = legalizeToReg(loOperand(Src0)); | 1808 Variable *Src0LoR = legalizeToReg(loOperand(Src0)); |
| 1806 Variable *Src1LoR = legalizeToReg(loOperand(Src1)); | 1809 Variable *Src1LoR = legalizeToReg(loOperand(Src1)); |
| 1807 Variable *Src0HiR = legalizeToReg(hiOperand(Src0)); | 1810 Variable *Src0HiR = legalizeToReg(hiOperand(Src0)); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1868 _mflo(T1, T_Lo); | 1871 _mflo(T1, T_Lo); |
| 1869 _mfhi(T2, T_Hi); | 1872 _mfhi(T2, T_Hi); |
| 1870 _mov(DestLo, T1); | 1873 _mov(DestLo, T1); |
| 1871 _mul(TM1, Src0HiR, Src1LoR); | 1874 _mul(TM1, Src0HiR, Src1LoR); |
| 1872 _mul(TM2, Src0LoR, Src1HiR); | 1875 _mul(TM2, Src0LoR, Src1HiR); |
| 1873 _addu(TM3, TM1, T2); | 1876 _addu(TM3, TM1, T2); |
| 1874 _addu(TM4, TM3, TM2); | 1877 _addu(TM4, TM3, TM2); |
| 1875 _mov(DestHi, TM4); | 1878 _mov(DestHi, TM4); |
| 1876 return; | 1879 return; |
| 1877 } | 1880 } |
| 1881 case InstArithmetic::Shl: { | |
| 1882 auto *T_Lo = I32Reg(); | |
| 1883 auto *T_Hi = I32Reg(); | |
| 1884 auto *T1_Lo = I32Reg(); | |
| 1885 auto *T1_Hi = I32Reg(); | |
| 1886 auto *T1 = I32Reg(); | |
| 1887 auto *T2 = I32Reg(); | |
| 1888 auto *T3 = I32Reg(); | |
| 1889 auto *T4 = I32Reg(); | |
| 1890 auto *T5 = I32Reg(); | |
| 1891 auto *T6 = I32Reg(); | |
| 1892 // The hi part of source 1 is not used since source 1 will contain value 64 | |
| 1893 // at the max | |
| 1894 Context.insert<InstFakeUse>(Src1HiR); | |
|
Jim Stichnoth
2016/09/21 16:59:25
Is the FakeUse (here and below) really necessary?
sagar.thakur
2016/09/22 14:43:50
Yes, the FakeUse should not be there.
| |
| 1895 _sllv(T1, Src0HiR, Src1LoR); | |
| 1896 _addiu(T2, getZero(), -1); | |
| 1897 _xor(T3, Src1LoR, T2); | |
|
obucinac
2016/09/21 16:33:31
XOR with 0xFFFFFFFF lowers to NOT. For this case,
sagar.thakur
2016/09/22 14:43:50
Done.
| |
| 1898 _srl(T4, Src0LoR, 1); | |
| 1899 _srlv(T5, T4, T3); | |
| 1900 _or(T_Hi, T1, T5); | |
| 1901 _sllv(T_Lo, Src0LoR, Src1LoR); | |
| 1902 | |
| 1903 _mov(T1_Hi, T_Hi); | |
| 1904 _mov(T1_Lo, T_Lo); | |
| 1905 _andi(T6, Src1LoR, INT32_BITS); | |
| 1906 _movn(T1_Hi, T_Lo, T6); | |
| 1907 _movn(T1_Lo, getZero(), T6); | |
| 1908 _mov(DestHi, T1_Hi); | |
| 1909 _mov(DestLo, T1_Lo); | |
| 1910 return; | |
| 1911 } | |
| 1912 case InstArithmetic::Lshr: { | |
| 1913 auto *T_Lo = I32Reg(); | |
| 1914 auto *T_Hi = I32Reg(); | |
| 1915 auto *T1_Lo = makeReg(DestLo->getType()); | |
| 1916 auto *T1_Hi = makeReg(DestHi->getType()); | |
| 1917 auto *T1 = I32Reg(); | |
| 1918 auto *T2 = I32Reg(); | |
| 1919 auto *T3 = I32Reg(); | |
| 1920 auto *T4 = I32Reg(); | |
| 1921 auto *T5 = I32Reg(); | |
| 1922 auto *T6 = I32Reg(); | |
| 1923 // The hi part of source 1 is not used since source 1 will contain value 64 | |
| 1924 // at the max | |
| 1925 Context.insert<InstFakeUse>(Src1HiR); | |
| 1926 _srlv(T1, Src0LoR, Src1LoR); | |
| 1927 _addiu(T2, getZero(), -1); | |
| 1928 _xor(T3, Src1LoR, T2); | |
| 1929 _sll(T4, Src0HiR, 1); | |
| 1930 _sllv(T5, T4, T3); | |
| 1931 _or(T_Lo, T1, T5); | |
| 1932 _srlv(T_Hi, Src0HiR, Src1LoR); | |
| 1933 | |
| 1934 _mov(T1_Hi, T_Hi); | |
| 1935 _mov(T1_Lo, T_Lo); | |
| 1936 _andi(T6, Src1LoR, INT32_BITS); | |
| 1937 _movn(T1_Lo, T_Hi, T6); | |
| 1938 _movn(T1_Hi, getZero(), T6); | |
| 1939 _mov(DestHi, T1_Hi); | |
| 1940 _mov(DestLo, T1_Lo); | |
| 1941 return; | |
| 1942 } | |
| 1943 case InstArithmetic::Ashr: { | |
| 1944 auto *T_Lo = I32Reg(); | |
| 1945 auto *T_Hi = I32Reg(); | |
| 1946 auto *T1_Lo = I32Reg(); | |
| 1947 auto *T1_Hi = I32Reg(); | |
| 1948 auto *T1 = I32Reg(); | |
| 1949 auto *T2 = I32Reg(); | |
| 1950 auto *T3 = I32Reg(); | |
| 1951 auto *T4 = I32Reg(); | |
| 1952 auto *T5 = I32Reg(); | |
| 1953 auto *T6 = I32Reg(); | |
| 1954 auto *T7 = I32Reg(); | |
| 1955 // The hi part of source 1 is not used since source 1 will contain value 64 | |
| 1956 // at the max | |
| 1957 Context.insert<InstFakeUse>(Src1HiR); | |
| 1958 _srlv(T1, Src0LoR, Src1LoR); | |
| 1959 _addiu(T2, getZero(), -1); | |
| 1960 _xor(T3, Src1LoR, T2); | |
| 1961 _sll(T4, Src0HiR, 1); | |
| 1962 _sllv(T5, T4, T3); | |
| 1963 _or(T_Lo, T1, T5); | |
| 1964 _srav(T_Hi, Src0HiR, Src1LoR); | |
| 1965 | |
| 1966 _mov(T1_Hi, T_Hi); | |
| 1967 _mov(T1_Lo, T_Lo); | |
| 1968 _andi(T6, Src1LoR, INT32_BITS); | |
| 1969 _movn(T1_Lo, T_Hi, T6); | |
| 1970 _sra(T7, Src0HiR, INT32_BITS - 1); | |
| 1971 _movn(T1_Hi, T7, T6); | |
| 1972 _mov(DestHi, T1_Hi); | |
| 1973 _mov(DestLo, T1_Lo); | |
| 1974 return; | |
| 1975 } | |
| 1878 default: | 1976 default: |
| 1879 UnimplementedLoweringError(this, Instr); | 1977 UnimplementedLoweringError(this, Instr); |
| 1880 return; | 1978 return; |
| 1881 } | 1979 } |
| 1882 } | 1980 } |
| 1883 | 1981 |
| 1884 void TargetMIPS32::lowerArithmetic(const InstArithmetic *Instr) { | 1982 void TargetMIPS32::lowerArithmetic(const InstArithmetic *Instr) { |
| 1885 Variable *Dest = Instr->getDest(); | 1983 Variable *Dest = Instr->getDest(); |
| 1886 // We need to signal all the UnimplementedLoweringError errors before any | 1984 // We need to signal all the UnimplementedLoweringError errors before any |
| 1887 // legalization into new variables, otherwise Om1 register allocation may fail | 1985 // legalization into new variables, otherwise Om1 register allocation may fail |
| (...skipping 1779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3667 Str << "\t.set\t" | 3765 Str << "\t.set\t" |
| 3668 << "nomips16\n"; | 3766 << "nomips16\n"; |
| 3669 } | 3767 } |
| 3670 | 3768 |
| 3671 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 3769 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
| 3672 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 3770 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
| 3673 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 3771 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
| 3674 | 3772 |
| 3675 } // end of namespace MIPS32 | 3773 } // end of namespace MIPS32 |
| 3676 } // end of namespace Ice | 3774 } // end of namespace Ice |
| OLD | NEW |