@@ -7609,6 +7609,22 @@ LegalizerHelper::lowerU64ToF64BitFloatOps(MachineInstr &MI) {
7609
7609
return Legalized;
7610
7610
}
7611
7611
7612
+ // / i64->fp16 itofp can be lowered to i64->f64,f64->f32,f32->f16. We cannot
7613
+ // / convert fpround f64->f16 without double-rounding, so we manually perform the
7614
+ // / lowering here where we know it is valid.
7615
+ static LegalizerHelper::LegalizeResult
7616
+ loweri64tof16ITOFP (MachineInstr &MI, Register Dst, LLT DstTy, Register Src,
7617
+ LLT SrcTy, MachineIRBuilder &MIRBuilder) {
7618
+ auto M1 = MI.getOpcode () == TargetOpcode::G_UITOFP
7619
+ ? MIRBuilder.buildUITOFP (SrcTy, Src)
7620
+ : MIRBuilder.buildSITOFP (SrcTy, Src);
7621
+ LLT S32Ty = SrcTy.changeElementSize (32 );
7622
+ auto M2 = MIRBuilder.buildFPTrunc (S32Ty, M1);
7623
+ MIRBuilder.buildFPTrunc (Dst, M2);
7624
+ MI.eraseFromParent ();
7625
+ return LegalizerHelper::Legalized;
7626
+ }
7627
+
7612
7628
LegalizerHelper::LegalizeResult LegalizerHelper::lowerUITOFP (MachineInstr &MI) {
7613
7629
auto [Dst, DstTy, Src, SrcTy] = MI.getFirst2RegLLTs ();
7614
7630
@@ -7620,17 +7636,8 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerUITOFP(MachineInstr &MI) {
7620
7636
return Legalized;
7621
7637
}
7622
7638
7623
- // i64->fp16 itofp can be lowered to i64->f64,f64->f32,f32->f16. We cannot
7624
- // just convert fpround f64->f16 without double-rounding, so we manually
7625
- // perform the lowering here where we know it is valid.
7626
- if (DstTy.getScalarSizeInBits () == 16 && SrcTy.getScalarSizeInBits () == 64 ) {
7627
- auto M1 = MIRBuilder.buildUITOFP (SrcTy, Src);
7628
- LLT S32Ty = SrcTy.changeElementSize (32 );
7629
- auto M2 = MIRBuilder.buildFPTrunc (S32Ty, M1);
7630
- MIRBuilder.buildFPTrunc (Dst, M2);
7631
- MI.eraseFromParent ();
7632
- return Legalized;
7633
- }
7639
+ if (DstTy.getScalarSizeInBits () == 16 && SrcTy.getScalarSizeInBits () == 64 )
7640
+ return loweri64tof16ITOFP (MI, Dst, DstTy, Src, SrcTy, MIRBuilder);
7634
7641
7635
7642
if (SrcTy != LLT::scalar (64 ))
7636
7643
return UnableToLegalize;
@@ -7663,17 +7670,8 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerSITOFP(MachineInstr &MI) {
7663
7670
return Legalized;
7664
7671
}
7665
7672
7666
- // i64->fp16 itofp can be lowered to i64->f64,f64->f32,f32->f16. We cannot
7667
- // just convert fpround f64->f16 without double-rounding, so we manually
7668
- // perform the lowering here where we know it is valid.
7669
- if (DstTy.getScalarSizeInBits () == 16 && SrcTy.getScalarSizeInBits () == 64 ) {
7670
- auto M1 = MIRBuilder.buildSITOFP (SrcTy, Src);
7671
- LLT S32Ty = SrcTy.changeElementSize (32 );
7672
- auto M2 = MIRBuilder.buildFPTrunc (S32Ty, M1);
7673
- MIRBuilder.buildFPTrunc (Dst, M2);
7674
- MI.eraseFromParent ();
7675
- return Legalized;
7676
- }
7673
+ if (DstTy.getScalarSizeInBits () == 16 && SrcTy.getScalarSizeInBits () == 64 )
7674
+ return loweri64tof16ITOFP (MI, Dst, DstTy, Src, SrcTy, MIRBuilder);
7677
7675
7678
7676
if (SrcTy != S64)
7679
7677
return UnableToLegalize;
0 commit comments