| 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 | 
|---|