@@ -490,31 +490,25 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
490
490
});
491
491
492
492
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 )
502
498
.widenScalarToNextPow2 (1 )
499
+ .customForCartesianProduct (UseX87, {s32, s64, s80}, {s16, s32, s64})
503
500
.clampScalar (0 , s32, HasSSE2 ? s64 : s32)
504
501
.widenScalarToNextPow2 (0 );
505
502
506
503
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 )
516
509
.widenScalarToNextPow2 (0 )
517
- .clampScalar (0 , s32, sMaxScalar )
510
+ .customForCartesianProduct (UseX87, {s16, s32, s64}, {s32, s64, s80})
511
+ .clampScalar (1 , s32, HasSSE2 ? s64 : s32)
518
512
.widenScalarToNextPow2 (1 );
519
513
520
514
// 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,
671
665
return legalizeUITOFP (MI, MRI, Helper);
672
666
case TargetOpcode::G_STORE:
673
667
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);
674
672
}
675
673
llvm_unreachable (" expected switch to return" );
676
674
}
677
675
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
+
678
732
bool X86LegalizerInfo::legalizeBuildVector (MachineInstr &MI,
679
733
MachineRegisterInfo &MRI,
680
734
LegalizerHelper &Helper) const {
0 commit comments