@@ -490,31 +490,25 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
490490 });
491491
492492 getActionDefinitionsBuilder (G_SITOFP)
493- .legalIf ([=](const LegalityQuery &Query) {
494- return (HasSSE1 &&
495- (typePairInSet (0 , 1 , {{s32, s32}})(Query) ||
496- (Is64Bit && typePairInSet (0 , 1 , {{s32, s64}})(Query)))) ||
497- (HasSSE2 &&
498- (typePairInSet (0 , 1 , {{s64, s32}})(Query) ||
499- (Is64Bit && typePairInSet (0 , 1 , {{s64, s64}})(Query))));
500- })
501- .clampScalar (1 , s32, sMaxScalar )
493+ .legalFor (HasSSE1, {{s32, s32}})
494+ .legalFor (HasSSE1 && Is64Bit, {{s32, s64}})
495+ .legalFor (HasSSE2, {{s64, s32}})
496+ .legalFor (HasSSE2 && Is64Bit, {{s64, s64}})
497+ .clampScalar (1 , (UseX87 && !HasSSE1) ? s16 : s32, sMaxScalar )
502498 .widenScalarToNextPow2 (1 )
499+ .customForCartesianProduct (UseX87, {s32, s64, s80}, {s16, s32, s64})
503500 .clampScalar (0 , s32, HasSSE2 ? s64 : s32)
504501 .widenScalarToNextPow2 (0 );
505502
506503 getActionDefinitionsBuilder (G_FPTOSI)
507- .legalIf ([=](const LegalityQuery &Query) {
508- return (HasSSE1 &&
509- (typePairInSet (0 , 1 , {{s32, s32}})(Query) ||
510- (Is64Bit && typePairInSet (0 , 1 , {{s64, s32}})(Query)))) ||
511- (HasSSE2 &&
512- (typePairInSet (0 , 1 , {{s32, s64}})(Query) ||
513- (Is64Bit && typePairInSet (0 , 1 , {{s64, s64}})(Query))));
514- })
515- .clampScalar (1 , s32, HasSSE2 ? s64 : s32)
504+ .legalFor (HasSSE1, {{s32, s32}})
505+ .legalFor (HasSSE1 && Is64Bit, {{s64, s32}})
506+ .legalFor (HasSSE2, {{s32, s64}})
507+ .legalFor (HasSSE2 && Is64Bit, {{s64, s64}})
508+ .clampScalar (0 , (UseX87 && !HasSSE1) ? s16 : s32, sMaxScalar )
516509 .widenScalarToNextPow2 (0 )
517- .clampScalar (0 , s32, sMaxScalar )
510+ .customForCartesianProduct (UseX87, {s16, s32, s64}, {s32, s64, s80})
511+ .clampScalar (1 , s32, HasSSE2 ? s64 : s32)
518512 .widenScalarToNextPow2 (1 );
519513
520514 // For G_UITOFP and G_FPTOUI without AVX512, we have to custom legalize types
@@ -671,10 +665,70 @@ bool X86LegalizerInfo::legalizeCustom(LegalizerHelper &Helper, MachineInstr &MI,
671665 return legalizeUITOFP (MI, MRI, Helper);
672666 case TargetOpcode::G_STORE:
673667 return legalizeNarrowingStore (MI, MRI, Helper);
668+ case TargetOpcode::G_SITOFP:
669+ return legalizeSITOFP (MI, MRI, Helper);
670+ case TargetOpcode::G_FPTOSI:
671+ return legalizeFPTOSI (MI, MRI, Helper);
674672 }
675673 llvm_unreachable (" expected switch to return" );
676674}
677675
676+ bool X86LegalizerInfo::legalizeSITOFP (MachineInstr &MI,
677+ MachineRegisterInfo &MRI,
678+ LegalizerHelper &Helper) const {
679+ MachineIRBuilder &MIRBuilder = Helper.MIRBuilder ;
680+ MachineFunction &MF = *MI.getMF ();
681+ auto [Dst, DstTy, Src, SrcTy] = MI.getFirst2RegLLTs ();
682+
683+ assert ((SrcTy.getSizeInBits () == 16 || SrcTy.getSizeInBits () == 32 ||
684+ SrcTy.getSizeInBits () == 64 ) &&
685+ " Unexpected source type for SITOFP in X87 mode." );
686+
687+ TypeSize MemSize = SrcTy.getSizeInBytes ();
688+ MachinePointerInfo PtrInfo;
689+ Align Alignmt = Helper.getStackTemporaryAlignment (SrcTy);
690+ auto SlotPointer = Helper.createStackTemporary (MemSize, Alignmt, PtrInfo);
691+ MachineMemOperand *StoreMMO = MF.getMachineMemOperand (
692+ PtrInfo, MachineMemOperand::MOStore, MemSize, Align (MemSize));
693+
694+ // Store the integer value on the FPU stack.
695+ MIRBuilder.buildStore (Src, SlotPointer, *StoreMMO);
696+
697+ MachineMemOperand *LoadMMO = MF.getMachineMemOperand (
698+ PtrInfo, MachineMemOperand::MOLoad, MemSize, Align (MemSize));
699+ MIRBuilder.buildInstr (X86::G_FILD)
700+ .addDef (Dst)
701+ .addUse (SlotPointer.getReg (0 ))
702+ .addMemOperand (LoadMMO);
703+
704+ MI.eraseFromParent ();
705+ return true ;
706+ }
707+
708+ bool X86LegalizerInfo::legalizeFPTOSI (MachineInstr &MI,
709+ MachineRegisterInfo &MRI,
710+ LegalizerHelper &Helper) const {
711+ MachineFunction &MF = *MI.getMF ();
712+ MachineIRBuilder &MIRBuilder = Helper.MIRBuilder ;
713+ auto [Dst, DstTy, Src, SrcTy] = MI.getFirst2RegLLTs ();
714+
715+ TypeSize MemSize = DstTy.getSizeInBytes ();
716+ MachinePointerInfo PtrInfo;
717+ Align Alignmt = Helper.getStackTemporaryAlignment (DstTy);
718+ auto SlotPointer = Helper.createStackTemporary (MemSize, Alignmt, PtrInfo);
719+ MachineMemOperand *StoreMMO = MF.getMachineMemOperand (
720+ PtrInfo, MachineMemOperand::MOStore, MemSize, Align (MemSize));
721+
722+ MIRBuilder.buildInstr (X86::G_FIST)
723+ .addUse (Src)
724+ .addUse (SlotPointer.getReg (0 ))
725+ .addMemOperand (StoreMMO);
726+
727+ MIRBuilder.buildLoad (Dst, SlotPointer, PtrInfo, Align (MemSize));
728+ MI.eraseFromParent ();
729+ return true ;
730+ }
731+
678732bool X86LegalizerInfo::legalizeBuildVector (MachineInstr &MI,
679733 MachineRegisterInfo &MRI,
680734 LegalizerHelper &Helper) const {
0 commit comments