| 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 1139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1150 return; | 1150 return; |
| 1151 } | 1151 } |
| 1152 Variable *Dest = Instr->getDest(); | 1152 Variable *Dest = Instr->getDest(); |
| 1153 if (isVectorType(Dest->getType())) { | 1153 if (isVectorType(Dest->getType())) { |
| 1154 UnimplementedLoweringError(this, Instr); | 1154 UnimplementedLoweringError(this, Instr); |
| 1155 return; | 1155 return; |
| 1156 } | 1156 } |
| 1157 InstIcmp::ICond Cond = Instr->getCondition(); | 1157 InstIcmp::ICond Cond = Instr->getCondition(); |
| 1158 auto *Src0R = legalizeToReg(Src0); | 1158 auto *Src0R = legalizeToReg(Src0); |
| 1159 auto *Src1R = legalizeToReg(Src1); | 1159 auto *Src1R = legalizeToReg(Src1); |
| 1160 const Type Src0Ty = Src0R->getType(); |
| 1161 const uint32_t ShAmt = INT32_BITS - getScalarIntBitWidth(Src0->getType()); |
| 1162 Variable *Src0RT = I32Reg(); |
| 1163 Variable *Src1RT = I32Reg(); |
| 1164 |
| 1165 if (Src0Ty != IceType_i32) { |
| 1166 _sll(Src0RT, Src0R, ShAmt); |
| 1167 _sll(Src1RT, Src1R, ShAmt); |
| 1168 } else { |
| 1169 _mov(Src0RT, Src0R); |
| 1170 _mov(Src1RT, Src1R); |
| 1171 } |
| 1172 |
| 1160 switch (Cond) { | 1173 switch (Cond) { |
| 1161 case InstIcmp::Eq: { | 1174 case InstIcmp::Eq: { |
| 1162 auto *DestT = I32Reg(); | 1175 auto *DestT = I32Reg(); |
| 1163 auto *T = I32Reg(); | 1176 auto *T = I32Reg(); |
| 1164 _xor(T, Src0R, Src1R); | 1177 _xor(T, Src0RT, Src1RT); |
| 1165 _sltiu(DestT, T, 1); | 1178 _sltiu(DestT, T, 1); |
| 1166 _mov(Dest, DestT); | 1179 _mov(Dest, DestT); |
| 1167 return; | 1180 return; |
| 1168 } | 1181 } |
| 1169 case InstIcmp::Ne: { | 1182 case InstIcmp::Ne: { |
| 1170 auto *DestT = I32Reg(); | 1183 auto *DestT = I32Reg(); |
| 1171 auto *T = I32Reg(); | 1184 auto *T = I32Reg(); |
| 1172 auto *Zero = getZero(); | 1185 auto *Zero = getZero(); |
| 1173 _xor(T, Src0R, Src1R); | 1186 _xor(T, Src0RT, Src1RT); |
| 1174 _sltu(DestT, Zero, T); | 1187 _sltu(DestT, Zero, T); |
| 1175 _mov(Dest, DestT); | 1188 _mov(Dest, DestT); |
| 1176 return; | 1189 return; |
| 1177 } | 1190 } |
| 1178 case InstIcmp::Ugt: { | 1191 case InstIcmp::Ugt: { |
| 1179 auto *DestT = I32Reg(); | 1192 auto *DestT = I32Reg(); |
| 1180 _sltu(DestT, Src1R, Src0R); | 1193 _sltu(DestT, Src1RT, Src0RT); |
| 1181 _mov(Dest, DestT); | 1194 _mov(Dest, DestT); |
| 1182 return; | 1195 return; |
| 1183 } | 1196 } |
| 1184 case InstIcmp::Uge: { | 1197 case InstIcmp::Uge: { |
| 1185 auto *DestT = I32Reg(); | 1198 auto *DestT = I32Reg(); |
| 1186 auto *T = I32Reg(); | 1199 auto *T = I32Reg(); |
| 1187 _sltu(T, Src0R, Src1R); | 1200 _sltu(T, Src0RT, Src1RT); |
| 1188 _xori(DestT, T, 1); | 1201 _xori(DestT, T, 1); |
| 1189 _mov(Dest, DestT); | 1202 _mov(Dest, DestT); |
| 1190 return; | 1203 return; |
| 1191 } | 1204 } |
| 1192 case InstIcmp::Ult: { | 1205 case InstIcmp::Ult: { |
| 1193 auto *DestT = I32Reg(); | 1206 auto *DestT = I32Reg(); |
| 1194 _sltu(DestT, Src0R, Src1R); | 1207 _sltu(DestT, Src0RT, Src1RT); |
| 1195 _mov(Dest, DestT); | 1208 _mov(Dest, DestT); |
| 1196 return; | 1209 return; |
| 1197 } | 1210 } |
| 1198 case InstIcmp::Ule: { | 1211 case InstIcmp::Ule: { |
| 1199 auto *DestT = I32Reg(); | 1212 auto *DestT = I32Reg(); |
| 1200 auto *T = I32Reg(); | 1213 auto *T = I32Reg(); |
| 1201 _sltu(T, Src1R, Src0R); | 1214 _sltu(T, Src1RT, Src0RT); |
| 1202 _xori(DestT, T, 1); | 1215 _xori(DestT, T, 1); |
| 1203 _mov(Dest, DestT); | 1216 _mov(Dest, DestT); |
| 1204 return; | 1217 return; |
| 1205 } | 1218 } |
| 1206 case InstIcmp::Sgt: { | 1219 case InstIcmp::Sgt: { |
| 1207 auto *DestT = I32Reg(); | 1220 auto *DestT = I32Reg(); |
| 1208 _slt(DestT, Src1R, Src0R); | 1221 _slt(DestT, Src1RT, Src0RT); |
| 1209 _mov(Dest, DestT); | 1222 _mov(Dest, DestT); |
| 1210 return; | 1223 return; |
| 1211 } | 1224 } |
| 1212 case InstIcmp::Sge: { | 1225 case InstIcmp::Sge: { |
| 1213 auto *DestT = I32Reg(); | 1226 auto *DestT = I32Reg(); |
| 1214 auto *T = I32Reg(); | 1227 auto *T = I32Reg(); |
| 1215 _slt(T, Src0R, Src1R); | 1228 _slt(T, Src0RT, Src1RT); |
| 1216 _xori(DestT, T, 1); | 1229 _xori(DestT, T, 1); |
| 1217 _mov(Dest, DestT); | 1230 _mov(Dest, DestT); |
| 1218 return; | 1231 return; |
| 1219 } | 1232 } |
| 1220 case InstIcmp::Slt: { | 1233 case InstIcmp::Slt: { |
| 1221 auto *DestT = I32Reg(); | 1234 auto *DestT = I32Reg(); |
| 1222 _slt(DestT, Src0R, Src1R); | 1235 _slt(DestT, Src0RT, Src1RT); |
| 1223 _mov(Dest, DestT); | 1236 _mov(Dest, DestT); |
| 1224 return; | 1237 return; |
| 1225 } | 1238 } |
| 1226 case InstIcmp::Sle: { | 1239 case InstIcmp::Sle: { |
| 1227 auto *DestT = I32Reg(); | 1240 auto *DestT = I32Reg(); |
| 1228 auto *T = I32Reg(); | 1241 auto *T = I32Reg(); |
| 1229 _slt(T, Src1R, Src0R); | 1242 _slt(T, Src1RT, Src0RT); |
| 1230 _xori(DestT, T, 1); | 1243 _xori(DestT, T, 1); |
| 1231 _mov(Dest, DestT); | 1244 _mov(Dest, DestT); |
| 1232 return; | 1245 return; |
| 1233 } | 1246 } |
| 1234 default: | 1247 default: |
| 1235 llvm_unreachable("Invalid ICmp operator"); | 1248 llvm_unreachable("Invalid ICmp operator"); |
| 1236 return; | 1249 return; |
| 1237 } | 1250 } |
| 1238 } | 1251 } |
| 1239 | 1252 |
| (...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1668 Str << "\t.set\t" | 1681 Str << "\t.set\t" |
| 1669 << "nomips16\n"; | 1682 << "nomips16\n"; |
| 1670 } | 1683 } |
| 1671 | 1684 |
| 1672 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 1685 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
| 1673 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 1686 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
| 1674 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 1687 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
| 1675 | 1688 |
| 1676 } // end of namespace MIPS32 | 1689 } // end of namespace MIPS32 |
| 1677 } // end of namespace Ice | 1690 } // end of namespace Ice |
| OLD | NEW |