[llvm] [X86][GlobalISel] - Legalize And Select of G_FPTOSI/G_SITOFP in X87 mode (PR #137377)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 25 12:38:27 PDT 2025
================
@@ -671,10 +690,77 @@ bool X86LegalizerInfo::legalizeCustom(LegalizerHelper &Helper, MachineInstr &MI,
return legalizeUITOFP(MI, MRI, Helper);
case TargetOpcode::G_STORE:
return legalizeNarrowingStore(MI, MRI, Helper);
+ case TargetOpcode::G_SITOFP:
+ return legalizeSITOFP(MI, MRI, Helper);
+ case TargetOpcode::G_FPTOSI:
+ return legalizeFPTOSI(MI, MRI, Helper);
}
llvm_unreachable("expected switch to return");
}
+bool X86LegalizerInfo::legalizeSITOFP(MachineInstr &MI,
+ MachineRegisterInfo &MRI,
+ LegalizerHelper &Helper) const {
+ MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
+ MachineFunction &MF = *MI.getMF();
+ auto [Dst, DstTy, Src, SrcTy] = MI.getFirst2RegLLTs();
+
+ assert((SrcTy.getSizeInBits() == 16 || SrcTy.getSizeInBits() == 32 ||
+ SrcTy.getSizeInBits() == 64) &&
+ "Unexpected source type for SITOFP in X87 mode.");
+
+ const LLT p0 = LLT::pointer(0, MF.getTarget().getPointerSizeInBits(0));
+ int MemSize = SrcTy.getSizeInBytes();
+ int StackSlot =
+ MF.getFrameInfo().CreateStackObject(MemSize, Align(MemSize), false);
+
+ auto SlotPointer = MIRBuilder.buildFrameIndex(p0, StackSlot);
+ MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(MF, StackSlot);
+ MachineMemOperand *StoreMMO = MF.getMachineMemOperand(
+ PtrInfo, MachineMemOperand::MOStore, MemSize, Align(MemSize));
+
+ // Store the integer value on the FPU stack.
+ MIRBuilder.buildStore(Src, SlotPointer, *StoreMMO);
+
+ MachineMemOperand *LoadMMO = MF.getMachineMemOperand(
+ PtrInfo, MachineMemOperand::MOLoad, MemSize, Align(MemSize));
+ MIRBuilder.buildInstr(X86::G_FILD)
+ .addDef(Dst)
+ .addUse(SlotPointer.getReg(0))
+ .addMemOperand(LoadMMO);
+
+ MI.eraseFromParent();
+ return true;
+}
+
+bool X86LegalizerInfo::legalizeFPTOSI(MachineInstr &MI,
+ MachineRegisterInfo &MRI,
+ LegalizerHelper &Helper) const {
+ MachineFunction &MF = *MI.getMF();
+ MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
+ const LLT p0 = LLT::pointer(0, MF.getTarget().getPointerSizeInBits(0));
+ auto [Dst, DstTy, Src, SrcTy] = MI.getFirst2RegLLTs();
+
+ unsigned MemSize = DstTy.getSizeInBytes();
+ int StackSlot =
+ MF.getFrameInfo().CreateStackObject(MemSize, Align(MemSize), false);
+
+ auto SlotPointer = MIRBuilder.buildFrameIndex(p0, StackSlot);
+
+ MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(MF, StackSlot);
+ MachineMemOperand *StoreMMO = MF.getMachineMemOperand(
+ PtrInfo, MachineMemOperand::MOStore, MemSize, Align(MemSize));
----------------
arsenm wrote:
Ditto
https://github.com/llvm/llvm-project/pull/137377
More information about the llvm-commits
mailing list