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

Side by Side Diff: src/IceTargetLoweringMIPS32.cpp

Issue 2022063003: [Subzero][MIPS32] Implement icmp operation for i8, i16 operands (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 4 years, 6 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
« no previous file with comments | « no previous file | tests_lit/llvm2ice_tests/icmp.ll » ('j') | tests_lit/llvm2ice_tests/icmp.ll » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1139 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
OLDNEW
« no previous file with comments | « no previous file | tests_lit/llvm2ice_tests/icmp.ll » ('j') | tests_lit/llvm2ice_tests/icmp.ll » ('J')

Powered by Google App Engine
This is Rietveld 408576698