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

Side by Side Diff: src/IceTargetLoweringMIPS32.cpp

Issue 2359713003: [Subzero][MIPS32] Implements 64-bit shl, lshr, ashr for MIPS (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Removed unnecessary change Created 4 years, 3 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
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698