@@ -376,9 +376,15 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
376376 Action.legalForTypesWithMemDesc ({{s8, p0, s8, 1 },
377377 {s16, p0, s16, 1 },
378378 {s32, p0, s32, 1 },
379- {s80, p0, s80, 1 },
380379 {p0, p0, p0, 1 },
381380 {v4s8, p0, v4s8, 1 }});
381+
382+ if (UseX87)
383+ Action.legalForTypesWithMemDesc ({{s80, p0, s32, 1 },
384+ {s80, p0, s64, 1 },
385+ {s32, p0, s80, 1 },
386+ {s64, p0, s80, 1 },
387+ {s80, p0, s80, 1 }});
382388 if (Is64Bit)
383389 Action.legalForTypesWithMemDesc (
384390 {{s64, p0, s64, 1 }, {v2s32, p0, v2s32, 1 }});
@@ -476,18 +482,17 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
476482 .widenScalarToNextPow2 (1 );
477483
478484 // fp conversions
479- getActionDefinitionsBuilder (G_FPEXT).legalIf ([=](const LegalityQuery &Query) {
480- return (HasSSE2 && typePairInSet (0 , 1 , {{s64, s32}})(Query)) ||
481- (HasAVX && typePairInSet (0 , 1 , {{v4s64, v4s32}})(Query)) ||
482- (HasAVX512 && typePairInSet (0 , 1 , {{v8s64, v8s32}})(Query));
483- });
484-
485- getActionDefinitionsBuilder (G_FPTRUNC).legalIf (
486- [=](const LegalityQuery &Query) {
487- return (HasSSE2 && typePairInSet (0 , 1 , {{s32, s64}})(Query)) ||
488- (HasAVX && typePairInSet (0 , 1 , {{v4s32, v4s64}})(Query)) ||
489- (HasAVX512 && typePairInSet (0 , 1 , {{v8s32, v8s64}})(Query));
490- });
485+ getActionDefinitionsBuilder (G_FPEXT)
486+ .legalFor (HasSSE2, {{s64, s32}})
487+ .legalFor (HasAVX, {{v4s64, v4s32}})
488+ .legalFor (HasAVX512, {{v8s64, v8s32}})
489+ .customFor (UseX87, {{s64, s32}, {s80, s32}, {s80, s64}});
490+
491+ getActionDefinitionsBuilder (G_FPTRUNC)
492+ .legalFor (HasSSE2, {{s32, s64}})
493+ .legalFor (HasAVX, {{v4s32, v4s64}})
494+ .legalFor (HasAVX512, {{v8s32, v8s64}})
495+ .customFor (UseX87, {{s32, s64}, {s32, s80}, {s64, s80}});
491496
492497 getActionDefinitionsBuilder (G_SITOFP)
493498 .legalIf ([=](const LegalityQuery &Query) {
@@ -671,6 +676,9 @@ bool X86LegalizerInfo::legalizeCustom(LegalizerHelper &Helper, MachineInstr &MI,
671676 return legalizeUITOFP (MI, MRI, Helper);
672677 case TargetOpcode::G_STORE:
673678 return legalizeNarrowingStore (MI, MRI, Helper);
679+ case TargetOpcode::G_FPEXT:
680+ case TargetOpcode::G_FPTRUNC:
681+ return legalizeFPExtAndTrunc (MI, MRI, Helper);
674682 }
675683 llvm_unreachable (" expected switch to return" );
676684}
@@ -781,6 +789,33 @@ bool X86LegalizerInfo::legalizeNarrowingStore(MachineInstr &MI,
781789 return true ;
782790}
783791
792+ bool X86LegalizerInfo::legalizeFPExtAndTrunc (MachineInstr &MI,
793+ MachineRegisterInfo &MRI,
794+ LegalizerHelper &Helper) const {
795+ assert ((MI.getOpcode () == TargetOpcode::G_FPEXT ||
796+ MI.getOpcode () == TargetOpcode::G_FPTRUNC) &&
797+ " Only G_FPEXT and G_FPTRUNC are expected" );
798+ auto [DstReg, DstTy, SrcReg, SrcTy] = MI.getFirst2RegLLTs ();
799+ MachinePointerInfo PtrInfo;
800+ LLT StackTy = MI.getOpcode () == TargetOpcode::G_FPEXT ? SrcTy : DstTy;
801+ Align StackTyAlign = Helper.getStackTemporaryAlignment (StackTy);
802+ auto StackTemp = Helper.createStackTemporary (StackTy.getSizeInBytes (),
803+ StackTyAlign, PtrInfo);
804+
805+ MachineIRBuilder &MIRBuilder = Helper.MIRBuilder ;
806+ MachineFunction &MF = MIRBuilder.getMF ();
807+ auto *StoreMMO = MF.getMachineMemOperand (PtrInfo, MachineMemOperand::MOStore,
808+ StackTy, StackTyAlign);
809+ MIRBuilder.buildStore (SrcReg, StackTemp, *StoreMMO);
810+
811+ auto *LoadMMO = MF.getMachineMemOperand (PtrInfo, MachineMemOperand::MOLoad,
812+ StackTy, StackTyAlign);
813+ MIRBuilder.buildLoad (DstReg, StackTemp, *LoadMMO);
814+
815+ MI.eraseFromParent ();
816+ return true ;
817+ }
818+
784819bool X86LegalizerInfo::legalizeIntrinsic (LegalizerHelper &Helper,
785820 MachineInstr &MI) const {
786821 return true ;
0 commit comments