@@ -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