@@ -9580,9 +9580,12 @@ static SDValue performFP_TO_INTCombine(SDNode *N,
9580
9580
MVT ContainerVT = VT.getSimpleVT();
9581
9581
SDValue XVal = Src.getOperand(0);
9582
9582
9583
- // TODO: Support combining with widening and narrowing instructions
9584
- // For now only support conversions of the same bit size
9585
- if (VT.getScalarSizeInBits() != SrcVT.getScalarSizeInBits())
9583
+ // For widening and narrowing conversions we just combine it into a
9584
+ // VFCVT_..._VL node, as there are no specific VFWCVT/VFNCVT VL nodes. They
9585
+ // end up getting lowered to their appropriate pseudo instructions based on
9586
+ // their operand types
9587
+ if (VT.getScalarSizeInBits() > SrcVT.getScalarSizeInBits() * 2 ||
9588
+ VT.getScalarSizeInBits() * 2 < SrcVT.getScalarSizeInBits())
9586
9589
return SDValue();
9587
9590
9588
9591
// Make fixed-length vectors scalable first
@@ -11638,6 +11641,11 @@ RISCVTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
11638
11641
return emitQuietFCMP(MI, BB, RISCV::FLE_D, RISCV::FEQ_D, Subtarget);
11639
11642
case RISCV::PseudoQuietFLT_D:
11640
11643
return emitQuietFCMP(MI, BB, RISCV::FLT_D, RISCV::FEQ_D, Subtarget);
11644
+
11645
+ // =========================================================================
11646
+ // VFCVT
11647
+ // =========================================================================
11648
+
11641
11649
case RISCV::PseudoVFCVT_RM_X_F_V_M1_MASK:
11642
11650
return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_M1_MASK);
11643
11651
case RISCV::PseudoVFCVT_RM_X_F_V_M2_MASK:
@@ -11650,6 +11658,7 @@ RISCVTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
11650
11658
return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_MF2_MASK);
11651
11659
case RISCV::PseudoVFCVT_RM_X_F_V_MF4_MASK:
11652
11660
return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_MF4_MASK);
11661
+
11653
11662
case RISCV::PseudoVFCVT_RM_XU_F_V_M1_MASK:
11654
11663
return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_XU_F_V_M1_MASK);
11655
11664
case RISCV::PseudoVFCVT_RM_XU_F_V_M2_MASK:
@@ -11662,6 +11671,7 @@ RISCVTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
11662
11671
return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_XU_F_V_MF2_MASK);
11663
11672
case RISCV::PseudoVFCVT_RM_XU_F_V_MF4_MASK:
11664
11673
return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_XU_F_V_MF4_MASK);
11674
+
11665
11675
case RISCV::PseudoVFCVT_RM_F_XU_V_M1_MASK:
11666
11676
return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_F_XU_V_M1_MASK);
11667
11677
case RISCV::PseudoVFCVT_RM_F_XU_V_M2_MASK:
@@ -11674,6 +11684,102 @@ RISCVTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
11674
11684
return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_F_XU_V_MF2_MASK);
11675
11685
case RISCV::PseudoVFCVT_RM_F_XU_V_MF4_MASK:
11676
11686
return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_F_XU_V_MF4_MASK);
11687
+
11688
+ case RISCV::PseudoVFCVT_RM_F_X_V_M1_MASK:
11689
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_F_X_V_M1_MASK);
11690
+ case RISCV::PseudoVFCVT_RM_F_X_V_M2_MASK:
11691
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_F_X_V_M2_MASK);
11692
+ case RISCV::PseudoVFCVT_RM_F_X_V_M4_MASK:
11693
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_F_X_V_M4_MASK);
11694
+ case RISCV::PseudoVFCVT_RM_F_X_V_M8_MASK:
11695
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_F_X_V_M8_MASK);
11696
+ case RISCV::PseudoVFCVT_RM_F_X_V_MF2_MASK:
11697
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_F_X_V_MF2_MASK);
11698
+ case RISCV::PseudoVFCVT_RM_F_X_V_MF4_MASK:
11699
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFCVT_F_X_V_MF4_MASK);
11700
+
11701
+ // =========================================================================
11702
+ // VFWCVT
11703
+ // =========================================================================
11704
+
11705
+ case RISCV::PseudoVFWCVT_RM_XU_F_V_M1_MASK:
11706
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_X_F_V_M1_MASK);
11707
+ case RISCV::PseudoVFWCVT_RM_XU_F_V_M2_MASK:
11708
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_X_F_V_M2_MASK);
11709
+ case RISCV::PseudoVFWCVT_RM_XU_F_V_M4_MASK:
11710
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_X_F_V_M4_MASK);
11711
+ case RISCV::PseudoVFWCVT_RM_XU_F_V_MF2_MASK:
11712
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_X_F_V_MF2_MASK);
11713
+ case RISCV::PseudoVFWCVT_RM_XU_F_V_MF4_MASK:
11714
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_X_F_V_MF4_MASK);
11715
+
11716
+ case RISCV::PseudoVFWCVT_RM_X_F_V_M1_MASK:
11717
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_X_F_V_M1_MASK);
11718
+ case RISCV::PseudoVFWCVT_RM_X_F_V_M2_MASK:
11719
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_X_F_V_M2_MASK);
11720
+ case RISCV::PseudoVFWCVT_RM_X_F_V_M4_MASK:
11721
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_X_F_V_M4_MASK);
11722
+ case RISCV::PseudoVFWCVT_RM_X_F_V_MF2_MASK:
11723
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_X_F_V_MF2_MASK);
11724
+ case RISCV::PseudoVFWCVT_RM_X_F_V_MF4_MASK:
11725
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_X_F_V_MF4_MASK);
11726
+
11727
+ case RISCV::PseudoVFWCVT_RM_F_XU_V_M1_MASK:
11728
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_F_XU_V_M1_MASK);
11729
+ case RISCV::PseudoVFWCVT_RM_F_XU_V_M2_MASK:
11730
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_F_XU_V_M2_MASK);
11731
+ case RISCV::PseudoVFWCVT_RM_F_XU_V_M4_MASK:
11732
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_F_XU_V_M4_MASK);
11733
+ case RISCV::PseudoVFWCVT_RM_F_XU_V_MF2_MASK:
11734
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_F_XU_V_MF2_MASK);
11735
+ case RISCV::PseudoVFWCVT_RM_F_XU_V_MF4_MASK:
11736
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_F_XU_V_MF4_MASK);
11737
+ case RISCV::PseudoVFWCVT_RM_F_XU_V_MF8_MASK:
11738
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_F_XU_V_MF8_MASK);
11739
+
11740
+ case RISCV::PseudoVFWCVT_RM_F_X_V_M1_MASK:
11741
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_F_XU_V_M1_MASK);
11742
+ case RISCV::PseudoVFWCVT_RM_F_X_V_M2_MASK:
11743
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_F_XU_V_M2_MASK);
11744
+ case RISCV::PseudoVFWCVT_RM_F_X_V_M4_MASK:
11745
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_F_XU_V_M4_MASK);
11746
+ case RISCV::PseudoVFWCVT_RM_F_X_V_MF2_MASK:
11747
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_F_XU_V_MF2_MASK);
11748
+ case RISCV::PseudoVFWCVT_RM_F_X_V_MF4_MASK:
11749
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_F_XU_V_MF4_MASK);
11750
+ case RISCV::PseudoVFWCVT_RM_F_X_V_MF8_MASK:
11751
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFWCVT_F_XU_V_MF8_MASK);
11752
+
11753
+ // =========================================================================
11754
+ // VFNCVT
11755
+ // =========================================================================
11756
+
11757
+ case RISCV::PseudoVFNCVT_RM_XU_F_W_M1_MASK:
11758
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_X_F_W_M1_MASK);
11759
+ case RISCV::PseudoVFNCVT_RM_XU_F_W_M2_MASK:
11760
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_X_F_W_M2_MASK);
11761
+ case RISCV::PseudoVFNCVT_RM_XU_F_W_M4_MASK:
11762
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_X_F_W_M4_MASK);
11763
+ case RISCV::PseudoVFNCVT_RM_XU_F_W_MF2_MASK:
11764
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_X_F_W_MF2_MASK);
11765
+ case RISCV::PseudoVFNCVT_RM_XU_F_W_MF4_MASK:
11766
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_X_F_W_MF4_MASK);
11767
+ case RISCV::PseudoVFNCVT_RM_XU_F_W_MF8_MASK:
11768
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_XU_F_W_MF8_MASK);
11769
+
11770
+ case RISCV::PseudoVFNCVT_RM_X_F_W_M1_MASK:
11771
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_X_F_W_M1_MASK);
11772
+ case RISCV::PseudoVFNCVT_RM_X_F_W_M2_MASK:
11773
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_X_F_W_M2_MASK);
11774
+ case RISCV::PseudoVFNCVT_RM_X_F_W_M4_MASK:
11775
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_X_F_W_M4_MASK);
11776
+ case RISCV::PseudoVFNCVT_RM_X_F_W_MF2_MASK:
11777
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_X_F_W_MF2_MASK);
11778
+ case RISCV::PseudoVFNCVT_RM_X_F_W_MF4_MASK:
11779
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_X_F_W_MF4_MASK);
11780
+ case RISCV::PseudoVFNCVT_RM_X_F_W_MF8_MASK:
11781
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_X_F_W_MF8_MASK);
11782
+
11677
11783
case RISCV::PseudoVFNCVT_RM_F_XU_W_M1_MASK:
11678
11784
return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_F_XU_W_M1_MASK);
11679
11785
case RISCV::PseudoVFNCVT_RM_F_XU_W_M2_MASK:
@@ -11684,6 +11790,18 @@ RISCVTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
11684
11790
return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_F_XU_W_MF2_MASK);
11685
11791
case RISCV::PseudoVFNCVT_RM_F_XU_W_MF4_MASK:
11686
11792
return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_F_XU_W_MF4_MASK);
11793
+
11794
+ case RISCV::PseudoVFNCVT_RM_F_X_W_M1_MASK:
11795
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_F_XU_W_M1_MASK);
11796
+ case RISCV::PseudoVFNCVT_RM_F_X_W_M2_MASK:
11797
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_F_XU_W_M2_MASK);
11798
+ case RISCV::PseudoVFNCVT_RM_F_X_W_M4_MASK:
11799
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_F_XU_W_M4_MASK);
11800
+ case RISCV::PseudoVFNCVT_RM_F_X_W_MF2_MASK:
11801
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_F_XU_W_MF2_MASK);
11802
+ case RISCV::PseudoVFNCVT_RM_F_X_W_MF4_MASK:
11803
+ return emitVFCVT_RM_MASK(MI, BB, RISCV::PseudoVFNCVT_F_XU_W_MF4_MASK);
11804
+
11687
11805
case RISCV::PseudoVFROUND_NOEXCEPT_V_M1_MASK:
11688
11806
return emitVFROUND_NOEXCEPT_MASK(MI, BB, RISCV::PseudoVFCVT_X_F_V_M1_MASK,
11689
11807
RISCV::PseudoVFCVT_F_X_V_M1_MASK);
@@ -13283,6 +13401,7 @@ const char *RISCVTargetLowering::getTargetNodeName(unsigned Opcode) const {
13283
13401
NODE_NAME_CASE(SINT_TO_FP_VL)
13284
13402
NODE_NAME_CASE(UINT_TO_FP_VL)
13285
13403
NODE_NAME_CASE(VFCVT_RM_F_XU_VL)
13404
+ NODE_NAME_CASE(VFCVT_RM_F_X_VL)
13286
13405
NODE_NAME_CASE(FP_EXTEND_VL)
13287
13406
NODE_NAME_CASE(FP_ROUND_VL)
13288
13407
NODE_NAME_CASE(VWMUL_VL)
0 commit comments