diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp index f43c120dc1946..ccf34b8a6b2b0 100644 --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp @@ -1664,32 +1664,50 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) { switch (RISCVTargetLowering::getLMUL(Src1VT)) { default: llvm_unreachable("Unexpected LMUL!"); -#define CASE_VMSLT_VMNAND_VMSET_OPCODES(lmulenum, suffix, suffix_b) \ +#define CASE_VMSLT_OPCODES(lmulenum, suffix) \ case RISCVII::VLMUL::lmulenum: \ VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \ : RISCV::PseudoVMSLT_VX_##suffix; \ VMSGTOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix \ : RISCV::PseudoVMSGT_VX_##suffix; \ - VMNANDOpcode = RISCV::PseudoVMNAND_MM_##suffix_b; \ - VMSetOpcode = RISCV::PseudoVMSET_M_##suffix_b; \ break; - CASE_VMSLT_VMNAND_VMSET_OPCODES(LMUL_F8, MF8, B64) - CASE_VMSLT_VMNAND_VMSET_OPCODES(LMUL_F4, MF4, B32) - CASE_VMSLT_VMNAND_VMSET_OPCODES(LMUL_F2, MF2, B16) - CASE_VMSLT_VMNAND_VMSET_OPCODES(LMUL_1, M1, B8) - CASE_VMSLT_VMNAND_VMSET_OPCODES(LMUL_2, M2, B4) - CASE_VMSLT_VMNAND_VMSET_OPCODES(LMUL_4, M4, B2) - CASE_VMSLT_VMNAND_VMSET_OPCODES(LMUL_8, M8, B1) -#undef CASE_VMSLT_VMNAND_VMSET_OPCODES + CASE_VMSLT_OPCODES(LMUL_F8, MF8) + CASE_VMSLT_OPCODES(LMUL_F4, MF4) + CASE_VMSLT_OPCODES(LMUL_F2, MF2) + CASE_VMSLT_OPCODES(LMUL_1, M1) + CASE_VMSLT_OPCODES(LMUL_2, M2) + CASE_VMSLT_OPCODES(LMUL_4, M4) + CASE_VMSLT_OPCODES(LMUL_8, M8) +#undef CASE_VMSLT_OPCODES + } + // Mask operations use the LMUL from the mask type. + switch (RISCVTargetLowering::getLMUL(VT)) { + default: + llvm_unreachable("Unexpected LMUL!"); +#define CASE_VMNAND_VMSET_OPCODES(lmulenum, suffix) \ + case RISCVII::VLMUL::lmulenum: \ + VMNANDOpcode = RISCV::PseudoVMNAND_MM_##suffix; \ + VMSetOpcode = RISCV::PseudoVMSET_M_##suffix; \ + break; + CASE_VMNAND_VMSET_OPCODES(LMUL_F8, B64) + CASE_VMNAND_VMSET_OPCODES(LMUL_F4, B32) + CASE_VMNAND_VMSET_OPCODES(LMUL_F2, B16) + CASE_VMNAND_VMSET_OPCODES(LMUL_1, B8) + CASE_VMNAND_VMSET_OPCODES(LMUL_2, B4) + CASE_VMNAND_VMSET_OPCODES(LMUL_4, B2) + CASE_VMNAND_VMSET_OPCODES(LMUL_8, B1) +#undef CASE_VMNAND_VMSET_OPCODES } SDValue SEW = CurDAG->getTargetConstant( Log2_32(Src1VT.getScalarSizeInBits()), DL, XLenVT); + SDValue MaskSEW = CurDAG->getTargetConstant(0, DL, XLenVT); SDValue VL; selectVLOp(Node->getOperand(3), VL); // If vmsge(u) with minimum value, expand it to vmset. if (IsCmpMinimum) { - ReplaceNode(Node, CurDAG->getMachineNode(VMSetOpcode, DL, VT, VL, SEW)); + ReplaceNode(Node, + CurDAG->getMachineNode(VMSetOpcode, DL, VT, VL, MaskSEW)); return; } @@ -1708,7 +1726,7 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) { CurDAG->getMachineNode(VMSLTOpcode, DL, VT, {Src1, Src2, VL, SEW}), 0); ReplaceNode(Node, CurDAG->getMachineNode(VMNANDOpcode, DL, VT, - {Cmp, Cmp, VL, SEW})); + {Cmp, Cmp, VL, MaskSEW})); return; } case Intrinsic::riscv_vmsgeu_mask: @@ -1742,7 +1760,7 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) { switch (RISCVTargetLowering::getLMUL(Src1VT)) { default: llvm_unreachable("Unexpected LMUL!"); -#define CASE_VMSLT_OPCODES(lmulenum, suffix, suffix_b) \ +#define CASE_VMSLT_OPCODES(lmulenum, suffix) \ case RISCVII::VLMUL::lmulenum: \ VMSLTOpcode = IsUnsigned ? RISCV::PseudoVMSLTU_VX_##suffix \ : RISCV::PseudoVMSLT_VX_##suffix; \ @@ -1751,13 +1769,13 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) { VMSGTMaskOpcode = IsUnsigned ? RISCV::PseudoVMSGTU_VX_##suffix##_MASK \ : RISCV::PseudoVMSGT_VX_##suffix##_MASK; \ break; - CASE_VMSLT_OPCODES(LMUL_F8, MF8, B64) - CASE_VMSLT_OPCODES(LMUL_F4, MF4, B32) - CASE_VMSLT_OPCODES(LMUL_F2, MF2, B16) - CASE_VMSLT_OPCODES(LMUL_1, M1, B8) - CASE_VMSLT_OPCODES(LMUL_2, M2, B4) - CASE_VMSLT_OPCODES(LMUL_4, M4, B2) - CASE_VMSLT_OPCODES(LMUL_8, M8, B1) + CASE_VMSLT_OPCODES(LMUL_F8, MF8) + CASE_VMSLT_OPCODES(LMUL_F4, MF4) + CASE_VMSLT_OPCODES(LMUL_F2, MF2) + CASE_VMSLT_OPCODES(LMUL_1, M1) + CASE_VMSLT_OPCODES(LMUL_2, M2) + CASE_VMSLT_OPCODES(LMUL_4, M4) + CASE_VMSLT_OPCODES(LMUL_8, M8) #undef CASE_VMSLT_OPCODES } // Mask operations use the LMUL from the mask type. diff --git a/llvm/test/CodeGen/RISCV/rvv/vmsgeu.ll b/llvm/test/CodeGen/RISCV/rvv/vmsgeu.ll index e42be4faafefc..d3f57d58c7ab7 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vmsgeu.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vmsgeu.ll @@ -2183,7 +2183,7 @@ entry: define @intrinsic_vmsgeu_vi_nxv4i16_i16( %0, iXLen %1) nounwind { ; CHECK-LABEL: intrinsic_vmsgeu_vi_nxv4i16_i16: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma +; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma ; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: ret entry: