Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- subzero/src/IceTargetLoweringMIPS32.cpp - MIPS32 lowering ----------===// | 1 //===- subzero/src/IceTargetLoweringMIPS32.cpp - MIPS32 lowering ----------===// |
| 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 938 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 949 } | 949 } |
| 950 | 950 |
| 951 void TargetMIPS32::lowerExtractElement(const InstExtractElement *Instr) { | 951 void TargetMIPS32::lowerExtractElement(const InstExtractElement *Instr) { |
| 952 UnimplementedLoweringError(this, Instr); | 952 UnimplementedLoweringError(this, Instr); |
| 953 } | 953 } |
| 954 | 954 |
| 955 void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { | 955 void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { |
| 956 UnimplementedLoweringError(this, Instr); | 956 UnimplementedLoweringError(this, Instr); |
| 957 } | 957 } |
| 958 | 958 |
| 959 void TargetMIPS32::lower64Icmp(const InstIcmp *Instr) { | |
| 960 UnimplementedLoweringError(this, Instr); | |
| 961 return; | |
| 962 } | |
| 963 | |
| 959 void TargetMIPS32::lowerIcmp(const InstIcmp *Instr) { | 964 void TargetMIPS32::lowerIcmp(const InstIcmp *Instr) { |
|
Jim Stichnoth
2016/04/19 16:44:01
This CL is currently lacking tests. There should
sagar.thakur
2016/04/25 09:14:32
Yes, the test for icmp eq could be something like
Jim Stichnoth
2016/04/25 15:26:53
Ah, you're right. It looks like none of the lower
| |
| 965 auto Src0 = Instr->getSrc(0); | |
| 966 auto Src1 = Instr->getSrc(1); | |
| 967 if (Src0->getType() == IceType_i64 || Src1->getType() == IceType_i64) { | |
|
Jim Stichnoth
2016/04/19 16:44:01
Typically we just check the type of getDest() or g
sagar.thakur
2016/04/25 09:14:32
Done.
| |
| 968 lower64Icmp(Instr); | |
|
Jim Stichnoth
2016/04/19 16:44:02
LLVM coding style uses 2-space indents. If you ru
sagar.thakur
2016/04/25 09:14:32
Done.
| |
| 969 return; | |
| 970 } | |
| 971 Variable *Dest = Instr->getDest(); | |
| 972 if (isVectorType(Dest->getType())) { | |
| 973 UnimplementedLoweringError(this, Instr); | |
| 974 return; | |
| 975 } | |
| 976 InstIcmp::ICond Cond = Instr->getCondition(); | |
| 977 auto Src0R = legalizeToReg(Src0); | |
|
Jim Stichnoth
2016/04/19 16:44:02
auto *
for these two
sagar.thakur
2016/04/25 09:14:32
Done.
| |
| 978 auto Src1R = legalizeToReg(Src1); | |
| 979 switch(Cond) { | |
| 980 case InstIcmp::Eq: { | |
| 981 auto DestT = I32Reg(), T = I32Reg(); | |
|
Jim Stichnoth
2016/04/19 16:44:01
We usually do variable initializations as separate
sagar.thakur
2016/04/25 09:14:32
Done.
| |
| 982 _xor(T, Src0R, Src1R); | |
| 983 _sltiu(DestT, T, 1); | |
| 984 _mov(Dest, DestT); | |
| 985 return; | |
| 986 } | |
| 987 case InstIcmp::Ne: { | |
| 988 auto DestT = I32Reg(), T = I32Reg(), Zero = getZero(); | |
|
Jim Stichnoth
2016/04/19 16:44:01
The following doesn't need to be addressed in this
sagar.thakur
2016/04/25 09:14:31
I think the third approach would be a good one. Wi
| |
| 989 _xor(T, Src0R, Src1R); | |
| 990 _sltu(DestT, Zero, T); | |
| 991 _mov(Dest, DestT); | |
| 992 return; | |
| 993 } | |
| 994 case InstIcmp::Ugt: { | |
| 995 auto DestT = I32Reg(); | |
| 996 _sltu(DestT, Src1R, Src0R); | |
| 997 _mov(Dest, DestT); | |
| 998 return; | |
| 999 } | |
| 1000 case InstIcmp::Uge: { | |
| 1001 auto DestT = I32Reg(), T = I32Reg(); | |
| 1002 _sltu(T, Src0R, Src1R); | |
| 1003 _xori(DestT, T, 1); | |
| 1004 _mov(Dest, DestT); | |
| 1005 return; | |
| 1006 } | |
| 1007 case InstIcmp::Ult: { | |
| 1008 auto DestT = I32Reg(); | |
| 1009 _sltu(DestT, Src0R, Src1R); | |
| 1010 _mov(Dest, DestT); | |
| 1011 return; | |
| 1012 } | |
| 1013 case InstIcmp::Ule:{ | |
| 1014 auto DestT = I32Reg(), T = I32Reg(); | |
| 1015 _sltu(T, Src1R, Src0R); | |
| 1016 _xori(DestT, T, 1); | |
| 1017 _mov(Dest, DestT); | |
| 1018 return; | |
| 1019 } | |
| 1020 case InstIcmp::Sgt: { | |
| 1021 auto DestT = I32Reg(); | |
| 1022 _slt(DestT, Src1R, Src0R); | |
| 1023 _mov(Dest, DestT); | |
| 1024 return; | |
| 1025 } | |
| 1026 case InstIcmp::Sge: { | |
| 1027 auto DestT = I32Reg(), T = I32Reg(); | |
| 1028 _slt(T, Src1R, Src0R); | |
| 1029 _xori(DestT, T, 1); | |
| 1030 _mov(Dest, DestT); | |
| 1031 return; | |
| 1032 } | |
| 1033 case InstIcmp::Slt: { | |
| 1034 auto DestT = I32Reg(); | |
| 1035 _slt(DestT, Src0R, Src1R); | |
| 1036 _mov(Dest, DestT); | |
| 1037 return; | |
| 1038 } | |
| 1039 case InstIcmp::Sle:{ | |
| 1040 auto DestT = I32Reg(), T = I32Reg(); | |
| 1041 _slt(T, Src1R, Src0R); | |
| 1042 _xori(DestT, T, 1); | |
| 1043 _mov(Dest, DestT); | |
| 1044 return; | |
| 1045 } | |
| 1046 default: | |
| 1047 llvm_unreachable("Invalid ICmp operator"); | |
| 1048 return; | |
| 1049 } | |
| 1050 (void)Src0; | |
|
Jim Stichnoth
2016/04/19 16:44:02
remove these
sagar.thakur
2016/04/25 09:14:31
Done.
| |
| 1051 (void)Src1; | |
| 1052 (void)Cond; | |
| 960 UnimplementedLoweringError(this, Instr); | 1053 UnimplementedLoweringError(this, Instr); |
|
Jim Stichnoth
2016/04/19 16:44:01
I think this can be removed, given the return in t
sagar.thakur
2016/04/25 09:14:32
Done.
| |
| 961 } | 1054 } |
| 962 | 1055 |
| 963 void TargetMIPS32::lowerInsertElement(const InstInsertElement *Instr) { | 1056 void TargetMIPS32::lowerInsertElement(const InstInsertElement *Instr) { |
| 964 UnimplementedLoweringError(this, Instr); | 1057 UnimplementedLoweringError(this, Instr); |
| 965 } | 1058 } |
| 966 | 1059 |
| 967 void TargetMIPS32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) { | 1060 void TargetMIPS32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) { |
| 968 switch (Instr->getIntrinsicInfo().ID) { | 1061 switch (Instr->getIntrinsicInfo().ID) { |
| 969 case Intrinsics::AtomicCmpxchg: { | 1062 case Intrinsics::AtomicCmpxchg: { |
| 970 UnimplementedLoweringError(this, Instr); | 1063 UnimplementedLoweringError(this, Instr); |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1322 Str << "\t.set\t" | 1415 Str << "\t.set\t" |
| 1323 << "nomips16\n"; | 1416 << "nomips16\n"; |
| 1324 } | 1417 } |
| 1325 | 1418 |
| 1326 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 1419 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
| 1327 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 1420 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
| 1328 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 1421 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
| 1329 | 1422 |
| 1330 } // end of namespace MIPS32 | 1423 } // end of namespace MIPS32 |
| 1331 } // end of namespace Ice | 1424 } // end of namespace Ice |
| OLD | NEW |