Skip to content

Commit cd09cc3

Browse files
committed
[X86][GlobalISel] Support fp80 for G_FPTRUNC and G_FPEXT
1 parent a603218 commit cd09cc3

File tree

3 files changed

+224
-84
lines changed

3 files changed

+224
-84
lines changed

llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
784819
bool X86LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
785820
MachineInstr &MI) const {
786821
return true;

llvm/lib/Target/X86/GISel/X86LegalizerInfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ class X86LegalizerInfo : public LegalizerInfo {
4848

4949
bool legalizeNarrowingStore(MachineInstr &MI, MachineRegisterInfo &MRI,
5050
LegalizerHelper &Helper) const;
51+
52+
bool legalizeFPExtAndTrunc(MachineInstr &MI, MachineRegisterInfo &MRI,
53+
LegalizerHelper &Helper) const;
5154
};
5255
} // namespace llvm
5356
#endif

0 commit comments

Comments
 (0)