@@ -2012,6 +2012,15 @@ Register LegalizerHelper::coerceToScalar(Register Val) {
20122012void LegalizerHelper::widenScalarSrc (MachineInstr &MI, LLT WideTy,
20132013 unsigned OpIdx, unsigned ExtOpcode) {
20142014 MachineOperand &MO = MI.getOperand (OpIdx);
2015+ LLT SrcTy = MRI.getType (MO.getReg ());
2016+
2017+ if (SrcTy.isFloat () && ExtOpcode != TargetOpcode::G_FPEXT) {
2018+ auto Cast = MIRBuilder.buildBitcast (SrcTy.dropType (), MO);
2019+ auto ExtB = MIRBuilder.buildInstr (ExtOpcode, {WideTy}, {Cast});
2020+ MO.setReg (ExtB.getReg (0 ));
2021+ return ;
2022+ }
2023+
20152024 auto ExtB = MIRBuilder.buildInstr (ExtOpcode, {WideTy}, {MO});
20162025 MO.setReg (ExtB.getReg (0 ));
20172026}
@@ -2026,8 +2035,18 @@ void LegalizerHelper::narrowScalarSrc(MachineInstr &MI, LLT NarrowTy,
20262035void LegalizerHelper::widenScalarDst (MachineInstr &MI, LLT WideTy,
20272036 unsigned OpIdx, unsigned TruncOpcode) {
20282037 MachineOperand &MO = MI.getOperand (OpIdx);
2038+ LLT DstTy = MRI.getType (MO.getReg ());
20292039 Register DstExt = MRI.createGenericVirtualRegister (WideTy);
2040+
20302041 MIRBuilder.setInsertPt (MIRBuilder.getMBB (), ++MIRBuilder.getInsertPt ());
2042+
2043+ if (DstTy.isFloat () && TruncOpcode != TargetOpcode::G_FPTRUNC) {
2044+ auto Trunc = MIRBuilder.buildInstr (TruncOpcode, {DstTy.dropType ()}, {DstExt});
2045+ MIRBuilder.buildBitcast (MO, Trunc);
2046+ MO.setReg (DstExt);
2047+ return ;
2048+ }
2049+
20312050 MIRBuilder.buildInstr (TruncOpcode, {MO}, {DstExt});
20322051 MO.setReg (DstExt);
20332052}
0 commit comments