@@ -471,6 +471,8 @@ static RTLIB::Libcall getRTLibDesc(unsigned Opcode, unsigned Size) {
471
471
RTLIBCASE (TANH_F);
472
472
case TargetOpcode::G_FSINCOS:
473
473
RTLIBCASE (SINCOS_F);
474
+ case TargetOpcode::G_FMODF:
475
+ RTLIBCASE (MODF_F);
474
476
case TargetOpcode::G_FLOG10:
475
477
RTLIBCASE (LOG10_F);
476
478
case TargetOpcode::G_FLOG:
@@ -702,6 +704,46 @@ LegalizerHelper::LegalizeResult LegalizerHelper::emitSincosLibcall(
702
704
return LegalizerHelper::Legalized;
703
705
}
704
706
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
+
705
747
LegalizerHelper::LegalizeResult
706
748
llvm::createMemLibcall (MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
707
749
MachineInstr &MI, LostDebugLocObserver &LocObserver) {
@@ -1341,6 +1383,16 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
1341
1383
}
1342
1384
return emitSincosLibcall (MI, MIRBuilder, Size, HLTy, LocObserver);
1343
1385
}
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
+ }
1344
1396
case TargetOpcode::G_LROUND:
1345
1397
case TargetOpcode::G_LLROUND:
1346
1398
case TargetOpcode::G_INTRINSIC_LRINT:
@@ -3333,6 +3385,16 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {
3333
3385
widenScalarDst (MI, WideTy, 0 , TargetOpcode::G_FPTRUNC);
3334
3386
Observer.changedInstr (MI);
3335
3387
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
+ }
3336
3398
case TargetOpcode::G_FPOWI:
3337
3399
case TargetOpcode::G_FLDEXP:
3338
3400
case TargetOpcode::G_STRICT_FLDEXP: {
@@ -5472,6 +5534,7 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
5472
5534
case G_LROUND:
5473
5535
case G_LLROUND:
5474
5536
case G_INTRINSIC_TRUNC:
5537
+ case G_FMODF:
5475
5538
case G_FCOS:
5476
5539
case G_FSIN:
5477
5540
case G_FTAN:
0 commit comments