| 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 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 const Type DestTy = Dest->getType(); | 302 const Type DestTy = Dest->getType(); |
| 303 const Type SrcTy = Src0->getType(); | 303 const Type SrcTy = Src0->getType(); |
| 304 auto *CastInstr = llvm::cast<InstCast>(Instr); | 304 auto *CastInstr = llvm::cast<InstCast>(Instr); |
| 305 const InstCast::OpKind CastKind = CastInstr->getCastKind(); | 305 const InstCast::OpKind CastKind = CastInstr->getCastKind(); |
| 306 | 306 |
| 307 switch (CastKind) { | 307 switch (CastKind) { |
| 308 default: | 308 default: |
| 309 return; | 309 return; |
| 310 case InstCast::Fptosi: | 310 case InstCast::Fptosi: |
| 311 case InstCast::Fptoui: { | 311 case InstCast::Fptoui: { |
| 312 if (DestTy != IceType_i64) { | 312 if ((DestTy != IceType_i32) && (DestTy != IceType_i64)) { |
| 313 return; | 313 return; |
| 314 } | 314 } |
| 315 const bool DestIs32 = DestTy == IceType_i32; |
| 315 const bool DestIsSigned = CastKind == InstCast::Fptosi; | 316 const bool DestIsSigned = CastKind == InstCast::Fptosi; |
| 316 const bool Src0IsF32 = isFloat32Asserting32Or64(SrcTy); | 317 const bool Src0IsF32 = isFloat32Asserting32Or64(SrcTy); |
| 317 Operand *TargetHelper = Ctx->getRuntimeHelperFunc( | 318 RuntimeHelper RTHFunc = RuntimeHelper::H_Num; |
| 318 Src0IsF32 ? (DestIsSigned ? RuntimeHelper::H_fptosi_f32_i64 | 319 if (DestIsSigned) { |
| 319 : RuntimeHelper::H_fptoui_f32_i64) | 320 if (DestIs32) { |
| 320 : (DestIsSigned ? RuntimeHelper::H_fptosi_f64_i64 | 321 return; |
| 321 : RuntimeHelper::H_fptoui_f64_i64)); | 322 } |
| 323 RTHFunc = Src0IsF32 ? RuntimeHelper::H_fptosi_f32_i64 |
| 324 : RuntimeHelper::H_fptosi_f64_i64; |
| 325 } else { |
| 326 RTHFunc = Src0IsF32 ? (DestIs32 ? RuntimeHelper::H_fptoui_f32_i32 |
| 327 : RuntimeHelper::H_fptoui_f32_i64) |
| 328 : (DestIs32 ? RuntimeHelper::H_fptoui_f64_i32 |
| 329 : RuntimeHelper::H_fptoui_f64_i64); |
| 330 } |
| 331 Operand *TargetHelper = Ctx->getRuntimeHelperFunc(RTHFunc); |
| 322 static constexpr SizeT MaxArgs = 1; | 332 static constexpr SizeT MaxArgs = 1; |
| 323 auto *Call = Context.insert<InstCall>(MaxArgs, Dest, TargetHelper, | 333 auto *Call = Context.insert<InstCall>(MaxArgs, Dest, TargetHelper, |
| 324 NoTailCall, IsTargetHelperCall); | 334 NoTailCall, IsTargetHelperCall); |
| 325 Call->addArg(Src0); | 335 Call->addArg(Src0); |
| 326 Instr->setDeleted(); | 336 Instr->setDeleted(); |
| 327 return; | 337 return; |
| 328 } | 338 } |
| 329 case InstCast::Sitofp: | 339 case InstCast::Sitofp: |
| 330 case InstCast::Uitofp: { | 340 case InstCast::Uitofp: { |
| 331 if (SrcTy != IceType_i64) { | 341 if ((SrcTy != IceType_i32) && (SrcTy != IceType_i64)) { |
| 332 return; | 342 return; |
| 333 } | 343 } |
| 344 const bool SourceIs32 = SrcTy == IceType_i32; |
| 334 const bool SourceIsSigned = CastKind == InstCast::Sitofp; | 345 const bool SourceIsSigned = CastKind == InstCast::Sitofp; |
| 335 const bool DestIsF32 = isFloat32Asserting32Or64(Dest->getType()); | 346 const bool DestIsF32 = isFloat32Asserting32Or64(Dest->getType()); |
| 336 Operand *TargetHelper = Ctx->getRuntimeHelperFunc( | 347 RuntimeHelper RTHFunc = RuntimeHelper::H_Num; |
| 337 DestIsF32 ? (SourceIsSigned ? RuntimeHelper::H_sitofp_i64_f32 | 348 if (SourceIsSigned) { |
| 338 : RuntimeHelper::H_uitofp_i64_f32) | 349 if (SourceIs32) { |
| 339 : (SourceIsSigned ? RuntimeHelper::H_sitofp_i64_f64 | 350 return; |
| 340 : RuntimeHelper::H_uitofp_i64_f64)); | 351 } |
| 352 RTHFunc = DestIsF32 ? RuntimeHelper::H_sitofp_i64_f32 |
| 353 : RuntimeHelper::H_sitofp_i64_f64; |
| 354 } else { |
| 355 RTHFunc = DestIsF32 ? (SourceIs32 ? RuntimeHelper::H_uitofp_i32_f32 |
| 356 : RuntimeHelper::H_uitofp_i64_f32) |
| 357 : (SourceIs32 ? RuntimeHelper::H_uitofp_i32_f64 |
| 358 : RuntimeHelper::H_uitofp_i64_f64); |
| 359 } |
| 360 Operand *TargetHelper = Ctx->getRuntimeHelperFunc(RTHFunc); |
| 341 static constexpr SizeT MaxArgs = 1; | 361 static constexpr SizeT MaxArgs = 1; |
| 342 auto *Call = Context.insert<InstCall>(MaxArgs, Dest, TargetHelper, | 362 auto *Call = Context.insert<InstCall>(MaxArgs, Dest, TargetHelper, |
| 343 NoTailCall, IsTargetHelperCall); | 363 NoTailCall, IsTargetHelperCall); |
| 344 Call->addArg(Src0); | 364 Call->addArg(Src0); |
| 345 Instr->setDeleted(); | 365 Instr->setDeleted(); |
| 346 return; | 366 return; |
| 347 } | 367 } |
| 348 case InstCast::Bitcast: { | 368 case InstCast::Bitcast: { |
| 349 if (DestTy == SrcTy) { | 369 if (DestTy == SrcTy) { |
| 350 return; | 370 return; |
| (...skipping 2226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2577 } | 2597 } |
| 2578 case InstCast::Fpext: { | 2598 case InstCast::Fpext: { |
| 2579 assert(Dest->getType() == IceType_f64); | 2599 assert(Dest->getType() == IceType_f64); |
| 2580 assert(Src0->getType() == IceType_f32); | 2600 assert(Src0->getType() == IceType_f32); |
| 2581 auto *DestR = legalizeToReg(Dest); | 2601 auto *DestR = legalizeToReg(Dest); |
| 2582 auto *Src0R = legalizeToReg(Src0); | 2602 auto *Src0R = legalizeToReg(Src0); |
| 2583 _cvt_d_s(DestR, Src0R); | 2603 _cvt_d_s(DestR, Src0R); |
| 2584 _mov(Dest, DestR); | 2604 _mov(Dest, DestR); |
| 2585 break; | 2605 break; |
| 2586 } | 2606 } |
| 2587 case InstCast::Fptosi: { | 2607 case InstCast::Fptosi: |
| 2608 case InstCast::Fptoui: { |
| 2588 if (llvm::isa<Variable64On32>(Dest)) { | 2609 if (llvm::isa<Variable64On32>(Dest)) { |
| 2589 llvm::report_fatal_error("fp-to-i64 should have been prelowered."); | 2610 llvm::report_fatal_error("fp-to-i64 should have been prelowered."); |
| 2590 return; | 2611 return; |
| 2591 } | 2612 } |
| 2592 if (Src0Ty == IceType_f32 && DestTy == IceType_i32) { | 2613 if (DestTy != IceType_i64) { |
| 2593 Variable *Src0R = legalizeToReg(Src0); | 2614 if (Src0Ty == IceType_f32 && isScalarIntegerType(DestTy)) { |
| 2594 Variable *FTmp = makeReg(IceType_f32); | 2615 Variable *Src0R = legalizeToReg(Src0); |
| 2595 _trunc_w_s(FTmp, Src0R); | 2616 Variable *FTmp = makeReg(IceType_f32); |
| 2596 _mov(Dest, FTmp); | 2617 _trunc_w_s(FTmp, Src0R); |
| 2597 } else { | 2618 _mov(Dest, FTmp); |
| 2598 UnimplementedLoweringError(this, Instr); | 2619 return; |
| 2599 } | 2620 } |
| 2600 break; | 2621 if (Src0Ty == IceType_f64 && isScalarIntegerType(DestTy)) { |
| 2601 } | 2622 Variable *Src0R = legalizeToReg(Src0); |
| 2602 case InstCast::Fptoui: | 2623 Variable *FTmp = makeReg(IceType_f64); |
| 2603 if (llvm::isa<Variable64On32>(Dest)) { | 2624 _trunc_w_d(FTmp, Src0R); |
| 2604 llvm::report_fatal_error("fp-to-i64 should have been prelowered."); | 2625 _mov(Dest, FTmp); |
| 2605 return; | 2626 return; |
| 2627 } |
| 2606 } | 2628 } |
| 2607 UnimplementedLoweringError(this, Instr); | 2629 UnimplementedLoweringError(this, Instr); |
| 2608 break; | 2630 break; |
| 2609 case InstCast::Sitofp: { | |
| 2610 if (llvm::isa<Variable64On32>(Dest)) { | |
| 2611 llvm::report_fatal_error("i64-to-fp should have been prelowered."); | |
| 2612 return; | |
| 2613 } | |
| 2614 if (Src0Ty == IceType_i32 && DestTy == IceType_f32) { | |
| 2615 Variable *Src0R = legalizeToReg(Src0); | |
| 2616 Variable *FTmp1 = makeReg(IceType_f32); | |
| 2617 Variable *FTmp2 = makeReg(IceType_f32); | |
| 2618 _mov(FTmp1, Src0R); | |
| 2619 _cvt_s_w(FTmp2, FTmp1); | |
| 2620 _mov(Dest, FTmp2); | |
| 2621 } else { | |
| 2622 UnimplementedLoweringError(this, Instr); | |
| 2623 } | |
| 2624 break; | |
| 2625 } | 2631 } |
| 2632 case InstCast::Sitofp: |
| 2626 case InstCast::Uitofp: { | 2633 case InstCast::Uitofp: { |
| 2627 if (llvm::isa<Variable64On32>(Dest)) { | 2634 if (llvm::isa<Variable64On32>(Dest)) { |
| 2628 llvm::report_fatal_error("i64-to-fp should have been prelowered."); | 2635 llvm::report_fatal_error("i64-to-fp should have been prelowered."); |
| 2629 return; | 2636 return; |
| 2630 } | 2637 } |
| 2638 if (Src0Ty != IceType_i64) { |
| 2639 if (isScalarIntegerType(Src0Ty) && DestTy == IceType_f32) { |
| 2640 Variable *Src0R = legalizeToReg(Src0); |
| 2641 Variable *FTmp1 = makeReg(IceType_f32); |
| 2642 Variable *FTmp2 = makeReg(IceType_f32); |
| 2643 _mtc1(FTmp1, Src0R); |
| 2644 _cvt_s_w(FTmp2, FTmp1); |
| 2645 _mov(Dest, FTmp2); |
| 2646 return; |
| 2647 } |
| 2648 if (isScalarIntegerType(Src0Ty) && DestTy == IceType_f64) { |
| 2649 Variable *Src0R = legalizeToReg(Src0); |
| 2650 Variable *FTmp1 = makeReg(IceType_f64); |
| 2651 Variable *FTmp2 = makeReg(IceType_f64); |
| 2652 _mtc1(FTmp1, Src0R); |
| 2653 _cvt_d_w(FTmp2, FTmp1); |
| 2654 _mov(Dest, FTmp2); |
| 2655 return; |
| 2656 } |
| 2657 } |
| 2631 UnimplementedLoweringError(this, Instr); | 2658 UnimplementedLoweringError(this, Instr); |
| 2632 break; | 2659 break; |
| 2633 } | 2660 } |
| 2634 case InstCast::Bitcast: { | 2661 case InstCast::Bitcast: { |
| 2662 Operand *Src0 = Instr->getSrc(0); |
| 2663 if (DestTy == Src0->getType()) { |
| 2664 auto *Assign = InstAssign::create(Func, Dest, Src0); |
| 2665 lowerAssign(Assign); |
| 2666 return; |
| 2667 } |
| 2635 switch (DestTy) { | 2668 switch (DestTy) { |
| 2636 case IceType_NUM: | 2669 case IceType_NUM: |
| 2637 case IceType_void: | 2670 case IceType_void: |
| 2638 llvm::report_fatal_error("Unexpected bitcast."); | 2671 llvm::report_fatal_error("Unexpected bitcast."); |
| 2639 case IceType_i1: | 2672 case IceType_i1: |
| 2640 UnimplementedLoweringError(this, Instr); | 2673 UnimplementedLoweringError(this, Instr); |
| 2641 break; | 2674 break; |
| 2642 case IceType_i8: | 2675 case IceType_i8: |
| 2643 assert(Src0->getType() == IceType_v8i1); | 2676 assert(Src0->getType() == IceType_v8i1); |
| 2644 llvm::report_fatal_error( | 2677 llvm::report_fatal_error( |
| (...skipping 1335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3980 Str << "\t.set\t" | 4013 Str << "\t.set\t" |
| 3981 << "nomips16\n"; | 4014 << "nomips16\n"; |
| 3982 } | 4015 } |
| 3983 | 4016 |
| 3984 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 4017 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
| 3985 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 4018 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
| 3986 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 4019 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
| 3987 | 4020 |
| 3988 } // end of namespace MIPS32 | 4021 } // end of namespace MIPS32 |
| 3989 } // end of namespace Ice | 4022 } // end of namespace Ice |
| OLD | NEW |