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 1236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1247 lowerInt64Arithmetic(Instr, Instr->getDest(), Src0, Src1); | 1247 lowerInt64Arithmetic(Instr, Instr->getDest(), Src0, Src1); |
1248 return; | 1248 return; |
1249 } | 1249 } |
1250 if (isVectorType(Dest->getType())) { | 1250 if (isVectorType(Dest->getType())) { |
1251 UnimplementedLoweringError(this, Instr); | 1251 UnimplementedLoweringError(this, Instr); |
1252 return; | 1252 return; |
1253 } | 1253 } |
1254 switch (Instr->getOp()) { | 1254 switch (Instr->getOp()) { |
1255 default: | 1255 default: |
1256 break; | 1256 break; |
1257 case InstArithmetic::Fadd: | |
1258 case InstArithmetic::Fsub: | |
1259 case InstArithmetic::Fmul: | |
1260 case InstArithmetic::Fdiv: | |
1261 case InstArithmetic::Frem: | 1257 case InstArithmetic::Frem: |
1262 UnimplementedLoweringError(this, Instr); | 1258 UnimplementedLoweringError(this, Instr); |
1263 return; | 1259 return; |
1264 } | 1260 } |
1265 | 1261 |
1266 // At this point Dest->getType() is non-i64 scalar | 1262 // At this point Dest->getType() is non-i64 scalar |
1267 | 1263 |
1268 Variable *T = makeReg(Dest->getType()); | 1264 Variable *T = makeReg(Dest->getType()); |
1269 Variable *Src0R = legalizeToReg(Src0); | 1265 Variable *Src0R = legalizeToReg(Src0); |
1270 Variable *Src1R = legalizeToReg(Src1); | 1266 Variable *Src1R = legalizeToReg(Src1); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1333 _mov(Dest, T); | 1329 _mov(Dest, T); |
1334 return; | 1330 return; |
1335 } | 1331 } |
1336 case InstArithmetic::Srem: { | 1332 case InstArithmetic::Srem: { |
1337 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO); | 1333 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO); |
1338 _div(T_Zero, Src0R, Src1R); | 1334 _div(T_Zero, Src0R, Src1R); |
1339 _mfhi(T, T_Zero); | 1335 _mfhi(T, T_Zero); |
1340 _mov(Dest, T); | 1336 _mov(Dest, T); |
1341 return; | 1337 return; |
1342 } | 1338 } |
1343 case InstArithmetic::Fadd: | 1339 case InstArithmetic::Fadd: { |
| 1340 if (DestTy == IceType_f32) { |
| 1341 _add_s(T, Src0R, Src1R); |
| 1342 _mov(Dest, T); |
| 1343 return; |
| 1344 } |
| 1345 if (DestTy == IceType_f64) { |
| 1346 _add_d(T, Src0R, Src1R); |
| 1347 _mov(Dest, T); |
| 1348 return; |
| 1349 } |
1344 break; | 1350 break; |
| 1351 } |
1345 case InstArithmetic::Fsub: | 1352 case InstArithmetic::Fsub: |
| 1353 if (DestTy == IceType_f32) { |
| 1354 _sub_s(T, Src0R, Src1R); |
| 1355 _mov(Dest, T); |
| 1356 return; |
| 1357 } |
| 1358 if (DestTy == IceType_f64) { |
| 1359 _sub_d(T, Src0R, Src1R); |
| 1360 _mov(Dest, T); |
| 1361 return; |
| 1362 } |
1346 break; | 1363 break; |
1347 case InstArithmetic::Fmul: | 1364 case InstArithmetic::Fmul: |
| 1365 if (DestTy == IceType_f32) { |
| 1366 _mul_s(T, Src0R, Src1R); |
| 1367 _mov(Dest, T); |
| 1368 return; |
| 1369 } |
| 1370 if (DestTy == IceType_f64) { |
| 1371 _mul_d(T, Src0R, Src1R); |
| 1372 _mov(Dest, T); |
| 1373 return; |
| 1374 } |
1348 break; | 1375 break; |
1349 case InstArithmetic::Fdiv: | 1376 case InstArithmetic::Fdiv: |
| 1377 if (DestTy == IceType_f32) { |
| 1378 _div_s(T, Src0R, Src1R); |
| 1379 _mov(Dest, T); |
| 1380 return; |
| 1381 } |
| 1382 if (DestTy == IceType_f64) { |
| 1383 _div_d(T, Src0R, Src1R); |
| 1384 _mov(Dest, T); |
| 1385 return; |
| 1386 } |
1350 break; | 1387 break; |
1351 case InstArithmetic::Frem: | 1388 case InstArithmetic::Frem: |
1352 break; | 1389 break; |
1353 } | 1390 } |
1354 UnimplementedLoweringError(this, Instr); | 1391 UnimplementedLoweringError(this, Instr); |
1355 } | 1392 } |
1356 | 1393 |
1357 void TargetMIPS32::lowerAssign(const InstAssign *Instr) { | 1394 void TargetMIPS32::lowerAssign(const InstAssign *Instr) { |
1358 Variable *Dest = Instr->getDest(); | 1395 Variable *Dest = Instr->getDest(); |
1359 Operand *Src0 = Instr->getSrc(0); | 1396 Operand *Src0 = Instr->getSrc(0); |
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2061 break; | 2098 break; |
2062 } | 2099 } |
2063 case IceType_i64: { | 2100 case IceType_i64: { |
2064 Src0 = legalizeUndef(Src0); | 2101 Src0 = legalizeUndef(Src0); |
2065 Variable *R0 = legalizeToReg(loOperand(Src0), RegMIPS32::Reg_V0); | 2102 Variable *R0 = legalizeToReg(loOperand(Src0), RegMIPS32::Reg_V0); |
2066 Variable *R1 = legalizeToReg(hiOperand(Src0), RegMIPS32::Reg_V1); | 2103 Variable *R1 = legalizeToReg(hiOperand(Src0), RegMIPS32::Reg_V1); |
2067 Reg = R0; | 2104 Reg = R0; |
2068 Context.insert<InstFakeUse>(R1); | 2105 Context.insert<InstFakeUse>(R1); |
2069 break; | 2106 break; |
2070 } | 2107 } |
2071 | |
2072 default: | 2108 default: |
2073 UnimplementedLoweringError(this, Instr); | 2109 UnimplementedLoweringError(this, Instr); |
2074 } | 2110 } |
2075 } | 2111 } |
2076 _ret(getPhysicalRegister(RegMIPS32::Reg_RA), Reg); | 2112 _ret(getPhysicalRegister(RegMIPS32::Reg_RA), Reg); |
2077 } | 2113 } |
2078 | 2114 |
2079 void TargetMIPS32::lowerSelect(const InstSelect *Instr) { | 2115 void TargetMIPS32::lowerSelect(const InstSelect *Instr) { |
2080 UnimplementedLoweringError(this, Instr); | 2116 UnimplementedLoweringError(this, Instr); |
2081 } | 2117 } |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2184 return; | 2220 return; |
2185 } | 2221 } |
2186 | 2222 |
2187 // Helper for legalize() to emit the right code to lower an operand to a | 2223 // Helper for legalize() to emit the right code to lower an operand to a |
2188 // register of the appropriate type. | 2224 // register of the appropriate type. |
2189 Variable *TargetMIPS32::copyToReg(Operand *Src, RegNumT RegNum) { | 2225 Variable *TargetMIPS32::copyToReg(Operand *Src, RegNumT RegNum) { |
2190 Type Ty = Src->getType(); | 2226 Type Ty = Src->getType(); |
2191 Variable *Reg = makeReg(Ty, RegNum); | 2227 Variable *Reg = makeReg(Ty, RegNum); |
2192 if (isVectorType(Ty)) { | 2228 if (isVectorType(Ty)) { |
2193 UnimplementedError(getFlags()); | 2229 UnimplementedError(getFlags()); |
2194 } else if (isFloatingType(Ty)) { | |
2195 (Ty == IceType_f32) ? _mov_s(Reg, llvm::dyn_cast<Variable>(Src)) | |
2196 : _mov_d(Reg, llvm::dyn_cast<Variable>(Src)); | |
2197 } else { | 2230 } else { |
2198 // Mov's Src operand can really only be the flexible second operand type | 2231 // Mov's Src operand can really only be the flexible second operand type |
2199 // or a register. Users should guarantee that. | 2232 // or a register. Users should guarantee that. |
2200 _mov(Reg, Src); | 2233 _mov(Reg, Src); |
2201 } | 2234 } |
2202 return Reg; | 2235 return Reg; |
2203 } | 2236 } |
2204 | 2237 |
2205 Operand *TargetMIPS32::legalize(Operand *From, LegalMask Allowed, | 2238 Operand *TargetMIPS32::legalize(Operand *From, LegalMask Allowed, |
2206 RegNumT RegNum) { | 2239 RegNumT RegNum) { |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2360 Str << "\t.set\t" | 2393 Str << "\t.set\t" |
2361 << "nomips16\n"; | 2394 << "nomips16\n"; |
2362 } | 2395 } |
2363 | 2396 |
2364 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 2397 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
2365 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 2398 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
2366 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 2399 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
2367 | 2400 |
2368 } // end of namespace MIPS32 | 2401 } // end of namespace MIPS32 |
2369 } // end of namespace Ice | 2402 } // end of namespace Ice |
OLD | NEW |