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 2221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2232 auto *BooleanR = legalizeToReg(Boolean); | 2232 auto *BooleanR = legalizeToReg(Boolean); |
2233 _br(TargetTrue, TargetFalse, BooleanR, CondMIPS32::Cond::EQZ); | 2233 _br(TargetTrue, TargetFalse, BooleanR, CondMIPS32::Cond::EQZ); |
2234 return; | 2234 return; |
2235 } | 2235 } |
2236 if (Producer->getKind() == Inst::Icmp) { | 2236 if (Producer->getKind() == Inst::Icmp) { |
2237 const InstIcmp *CompareInst = llvm::cast<InstIcmp>(Producer); | 2237 const InstIcmp *CompareInst = llvm::cast<InstIcmp>(Producer); |
2238 Operand *Src0 = CompareInst->getSrc(0); | 2238 Operand *Src0 = CompareInst->getSrc(0); |
2239 Operand *Src1 = CompareInst->getSrc(1); | 2239 Operand *Src1 = CompareInst->getSrc(1); |
2240 const Type Src0Ty = Src0->getType(); | 2240 const Type Src0Ty = Src0->getType(); |
2241 assert(Src0Ty == Src1->getType()); | 2241 assert(Src0Ty == Src1->getType()); |
| 2242 |
| 2243 Variable *Src0R = nullptr; |
| 2244 Variable *Src1R = nullptr; |
| 2245 Variable *Src0HiR = nullptr; |
| 2246 Variable *Src1HiR = nullptr; |
2242 if (Src0Ty == IceType_i64) { | 2247 if (Src0Ty == IceType_i64) { |
2243 UnimplementedLoweringError(this, Instr); | 2248 Src0R = legalizeToReg(loOperand(Src0)); |
2244 return; | 2249 Src1R = legalizeToReg(loOperand(Src1)); |
2245 } | 2250 Src0HiR = legalizeToReg(hiOperand(Src0)); |
2246 auto *Src0R = legalizeToReg(Src0); | 2251 Src1HiR = legalizeToReg(hiOperand(Src1)); |
2247 auto *Src1R = legalizeToReg(Src1); | 2252 } else { |
2248 auto *DestT = makeReg(Src0Ty); | 2253 Src0R = legalizeToReg(Src0); |
| 2254 Src1R = legalizeToReg(Src1); |
| 2255 } |
| 2256 auto *DestT = makeReg(IceType_i32); |
| 2257 |
2249 switch (CompareInst->getCondition()) { | 2258 switch (CompareInst->getCondition()) { |
2250 default: | 2259 default: |
2251 break; | 2260 llvm_unreachable("unexpected condition"); |
| 2261 return; |
2252 case InstIcmp::Eq: { | 2262 case InstIcmp::Eq: { |
2253 _br(TargetTrue, TargetFalse, Src0R, Src1R, CondMIPS32::Cond::NE); | 2263 if (Src0Ty == IceType_i64) { |
2254 break; | 2264 auto *T1 = I32Reg(); |
| 2265 auto *T2 = I32Reg(); |
| 2266 auto *T3 = I32Reg(); |
| 2267 _xor(T1, Src0HiR, Src1HiR); |
| 2268 _xor(T2, Src0R, Src1R); |
| 2269 _or(T3, T1, T2); |
| 2270 _mov(DestT, T3); |
| 2271 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); |
| 2272 } else { |
| 2273 _br(TargetTrue, TargetFalse, Src0R, Src1R, CondMIPS32::Cond::NE); |
| 2274 } |
| 2275 return; |
2255 } | 2276 } |
2256 case InstIcmp::Ne: { | 2277 case InstIcmp::Ne: { |
2257 _br(TargetTrue, TargetFalse, Src0R, Src1R, CondMIPS32::Cond::EQ); | 2278 if (Src0Ty == IceType_i64) { |
2258 break; | 2279 auto *T1 = I32Reg(); |
| 2280 auto *T2 = I32Reg(); |
| 2281 auto *T3 = I32Reg(); |
| 2282 _xor(T1, Src0HiR, Src1HiR); |
| 2283 _xor(T2, Src0R, Src1R); |
| 2284 _or(T3, T1, T2); |
| 2285 _mov(DestT, T3); |
| 2286 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ); |
| 2287 } else { |
| 2288 _br(TargetTrue, TargetFalse, Src0R, Src1R, CondMIPS32::Cond::EQ); |
| 2289 } |
| 2290 return; |
2259 } | 2291 } |
2260 case InstIcmp::Ugt: { | 2292 case InstIcmp::Ugt: { |
2261 _sltu(DestT, Src1R, Src0R); | 2293 if (Src0Ty == IceType_i64) { |
2262 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ); | 2294 auto *T1 = I32Reg(); |
2263 break; | 2295 auto *T2 = I32Reg(); |
| 2296 auto *T3 = I32Reg(); |
| 2297 auto *T4 = I32Reg(); |
| 2298 auto *T5 = I32Reg(); |
| 2299 _xor(T1, Src0HiR, Src1HiR); |
| 2300 _sltu(T2, Src1HiR, Src0HiR); |
| 2301 _xori(T3, T2, 1); |
| 2302 _sltu(T4, Src1R, Src0R); |
| 2303 _xori(T5, T4, 1); |
| 2304 _movz(T3, T5, T1); |
| 2305 _mov(DestT, T3); |
| 2306 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); |
| 2307 } else { |
| 2308 _sltu(DestT, Src1R, Src0R); |
| 2309 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ); |
| 2310 } |
| 2311 return; |
2264 } | 2312 } |
2265 case InstIcmp::Uge: { | 2313 case InstIcmp::Uge: { |
2266 _sltu(DestT, Src0R, Src1R); | 2314 if (Src0Ty == IceType_i64) { |
2267 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); | 2315 auto *T1 = I32Reg(); |
2268 break; | 2316 auto *T2 = I32Reg(); |
| 2317 auto *T3 = I32Reg(); |
| 2318 _xor(T1, Src0HiR, Src1HiR); |
| 2319 _sltu(T2, Src0HiR, Src1HiR); |
| 2320 _sltu(T3, Src0R, Src1R); |
| 2321 _movz(T2, T3, T1); |
| 2322 _mov(DestT, T2); |
| 2323 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); |
| 2324 } else { |
| 2325 _sltu(DestT, Src0R, Src1R); |
| 2326 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); |
| 2327 } |
| 2328 return; |
2269 } | 2329 } |
2270 case InstIcmp::Ult: { | 2330 case InstIcmp::Ult: { |
2271 _sltu(DestT, Src0R, Src1R); | 2331 if (Src0Ty == IceType_i64) { |
2272 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ); | 2332 auto *T1 = I32Reg(); |
2273 break; | 2333 auto *T2 = I32Reg(); |
| 2334 auto *T3 = I32Reg(); |
| 2335 auto *T4 = I32Reg(); |
| 2336 auto *T5 = I32Reg(); |
| 2337 _xor(T1, Src0HiR, Src1HiR); |
| 2338 _sltu(T2, Src0HiR, Src1HiR); |
| 2339 _xori(T3, T2, 1); |
| 2340 _sltu(T4, Src0R, Src1R); |
| 2341 _xori(T5, T4, 1); |
| 2342 _movz(T3, T5, T1); |
| 2343 _mov(DestT, T3); |
| 2344 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); |
| 2345 } else { |
| 2346 _sltu(DestT, Src0R, Src1R); |
| 2347 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ); |
| 2348 } |
| 2349 return; |
2274 } | 2350 } |
2275 case InstIcmp::Ule: { | 2351 case InstIcmp::Ule: { |
2276 _sltu(DestT, Src1R, Src0R); | 2352 if (Src0Ty == IceType_i64) { |
2277 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); | 2353 auto *T1 = I32Reg(); |
2278 break; | 2354 auto *T2 = I32Reg(); |
| 2355 auto *T3 = I32Reg(); |
| 2356 _xor(T1, Src0HiR, Src1HiR); |
| 2357 _sltu(T2, Src1HiR, Src0HiR); |
| 2358 _sltu(T3, Src1R, Src0R); |
| 2359 _movz(T2, T3, T1); |
| 2360 _mov(DestT, T2); |
| 2361 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); |
| 2362 } else { |
| 2363 _sltu(DestT, Src1R, Src0R); |
| 2364 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); |
| 2365 } |
| 2366 return; |
2279 } | 2367 } |
2280 case InstIcmp::Sgt: { | 2368 case InstIcmp::Sgt: { |
2281 _slt(DestT, Src1R, Src0R); | 2369 if (Src0Ty == IceType_i64) { |
2282 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ); | 2370 auto *T1 = I32Reg(); |
2283 break; | 2371 auto *T2 = I32Reg(); |
| 2372 auto *T3 = I32Reg(); |
| 2373 auto *T4 = I32Reg(); |
| 2374 auto *T5 = I32Reg(); |
| 2375 _xor(T1, Src0HiR, Src1HiR); |
| 2376 _slt(T2, Src1HiR, Src0HiR); |
| 2377 _xori(T3, T2, 1); |
| 2378 _sltu(T4, Src1R, Src0R); |
| 2379 _xori(T5, T4, 1); |
| 2380 _movz(T3, T5, T1); |
| 2381 _mov(DestT, T3); |
| 2382 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); |
| 2383 } else { |
| 2384 _slt(DestT, Src1R, Src0R); |
| 2385 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ); |
| 2386 } |
| 2387 return; |
2284 } | 2388 } |
2285 case InstIcmp::Sge: { | 2389 case InstIcmp::Sge: { |
2286 _slt(DestT, Src0R, Src1R); | 2390 if (Src0Ty == IceType_i64) { |
2287 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); | 2391 auto *T1 = I32Reg(); |
2288 break; | 2392 auto *T2 = I32Reg(); |
| 2393 auto *T3 = I32Reg(); |
| 2394 _xor(T1, Src0HiR, Src1HiR); |
| 2395 _slt(T2, Src0HiR, Src1HiR); |
| 2396 _sltu(T3, Src0R, Src1R); |
| 2397 _movz(T2, T3, T1); |
| 2398 _mov(DestT, T2); |
| 2399 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); |
| 2400 } else { |
| 2401 _slt(DestT, Src0R, Src1R); |
| 2402 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); |
| 2403 } |
| 2404 return; |
2289 } | 2405 } |
2290 case InstIcmp::Slt: { | 2406 case InstIcmp::Slt: { |
2291 _slt(DestT, Src0R, Src1R); | 2407 if (Src0Ty == IceType_i64) { |
2292 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ); | 2408 auto *T1 = I32Reg(); |
2293 break; | 2409 auto *T2 = I32Reg(); |
| 2410 auto *T3 = I32Reg(); |
| 2411 auto *T4 = I32Reg(); |
| 2412 auto *T5 = I32Reg(); |
| 2413 _xor(T1, Src0HiR, Src1HiR); |
| 2414 _slt(T2, Src0HiR, Src1HiR); |
| 2415 _xori(T3, T2, 1); |
| 2416 _sltu(T4, Src0R, Src1R); |
| 2417 _xori(T5, T4, 1); |
| 2418 _movz(T3, T5, T1); |
| 2419 _mov(DestT, T3); |
| 2420 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); |
| 2421 } else { |
| 2422 _slt(DestT, Src0R, Src1R); |
| 2423 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ); |
| 2424 } |
| 2425 return; |
2294 } | 2426 } |
2295 case InstIcmp::Sle: { | 2427 case InstIcmp::Sle: { |
2296 _slt(DestT, Src1R, Src0R); | 2428 if (Src0Ty == IceType_i64) { |
2297 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); | 2429 auto *T1 = I32Reg(); |
2298 break; | 2430 auto *T2 = I32Reg(); |
| 2431 auto *T3 = I32Reg(); |
| 2432 _xor(T1, Src0HiR, Src1HiR); |
| 2433 _slt(T2, Src1HiR, Src0HiR); |
| 2434 _sltu(T3, Src1R, Src0R); |
| 2435 _movz(T2, T3, T1); |
| 2436 _mov(DestT, T2); |
| 2437 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); |
| 2438 } else { |
| 2439 _slt(DestT, Src1R, Src0R); |
| 2440 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); |
| 2441 } |
| 2442 return; |
2299 } | 2443 } |
2300 } | 2444 } |
2301 } | 2445 } |
2302 } | 2446 } |
2303 | 2447 |
2304 void TargetMIPS32::lowerCall(const InstCall *Instr) { | 2448 void TargetMIPS32::lowerCall(const InstCall *Instr) { |
2305 NeedsStackAlignment = true; | 2449 NeedsStackAlignment = true; |
2306 | 2450 |
2307 // Assign arguments to registers and stack. Also reserve stack. | 2451 // Assign arguments to registers and stack. Also reserve stack. |
2308 TargetMIPS32::CallingConv CC; | 2452 TargetMIPS32::CallingConv CC; |
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2906 InstIcmp::ICond Condition = Instr->getCondition(); | 3050 InstIcmp::ICond Condition = Instr->getCondition(); |
2907 | 3051 |
2908 Variable *Src0LoR = legalizeToReg(loOperand(Src0)); | 3052 Variable *Src0LoR = legalizeToReg(loOperand(Src0)); |
2909 Variable *Src0HiR = legalizeToReg(hiOperand(Src0)); | 3053 Variable *Src0HiR = legalizeToReg(hiOperand(Src0)); |
2910 Variable *Src1LoR = legalizeToReg(loOperand(Src1)); | 3054 Variable *Src1LoR = legalizeToReg(loOperand(Src1)); |
2911 Variable *Src1HiR = legalizeToReg(hiOperand(Src1)); | 3055 Variable *Src1HiR = legalizeToReg(hiOperand(Src1)); |
2912 | 3056 |
2913 switch (Condition) { | 3057 switch (Condition) { |
2914 default: | 3058 default: |
2915 llvm_unreachable("unexpected condition"); | 3059 llvm_unreachable("unexpected condition"); |
2916 break; | 3060 return; |
2917 case InstIcmp::Eq: { | 3061 case InstIcmp::Eq: { |
2918 auto *T1 = I32Reg(); | 3062 auto *T1 = I32Reg(); |
2919 auto *T2 = I32Reg(); | 3063 auto *T2 = I32Reg(); |
2920 auto *T3 = I32Reg(); | 3064 auto *T3 = I32Reg(); |
2921 auto *T4 = I32Reg(); | 3065 auto *T4 = I32Reg(); |
2922 _xor(T1, Src0HiR, Src1HiR); | 3066 _xor(T1, Src0HiR, Src1HiR); |
2923 _xor(T2, Src0LoR, Src1LoR); | 3067 _xor(T2, Src0LoR, Src1LoR); |
2924 _or(T3, T1, T2); | 3068 _or(T3, T1, T2); |
2925 _sltiu(T4, T3, 1); | 3069 _sltiu(T4, T3, 1); |
2926 _mov(Dest, T4); | 3070 _mov(Dest, T4); |
(...skipping 1362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4289 Str << "\t.set\t" | 4433 Str << "\t.set\t" |
4290 << "nomips16\n"; | 4434 << "nomips16\n"; |
4291 } | 4435 } |
4292 | 4436 |
4293 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 4437 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
4294 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 4438 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
4295 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 4439 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
4296 | 4440 |
4297 } // end of namespace MIPS32 | 4441 } // end of namespace MIPS32 |
4298 } // end of namespace Ice | 4442 } // end of namespace Ice |
OLD | NEW |