@@ -471,6 +471,8 @@ static RTLIB::Libcall getRTLibDesc(unsigned Opcode, unsigned Size) {
471471 RTLIBCASE (TANH_F);
472472 case TargetOpcode::G_FSINCOS:
473473 RTLIBCASE (SINCOS_F);
474+ case TargetOpcode::G_FMODF:
475+ RTLIBCASE (MODF_F);
474476 case TargetOpcode::G_FLOG10:
475477 RTLIBCASE (LOG10_F);
476478 case TargetOpcode::G_FLOG:
@@ -702,6 +704,46 @@ LegalizerHelper::LegalizeResult LegalizerHelper::emitSincosLibcall(
702704 return LegalizerHelper::Legalized;
703705}
704706
707+ LegalizerHelper::LegalizeResult
708+ LegalizerHelper::emitModfLibcall (MachineInstr &MI, MachineIRBuilder &MIRBuilder,
709+ unsigned Size, Type *OpType,
710+ LostDebugLocObserver &LocObserver) {
711+ MachineFunction &MF = MIRBuilder.getMF ();
712+ MachineRegisterInfo &MRI = MF.getRegInfo ();
713+
714+ Register DstFrac = MI.getOperand (0 ).getReg ();
715+ Register DstInt = MI.getOperand (1 ).getReg ();
716+ Register Src = MI.getOperand (2 ).getReg ();
717+ LLT DstTy = MRI.getType (DstFrac);
718+
719+ int MemSize = DstTy.getSizeInBytes ();
720+ Align Alignment = getStackTemporaryAlignment (DstTy);
721+ const DataLayout &DL = MIRBuilder.getDataLayout ();
722+ unsigned AddrSpace = DL.getAllocaAddrSpace ();
723+ MachinePointerInfo PtrInfo;
724+
725+ Register StackPtrInt =
726+ createStackTemporary (TypeSize::getFixed (MemSize), Alignment, PtrInfo)
727+ .getReg (0 );
728+
729+ auto &Ctx = MF.getFunction ().getContext ();
730+ auto LibcallResult = createLibcall (
731+ MIRBuilder, getRTLibDesc (MI.getOpcode (), Size), {DstFrac, OpType, 0 },
732+ {{Src, OpType, 0 }, {StackPtrInt, PointerType::get (Ctx, AddrSpace), 1 }},
733+ LocObserver, &MI);
734+
735+ if (LibcallResult != LegalizeResult::Legalized)
736+ return LegalizerHelper::UnableToLegalize;
737+
738+ MachineMemOperand *LoadMMOInt = MF.getMachineMemOperand (
739+ PtrInfo, MachineMemOperand::MOLoad, MemSize, Alignment);
740+
741+ MIRBuilder.buildLoad (DstInt, StackPtrInt, *LoadMMOInt);
742+ MI.eraseFromParent ();
743+
744+ return LegalizerHelper::Legalized;
745+ }
746+
705747LegalizerHelper::LegalizeResult
706748llvm::createMemLibcall (MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
707749 MachineInstr &MI, LostDebugLocObserver &LocObserver) {
@@ -1341,6 +1383,16 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
13411383 }
13421384 return emitSincosLibcall (MI, MIRBuilder, Size, HLTy, LocObserver);
13431385 }
1386+ case TargetOpcode::G_FMODF: {
1387+ LLT LLTy = MRI.getType (MI.getOperand (0 ).getReg ());
1388+ unsigned Size = LLTy.getSizeInBits ();
1389+ Type *HLTy = getFloatTypeForLLT (Ctx, LLTy);
1390+ if (!HLTy || (Size != 32 && Size != 64 && Size != 80 && Size != 128 )) {
1391+ LLVM_DEBUG (dbgs () << " No libcall available for type " << LLTy << " .\n " );
1392+ return UnableToLegalize;
1393+ }
1394+ return emitModfLibcall (MI, MIRBuilder, Size, HLTy, LocObserver);
1395+ }
13441396 case TargetOpcode::G_LROUND:
13451397 case TargetOpcode::G_LLROUND:
13461398 case TargetOpcode::G_INTRINSIC_LRINT:
@@ -3333,6 +3385,16 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {
33333385 widenScalarDst (MI, WideTy, 0 , TargetOpcode::G_FPTRUNC);
33343386 Observer.changedInstr (MI);
33353387 return Legalized;
3388+ case TargetOpcode::G_FMODF: {
3389+ Observer.changingInstr (MI);
3390+ widenScalarSrc (MI, WideTy, 2 , TargetOpcode::G_FPEXT);
3391+
3392+ widenScalarDst (MI, WideTy, 1 , TargetOpcode::G_FPTRUNC);
3393+ MIRBuilder.setInsertPt (MIRBuilder.getMBB (), --MIRBuilder.getInsertPt ());
3394+ widenScalarDst (MI, WideTy, 0 , TargetOpcode::G_FPTRUNC);
3395+ Observer.changedInstr (MI);
3396+ return Legalized;
3397+ }
33363398 case TargetOpcode::G_FPOWI:
33373399 case TargetOpcode::G_FLDEXP:
33383400 case TargetOpcode::G_STRICT_FLDEXP: {
@@ -5472,6 +5534,7 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
54725534 case G_LROUND:
54735535 case G_LLROUND:
54745536 case G_INTRINSIC_TRUNC:
5537+ case G_FMODF:
54755538 case G_FCOS:
54765539 case G_FSIN:
54775540 case G_FTAN:
0 commit comments