@@ -17787,6 +17787,18 @@ static MachineBasicBlock *emitSelectPseudo(MachineInstr &MI,
17787
17787
return TailMBB;
17788
17788
}
17789
17789
17790
+ // Helper to find Masked Pseudo instruction from MC instruction, LMUL and SEW.
17791
+ static const RISCV::RISCVMaskedPseudoInfo *
17792
+ lookupMaskedIntrinsic(uint16_t MCOpcode, RISCVII::VLMUL LMul, unsigned SEW) {
17793
+ const RISCVVInversePseudosTable::PseudoInfo *Inverse =
17794
+ RISCVVInversePseudosTable::getBaseInfo(MCOpcode, LMul, SEW);
17795
+ assert(Inverse && "Unexpected LMUL and SEW pair for instruction");
17796
+ const RISCV::RISCVMaskedPseudoInfo *Masked =
17797
+ RISCV::lookupMaskedIntrinsicByUnmasked(Inverse->Pseudo);
17798
+ assert(Masked && "Could not find masked instruction for LMUL and SEW pair");
17799
+ return Masked;
17800
+ }
17801
+
17790
17802
static MachineBasicBlock *emitVFROUND_NOEXCEPT_MASK(MachineInstr &MI,
17791
17803
MachineBasicBlock *BB,
17792
17804
unsigned CVTXOpc) {
@@ -17824,80 +17836,9 @@ static MachineBasicBlock *emitVFROUND_NOEXCEPT_MASK(MachineInstr &MI,
17824
17836
unsigned Log2SEW = MI.getOperand(RISCVII::getSEWOpNum(MI.getDesc())).getImm();
17825
17837
// There is no E8 variant for VFCVT_F_X.
17826
17838
assert(Log2SEW >= 4);
17827
- // Since MI (VFROUND) isn't SEW specific, we cannot use a macro to make
17828
- // handling of different (LMUL, SEW) pairs easier because we need to pull the
17829
- // SEW immediate from MI, and that information is not avaliable during macro
17830
- // expansion.
17831
- unsigned CVTFOpc;
17832
- if (Log2SEW == 4) {
17833
- switch (LMul) {
17834
- case RISCVII::LMUL_1:
17835
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M1_E16_MASK;
17836
- break;
17837
- case RISCVII::LMUL_2:
17838
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M2_E16_MASK;
17839
- break;
17840
- case RISCVII::LMUL_4:
17841
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M4_E16_MASK;
17842
- break;
17843
- case RISCVII::LMUL_8:
17844
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M8_E16_MASK;
17845
- break;
17846
- case RISCVII::LMUL_F2:
17847
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_MF2_E16_MASK;
17848
- break;
17849
- case RISCVII::LMUL_F4:
17850
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_MF4_E16_MASK;
17851
- break;
17852
- case RISCVII::LMUL_F8:
17853
- case RISCVII::LMUL_RESERVED:
17854
- llvm_unreachable("Unexpected LMUL and SEW combination value for MI.");
17855
- }
17856
- } else if (Log2SEW == 5) {
17857
- switch (LMul) {
17858
- case RISCVII::LMUL_1:
17859
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M1_E32_MASK;
17860
- break;
17861
- case RISCVII::LMUL_2:
17862
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M2_E32_MASK;
17863
- break;
17864
- case RISCVII::LMUL_4:
17865
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M4_E32_MASK;
17866
- break;
17867
- case RISCVII::LMUL_8:
17868
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M8_E32_MASK;
17869
- break;
17870
- case RISCVII::LMUL_F2:
17871
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_MF2_E32_MASK;
17872
- break;
17873
- case RISCVII::LMUL_F4:
17874
- case RISCVII::LMUL_F8:
17875
- case RISCVII::LMUL_RESERVED:
17876
- llvm_unreachable("Unexpected LMUL and SEW combination value for MI.");
17877
- }
17878
- } else if (Log2SEW == 6) {
17879
- switch (LMul) {
17880
- case RISCVII::LMUL_1:
17881
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M1_E64_MASK;
17882
- break;
17883
- case RISCVII::LMUL_2:
17884
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M2_E64_MASK;
17885
- break;
17886
- case RISCVII::LMUL_4:
17887
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M4_E64_MASK;
17888
- break;
17889
- case RISCVII::LMUL_8:
17890
- CVTFOpc = RISCV::PseudoVFCVT_F_X_V_M8_E64_MASK;
17891
- break;
17892
- case RISCVII::LMUL_F2:
17893
- case RISCVII::LMUL_F4:
17894
- case RISCVII::LMUL_F8:
17895
- case RISCVII::LMUL_RESERVED:
17896
- llvm_unreachable("Unexpected LMUL and SEW combination value for MI.");
17897
- }
17898
- } else {
17899
- llvm_unreachable("Unexpected LMUL and SEW combination value for MI.");
17900
- }
17839
+ unsigned CVTFOpc =
17840
+ lookupMaskedIntrinsic(RISCV::VFCVT_F_X_V, LMul, 1 << Log2SEW)
17841
+ ->MaskedPseudo;
17901
17842
17902
17843
BuildMI(*BB, MI, DL, TII.get(CVTFOpc))
17903
17844
.add(MI.getOperand(0))
0 commit comments