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 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 const uint32_t Mask = (1 << getScalarIntBitWidth(Src0->getType())) - 1; | |
| 1163 Variable *Src0RT = I32Reg(); | |
| 1164 Variable *Src1RT = I32Reg(); | |
| 1165 | |
| 1166 if (Src0Ty != IceType_i32) { | |
| 1167 Variable *T1 = I32Reg(); | |
| 1168 Variable *T2 = I32Reg(); | |
| 1169 switch (Cond) { | |
| 1170 default: | |
| 1171 llvm_unreachable("Invalid ICmp operator"); | |
| 1172 break; | |
| 1173 case InstIcmp::Eq: | |
| 1174 case InstIcmp::Ne: | |
| 1175 case InstIcmp::Ugt: | |
| 1176 case InstIcmp::Uge: | |
| 1177 case InstIcmp::Ult: | |
| 1178 case InstIcmp::Ule: { | |
| 1179 _andi(Src0RT, Src0R, Mask); | |
|
John
2016/05/31 14:16:38
For ARM, Subzero does not bother clearing the uppe
sagar.thakur
2016/06/01 13:17:22
Yes, I agree with this approach. Updated the patch
| |
| 1180 _andi(Src1RT, Src1R, Mask); | |
| 1181 break; | |
| 1182 } | |
| 1183 case InstIcmp::Sgt: | |
| 1184 case InstIcmp::Sge: | |
| 1185 case InstIcmp::Slt: | |
| 1186 case InstIcmp::Sle: { | |
| 1187 _sll(T1, Src0R, ShAmt); | |
| 1188 _sra(Src0RT, T1, ShAmt); | |
| 1189 _sll(T2, Src1R, ShAmt); | |
| 1190 _sra(Src1RT, T2, ShAmt); | |
| 1191 break; | |
| 1192 } | |
| 1193 } | |
| 1194 } else { | |
| 1195 _mov(Src0RT, Src0R); | |
| 1196 _mov(Src1RT, Src1R); | |
| 1197 } | |
| 1198 | |
| 1160 switch (Cond) { | 1199 switch (Cond) { |
| 1161 case InstIcmp::Eq: { | 1200 case InstIcmp::Eq: { |
| 1162 auto *DestT = I32Reg(); | 1201 auto *DestT = I32Reg(); |
| 1163 auto *T = I32Reg(); | 1202 auto *T = I32Reg(); |
| 1164 _xor(T, Src0R, Src1R); | 1203 _xor(T, Src0RT, Src1RT); |
| 1165 _sltiu(DestT, T, 1); | 1204 _sltiu(DestT, T, 1); |
| 1166 _mov(Dest, DestT); | 1205 _mov(Dest, DestT); |
| 1167 return; | 1206 return; |
| 1168 } | 1207 } |
| 1169 case InstIcmp::Ne: { | 1208 case InstIcmp::Ne: { |
| 1170 auto *DestT = I32Reg(); | 1209 auto *DestT = I32Reg(); |
| 1171 auto *T = I32Reg(); | 1210 auto *T = I32Reg(); |
| 1172 auto *Zero = getZero(); | 1211 auto *Zero = getZero(); |
| 1173 _xor(T, Src0R, Src1R); | 1212 _xor(T, Src0RT, Src1RT); |
| 1174 _sltu(DestT, Zero, T); | 1213 _sltu(DestT, Zero, T); |
| 1175 _mov(Dest, DestT); | 1214 _mov(Dest, DestT); |
| 1176 return; | 1215 return; |
| 1177 } | 1216 } |
| 1178 case InstIcmp::Ugt: { | 1217 case InstIcmp::Ugt: { |
| 1179 auto *DestT = I32Reg(); | 1218 auto *DestT = I32Reg(); |
| 1180 _sltu(DestT, Src1R, Src0R); | 1219 _sltu(DestT, Src1RT, Src0RT); |
| 1181 _mov(Dest, DestT); | 1220 _mov(Dest, DestT); |
| 1182 return; | 1221 return; |
| 1183 } | 1222 } |
| 1184 case InstIcmp::Uge: { | 1223 case InstIcmp::Uge: { |
| 1185 auto *DestT = I32Reg(); | 1224 auto *DestT = I32Reg(); |
| 1186 auto *T = I32Reg(); | 1225 auto *T = I32Reg(); |
| 1187 _sltu(T, Src0R, Src1R); | 1226 _sltu(T, Src0RT, Src1RT); |
| 1188 _xori(DestT, T, 1); | 1227 _xori(DestT, T, 1); |
| 1189 _mov(Dest, DestT); | 1228 _mov(Dest, DestT); |
| 1190 return; | 1229 return; |
| 1191 } | 1230 } |
| 1192 case InstIcmp::Ult: { | 1231 case InstIcmp::Ult: { |
| 1193 auto *DestT = I32Reg(); | 1232 auto *DestT = I32Reg(); |
| 1194 _sltu(DestT, Src0R, Src1R); | 1233 _sltu(DestT, Src0RT, Src1RT); |
| 1195 _mov(Dest, DestT); | 1234 _mov(Dest, DestT); |
| 1196 return; | 1235 return; |
| 1197 } | 1236 } |
| 1198 case InstIcmp::Ule: { | 1237 case InstIcmp::Ule: { |
| 1199 auto *DestT = I32Reg(); | 1238 auto *DestT = I32Reg(); |
| 1200 auto *T = I32Reg(); | 1239 auto *T = I32Reg(); |
| 1201 _sltu(T, Src1R, Src0R); | 1240 _sltu(T, Src1RT, Src0RT); |
| 1202 _xori(DestT, T, 1); | 1241 _xori(DestT, T, 1); |
| 1203 _mov(Dest, DestT); | 1242 _mov(Dest, DestT); |
| 1204 return; | 1243 return; |
| 1205 } | 1244 } |
| 1206 case InstIcmp::Sgt: { | 1245 case InstIcmp::Sgt: { |
| 1207 auto *DestT = I32Reg(); | 1246 auto *DestT = I32Reg(); |
| 1208 _slt(DestT, Src1R, Src0R); | 1247 _slt(DestT, Src1RT, Src0RT); |
| 1209 _mov(Dest, DestT); | 1248 _mov(Dest, DestT); |
| 1210 return; | 1249 return; |
| 1211 } | 1250 } |
| 1212 case InstIcmp::Sge: { | 1251 case InstIcmp::Sge: { |
| 1213 auto *DestT = I32Reg(); | 1252 auto *DestT = I32Reg(); |
| 1214 auto *T = I32Reg(); | 1253 auto *T = I32Reg(); |
| 1215 _slt(T, Src0R, Src1R); | 1254 _slt(T, Src0RT, Src1RT); |
| 1216 _xori(DestT, T, 1); | 1255 _xori(DestT, T, 1); |
| 1217 _mov(Dest, DestT); | 1256 _mov(Dest, DestT); |
| 1218 return; | 1257 return; |
| 1219 } | 1258 } |
| 1220 case InstIcmp::Slt: { | 1259 case InstIcmp::Slt: { |
| 1221 auto *DestT = I32Reg(); | 1260 auto *DestT = I32Reg(); |
| 1222 _slt(DestT, Src0R, Src1R); | 1261 _slt(DestT, Src0RT, Src1RT); |
| 1223 _mov(Dest, DestT); | 1262 _mov(Dest, DestT); |
| 1224 return; | 1263 return; |
| 1225 } | 1264 } |
| 1226 case InstIcmp::Sle: { | 1265 case InstIcmp::Sle: { |
| 1227 auto *DestT = I32Reg(); | 1266 auto *DestT = I32Reg(); |
| 1228 auto *T = I32Reg(); | 1267 auto *T = I32Reg(); |
| 1229 _slt(T, Src1R, Src0R); | 1268 _slt(T, Src1RT, Src0RT); |
| 1230 _xori(DestT, T, 1); | 1269 _xori(DestT, T, 1); |
| 1231 _mov(Dest, DestT); | 1270 _mov(Dest, DestT); |
| 1232 return; | 1271 return; |
| 1233 } | 1272 } |
| 1234 default: | 1273 default: |
| 1235 llvm_unreachable("Invalid ICmp operator"); | 1274 llvm_unreachable("Invalid ICmp operator"); |
| 1236 return; | 1275 return; |
| 1237 } | 1276 } |
| 1238 } | 1277 } |
| 1239 | 1278 |
| (...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1668 Str << "\t.set\t" | 1707 Str << "\t.set\t" |
| 1669 << "nomips16\n"; | 1708 << "nomips16\n"; |
| 1670 } | 1709 } |
| 1671 | 1710 |
| 1672 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 1711 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
| 1673 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 1712 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
| 1674 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 1713 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
| 1675 | 1714 |
| 1676 } // end of namespace MIPS32 | 1715 } // end of namespace MIPS32 |
| 1677 } // end of namespace Ice | 1716 } // end of namespace Ice |
| OLD | NEW |