@@ -328,6 +328,10 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
328328
329329 getActionDefinitionsBuilder (G_FCOPYSIGN).libcallFor ({{s32, s32}, {s64, s64}});
330330
331+ getActionDefinitionsBuilder (G_FFREXP).customFor ({{s32, s24}});
332+
333+ getActionDefinitionsBuilder (G_FLDEXP).customFor ({{s32, s24}});
334+
331335 getActionDefinitionsBuilder ({G_LOAD, G_STORE})
332336 .legalForCartesianProduct (LegalTypes, {p[0 ]})
333337 .legalForCartesianProduct (LegalTypesOther, {p[1 ]})
@@ -459,6 +463,10 @@ LegalizerHelper::LegalizeResult Z80LegalizerInfo::legalizeCustomMaybeLegal(
459463 return legalizeFixedDivide (Helper, MI);
460464 case G_FCANONICALIZE:
461465 return legalizeFCanonicalize (Helper, MI);
466+ case G_FFREXP:
467+ return legalizeFFrexp (Helper, MI);
468+ case G_FLDEXP:
469+ return legalizeFLdexp (Helper, MI);
462470 case G_CTLZ:
463471 case G_CTTZ:
464472 return legalizeCtz (Helper, MI);
@@ -1420,6 +1428,80 @@ Z80LegalizerInfo::legalizeFCanonicalize(LegalizerHelper &Helper,
14201428 return LegalizerHelper::Legalized;
14211429}
14221430
1431+ LegalizerHelper::LegalizeResult
1432+ Z80LegalizerInfo::legalizeFFrexp (LegalizerHelper &Helper,
1433+ MachineInstr &MI) const {
1434+ assert (MI.getOpcode () == G_FFREXP && " Unexpected opcode" );
1435+ MachineIRBuilder &MIRBuilder = Helper.MIRBuilder ;
1436+ MachineRegisterInfo &MRI = *MIRBuilder.getMRI ();
1437+
1438+ Register DstMantReg = MI.getOperand (0 ).getReg ();
1439+ Register DstExpReg = MI.getOperand (1 ).getReg ();
1440+ Register SrcReg = MI.getOperand (2 ).getReg ();
1441+
1442+ LLT MantTy = MRI.getType (DstMantReg);
1443+ LLT ExpTy = MRI.getType (DstExpReg);
1444+ if (MantTy != LLT::scalar (32 ) || ExpTy != LLT::scalar (24 ))
1445+ return LegalizerHelper::UnableToLegalize;
1446+
1447+ LLVMContext &Ctx = MIRBuilder.getMF ().getFunction ().getContext ();
1448+ Type *MantIRTy = Type::getFloatTy (Ctx);
1449+ Type *PtrIRTy = PointerType::get (Ctx, 0 );
1450+
1451+ MachineFunction &MF = MIRBuilder.getMF ();
1452+ MachineFrameInfo &MFI = MF.getFrameInfo ();
1453+ int ExpFI = MFI.CreateStackObject (/* Size=*/ 3 , Align (1 ),
1454+ /* IsSpillSlot=*/ false );
1455+ Register ExpAddr =
1456+ MIRBuilder
1457+ .buildFrameIndex (LLT::pointer (0 , TM.getPointerSizeInBits (0 )), ExpFI)
1458+ .getReg (0 );
1459+
1460+ auto CallResult = createLibcall (
1461+ MIRBuilder, RTLIB::FREXP_F32, {DstMantReg, MantIRTy, 0 },
1462+ {{SrcReg, MantIRTy, 0 }, {ExpAddr, PtrIRTy, 1 }});
1463+ if (CallResult != LegalizerHelper::Legalized)
1464+ return CallResult;
1465+
1466+ MachinePointerInfo MPO = MachinePointerInfo::getFixedStack (MF, ExpFI);
1467+ auto *MMO = MF.getMachineMemOperand (MPO, MachineMemOperand::MOLoad, 3 ,
1468+ Align (1 ));
1469+ MIRBuilder.buildLoad (DstExpReg, ExpAddr, *MMO);
1470+
1471+ MI.eraseFromParent ();
1472+ return LegalizerHelper::Legalized;
1473+ }
1474+
1475+ LegalizerHelper::LegalizeResult
1476+ Z80LegalizerInfo::legalizeFLdexp (LegalizerHelper &Helper,
1477+ MachineInstr &MI) const {
1478+ assert (MI.getOpcode () == G_FLDEXP && " Unexpected opcode" );
1479+ MachineIRBuilder &MIRBuilder = Helper.MIRBuilder ;
1480+ MachineRegisterInfo &MRI = *MIRBuilder.getMRI ();
1481+
1482+ Register DstReg = MI.getOperand (0 ).getReg ();
1483+ Register SrcReg = MI.getOperand (1 ).getReg ();
1484+ Register ExpReg = MI.getOperand (2 ).getReg ();
1485+
1486+ LLT DstTy = MRI.getType (DstReg);
1487+ LLT ExpTy = MRI.getType (ExpReg);
1488+ if (DstTy != LLT::scalar (32 ) || ExpTy != LLT::scalar (24 ))
1489+ return LegalizerHelper::UnableToLegalize;
1490+
1491+ LLVMContext &Ctx = MIRBuilder.getMF ().getFunction ().getContext ();
1492+ Type *FloatTy = Type::getFloatTy (Ctx);
1493+ Type *ExpIRTy = IntegerType::get (Ctx, 24 );
1494+
1495+ auto CallResult = createLibcall (
1496+ MIRBuilder, RTLIB::LDEXP_F32, {DstReg, FloatTy, 0 },
1497+ {{SrcReg, FloatTy, 0 }, {ExpReg, ExpIRTy, 1 }});
1498+ if (CallResult != LegalizerHelper::Legalized)
1499+ return CallResult;
1500+
1501+ MI.eraseFromParent ();
1502+ return LegalizerHelper::Legalized;
1503+ }
1504+
14231505LegalizerHelper::LegalizeResult
14241506Z80LegalizerInfo::legalizeCtz (LegalizerHelper &Helper, MachineInstr &MI) const {
14251507 assert ((MI.getOpcode () == G_CTLZ || MI.getOpcode () == G_CTTZ) &&
0 commit comments