Index: llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp =================================================================== --- llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -14,6 +14,7 @@ #include "Utils/RISCVBaseInfo.h" #include "Utils/RISCVMatInt.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/SmallBitVector.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/CodeGen/Register.h" @@ -173,6 +174,9 @@ return false; } + + std::unique_ptr defaultRVVMask() const; + public: enum RISCVMatchResultTy { Match_Dummy = FIRST_TARGET_MATCH_RESULT_TY, @@ -841,9 +845,15 @@ assert(N == 1 && "Invalid number of operands!"); Inst.addOperand(MCOperand::createImm(getRoundingMode())); } + }; } // end anonymous namespace. +std::unique_ptr RISCVAsmParser::defaultRVVMask() const { + return RISCVOperand::createReg(RISCV::NoRegister, llvm::SMLoc(), + llvm::SMLoc(), isRV64()); +} + #define GET_REGISTER_MATCHER #define GET_MATCHER_IMPLEMENTATION #include "RISCVGenAsmMatcher.inc" @@ -1932,6 +1942,12 @@ bool RISCVAsmParser::validateInstruction(MCInst &Inst, OperandVector &Operands) { + // FIXME! + // We should look at the mask operand if any and update this code for the + // proper diagnostics. + return false; + +#if 0 SMLoc Loc = Operands[0]->getStartLoc(); const unsigned Opcode = Inst.getOpcode(); switch (Opcode) { @@ -2157,6 +2173,7 @@ return false; } return false; +#endif } bool RISCVAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc, Index: llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp =================================================================== --- llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp +++ llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp @@ -163,6 +163,23 @@ return MCDisassembler::Success; } +static DecodeStatus DecodeVPRV0RegisterClass(MCInst &Inst, uint64_t RegNo, + uint64_t Address, + const void *Decoder) { + Register Reg = RISCV::NoRegister; + switch (RegNo) { + default: + return MCDisassembler::Fail; + case 0: + Reg = RISCV::V0; + break; + case 1: + break; + } + Inst.addOperand(MCOperand::createReg(Reg)); + return MCDisassembler::Success; +} + // Add implied SP operand for instructions *SP compressed instructions. The SP // operand isn't explicitly encoded in the instruction. static void addImplySP(MCInst &Inst, int64_t Address, const void *Decoder) { @@ -332,6 +349,8 @@ if (Desc.TSFlags & RISCVII::InstVectorWithMask) { if ((Insn & (0x1 << 25)) == 0) Inst.addOperand(MCOperand::createReg(RISCV::V0)); + else + Inst.addOperand(MCOperand::createReg(RISCV::NoRegister)); } } Index: llvm/lib/Target/RISCV/MCTargetDesc/RISCVInstPrinter.cpp =================================================================== --- llvm/lib/Target/RISCV/MCTargetDesc/RISCVInstPrinter.cpp +++ llvm/lib/Target/RISCV/MCTargetDesc/RISCVInstPrinter.cpp @@ -166,9 +166,11 @@ const MCOperand &MO = MI->getOperand(OpNo); assert(MO.isReg() && "printVPRMaskOp can only print register operands"); + if (MO.getReg() == RISCV::NoRegister) + return; + O << ", "; printRegName(O, MO.getReg()); O << ".t"; - return; } const char *RISCVInstPrinter::getRegisterName(unsigned RegNo) { Index: llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp =================================================================== --- llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp +++ llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp @@ -80,6 +80,10 @@ unsigned getImmOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl &Fixups, const MCSubtargetInfo &STI) const; + + unsigned getVPRMaskOp(const MCInst &MI, unsigned OpNo, + SmallVectorImpl &Fixups, + const MCSubtargetInfo &STI) const; }; } // end anonymous namespace @@ -368,4 +372,20 @@ return 0; } +unsigned RISCVMCCodeEmitter::getVPRMaskOp(const MCInst &MI, unsigned OpNo, + SmallVectorImpl &Fixups, + const MCSubtargetInfo &STI) const { + MCOperand MO = MI.getOperand(OpNo); + assert(MO.isReg() && "Expected a register"); + + switch (MO.getReg()) { + default: + llvm_unreachable("Invalid mask register"); + case RISCV::V0: + return 0; + case RISCV::NoRegister: + return 1; + } +} + #include "RISCVGenMCCodeEmitter.inc" Index: llvm/lib/Target/RISCV/RISCVInstrFormatsV.td =================================================================== --- llvm/lib/Target/RISCV/RISCVInstrFormatsV.td +++ llvm/lib/Target/RISCV/RISCVInstrFormatsV.td @@ -90,12 +90,13 @@ let TSFlags{5} = InstVectorNoMask.Value; } -class RVInstVV funct6, RISCVVFormat opv, bit vm, dag outs, dag ins, +class RVInstVV funct6, RISCVVFormat opv, dag outs, dag ins, string opcodestr, string argstr> : RVInst { bits<5> vs2; bits<5> vs1; bits<5> vd; + bits<1> vm; let Inst{31-26} = funct6; let Inst{25} = vm; @@ -108,12 +109,13 @@ let TSFlags{5} = InstVectorWithMask.Value; } -class RVInstVX funct6, RISCVVFormat opv, bit vm, dag outs, dag ins, +class RVInstVX funct6, RISCVVFormat opv, dag outs, dag ins, string opcodestr, string argstr> : RVInst { bits<5> vs2; bits<5> rs1; bits<5> vd; + bits<1> vm; let Inst{31-26} = funct6; let Inst{25} = vm; @@ -126,11 +128,12 @@ let TSFlags{5} = InstVectorWithMask.Value; } -class RVInstV2 funct6, bits<5> vs2, RISCVVFormat opv, bit vm, dag outs, dag ins, +class RVInstV2 funct6, bits<5> vs2, RISCVVFormat opv, dag outs, dag ins, string opcodestr, string argstr> : RVInst { bits<5> rs1; bits<5> vd; + bits<1> vm; let Inst{31-26} = funct6; let Inst{25} = vm; @@ -143,12 +146,13 @@ let TSFlags{5} = InstVectorWithMask.Value; } -class RVInstIVI funct6, bit vm, dag outs, dag ins, string opcodestr, +class RVInstIVI funct6, dag outs, dag ins, string opcodestr, string argstr> : RVInst { bits<5> vs2; bits<5> imm; bits<5> vd; + bits<1> vm; let Inst{31-26} = funct6; let Inst{25} = vm; @@ -161,11 +165,12 @@ let TSFlags{5} = InstVectorWithMask.Value; } -class RVInstV funct6, bits<5> vs1, RISCVVFormat opv, bit vm, dag outs, +class RVInstV funct6, bits<5> vs1, RISCVVFormat opv, dag outs, dag ins, string opcodestr, string argstr> : RVInst { bits<5> vs2; bits<5> vd; + bits<1> vm; let Inst{31-26} = funct6; let Inst{25} = vm; @@ -178,12 +183,13 @@ let TSFlags{5} = InstVectorWithMask.Value; } -class RVInstVLU nf, RISCVMOP mop, bit vm, RISCVLSUMOP lumop, +class RVInstVLU nf, RISCVMOP mop, RISCVLSUMOP lumop, RISCVWidth width, dag outs, dag ins, string opcodestr, string argstr> : RVInst { bits<5> rs1; bits<5> vd; + bits<1> vm; let Inst{31-29} = nf; let Inst{28-26} = mop.Value; @@ -197,12 +203,13 @@ let TSFlags{5} = InstVectorWithMask.Value; } -class RVInstVLS nf, RISCVMOP mop, bit vm, RISCVWidth width, +class RVInstVLS nf, RISCVMOP mop, RISCVWidth width, dag outs, dag ins, string opcodestr, string argstr> : RVInst { bits<5> rs2; bits<5> rs1; bits<5> vd; + bits<1> vm; let Inst{31-29} = nf; let Inst{28-26} = mop.Value; @@ -216,12 +223,13 @@ let TSFlags{5} = InstVectorWithMask.Value; } -class RVInstVLX nf, RISCVMOP mop, bit vm, RISCVWidth width, +class RVInstVLX nf, RISCVMOP mop, RISCVWidth width, dag outs, dag ins, string opcodestr, string argstr> : RVInst { bits<5> vs2; bits<5> rs1; bits<5> vd; + bits<1> vm; let Inst{31-29} = nf; let Inst{28-26} = mop.Value; @@ -235,12 +243,13 @@ let TSFlags{5} = InstVectorWithMask.Value; } -class RVInstVSU nf, RISCVMOP mop, bit vm, RISCVLSUMOP sumop, +class RVInstVSU nf, RISCVMOP mop, RISCVLSUMOP sumop, RISCVWidth width, dag outs, dag ins, string opcodestr, string argstr> : RVInst { bits<5> rs1; bits<5> vs3; + bits<1> vm; let Inst{31-29} = nf; let Inst{28-26} = mop.Value; @@ -254,12 +263,13 @@ let TSFlags{5} = InstVectorWithMask.Value; } -class RVInstVSS nf, RISCVMOP mop, bit vm, RISCVWidth width, +class RVInstVSS nf, RISCVMOP mop, RISCVWidth width, dag outs, dag ins, string opcodestr, string argstr> : RVInst { bits<5> rs2; bits<5> rs1; bits<5> vs3; + bits<1> vm; let Inst{31-29} = nf; let Inst{28-26} = mop.Value; @@ -273,12 +283,13 @@ let TSFlags{5} = InstVectorWithMask.Value; } -class RVInstVSX nf, RISCVMOP mop, bit vm, RISCVWidth width, +class RVInstVSX nf, RISCVMOP mop, RISCVWidth width, dag outs, dag ins, string opcodestr, string argstr> : RVInst { bits<5> vs2; bits<5> rs1; bits<5> vs3; + bits<1> vm; let Inst{31-29} = nf; let Inst{28-26} = mop.Value; Index: llvm/lib/Target/RISCV/RISCVInstrInfoV.td =================================================================== --- llvm/lib/Target/RISCV/RISCVInstrInfoV.td +++ llvm/lib/Target/RISCV/RISCVInstrInfoV.td @@ -46,11 +46,14 @@ let RenderMethod = "addRegOperands"; let PredicateMethod = "isReg"; let ParserMethod = "parseMaskRegister"; + let IsOptional = 1; + let DefaultMethod = "defaultRVVMask"; } def VPRMaskRegOp: RegisterOperand { let ParserMatchClass = VPRMaskAsmOperand; let PrintMethod = "printVPRMaskOp"; + let EncoderMethod = "getVPRMaskOp"; } def simm5 : Operand, ImmLeaf(Imm);}]> { @@ -70,195 +73,121 @@ //===----------------------------------------------------------------------===// let hasSideEffects = 0, mayLoad = 1, mayStore = 0 in { -// load vd, (rs1) (without mask) -class VUnitStrideLoad - : RVInstVLU<0b000, mop, 1, lumop, width, (outs VPRRegOp:$vd), - (ins GPR:$rs1), opcodestr, "$vd, (${rs1})">; - // load vd, (rs1), vm (with mask) class VUnitStrideLoad_t - : RVInstVLU<0b000, mop, 0, lumop, width, (outs VPRRegOp:$vd), - (ins GPR:$rs1, VPRMaskRegOp:$vm), opcodestr, "$vd, (${rs1}), $vm">; - -// load vd, (rs1), rs2 (without mask) -class VStridedLoad - : RVInstVLS<0b000, mop, 1, width, (outs VPRRegOp:$vd), - (ins GPR:$rs1, GPR:$rs2), opcodestr, "$vd, (${rs1}), $rs2">; + : RVInstVLU<0b000, mop, lumop, width, (outs VPRRegOp:$vd), + (ins GPR:$rs1, VPRMaskRegOp:$vm), opcodestr, "$vd, (${rs1})${vm}">; // load vd, (rs1), rs2, vm (with mask) class VStridedLoad_t - : RVInstVLS<0b000, mop, 0, width, (outs VPRRegOp:$vd), + : RVInstVLS<0b000, mop, width, (outs VPRRegOp:$vd), (ins GPR:$rs1, GPR:$rs2, VPRMaskRegOp:$vm), opcodestr, - "$vd, (${rs1}), $rs2, $vm">; - -// load vd, (rs1), vs2 (without mask) -class VIndexedLoad - : RVInstVLX<0b000, mop, 1, width, (outs VPRRegOp:$vd), - (ins GPR:$rs1, VPRRegOp:$vs2), opcodestr, - "$vd, (${rs1}), $vs2">; + "$vd, (${rs1}), $rs2${vm}">; // load vd, (rs1), vs2, vm (with mask) class VIndexedLoad_t - : RVInstVLX<0b000, mop, 0, width, (outs VPRRegOp:$vd), + : RVInstVLX<0b000, mop, width, (outs VPRRegOp:$vd), (ins GPR:$rs1, VPRRegOp:$vs2, VPRMaskRegOp:$vm), opcodestr, - "$vd, (${rs1}), $vs2, $vm">; + "$vd, (${rs1}), $vs2${vm}">; } let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in { -// store vd, vs3, (rs1) (without mask) -class VUnitStrideStore - : RVInstVSU<0b000, mop, 1, sumop, width, (outs), - (ins VPRRegOp:$vs3, GPR:$rs1), opcodestr, "$vs3, (${rs1})">; - // store vd, vs3, (rs1), vm (with mask) class VUnitStrideStore_t - : RVInstVSU<0b000, mop, 0, sumop, width, (outs), + : RVInstVSU<0b000, mop, sumop, width, (outs), (ins VPRRegOp:$vs3, GPR:$rs1, VPRMaskRegOp:$vm), opcodestr, - "$vs3, (${rs1}), $vm">; - -// store vd, vs3, (rs1), rs2 (without mask) -class VStridedStore - : RVInstVSS<0b000, mop, 1, width, (outs), - (ins VPRRegOp:$vs3, GPR:$rs1, GPR:$rs2), opcodestr, - "$vs3, (${rs1}), $rs2">; + "$vs3, (${rs1})${vm}">; // store vd, vs3, (rs1), rs2, vm (with mask) class VStridedStore_t - : RVInstVSS<0b000, mop, 0, width, (outs), + : RVInstVSS<0b000, mop, width, (outs), (ins VPRRegOp:$vs3, GPR:$rs1, GPR:$rs2, VPRMaskRegOp:$vm), - opcodestr, "$vs3, (${rs1}), $rs2, $vm">; - -// store vd, vs3, (rs1), vs2 (without mask) -class VIndexedStore - : RVInstVSX<0b000, mop, 1, width, (outs), - (ins VPRRegOp:$vs3, GPR:$rs1, VPRRegOp:$vs2), opcodestr, - "$vs3, (${rs1}), $vs2">; + opcodestr, "$vs3, (${rs1}), $rs2${vm}">; // store vd, vs3, (rs1), vs2, vm (with mask) class VIndexedStore_t - : RVInstVSX<0b000, mop, 0, width, (outs), + : RVInstVSX<0b000, mop, width, (outs), (ins VPRRegOp:$vs3, GPR:$rs1, VPRRegOp:$vs2, VPRMaskRegOp:$vm), - opcodestr, "$vs3, (${rs1}), $vs2, $vm">; + opcodestr, "$vs3, (${rs1}), $vs2${vm}">; } let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in { // op vd, vs2, vs1 (without mask) +let vm = 1 in class VALUVV funct6, RISCVVFormat opv, string opcodestr> - : RVInstVV; // op vd, vs2, vs1, vm (with mask) class VALUVV_t funct6, RISCVVFormat opv, string opcodestr> - : RVInstVV; + opcodestr, "$vd, $vs2, $vs1${vm}">; // op vd, vs2, vs1, v0 (without mask, use v0 as carry input) +let vm = 1 in class VALUmVV funct6, RISCVVFormat opv, string opcodestr> - : RVInstVV; -// op vd, vs1, vs2 (without mask, reverse the order of vs1 and vs2) -class VALUrVV funct6, RISCVVFormat opv, string opcodestr> - : RVInstVV; - // op vd, vs1, vs2, vm (with mask, reverse the order of vs1 and vs2) class VALUrVV_t funct6, RISCVVFormat opv, string opcodestr> - : RVInstVV; - -// op vd, vs2, rs1 (without mask) -class VALUVX funct6, RISCVVFormat opv, string opcodestr> - : RVInstVX; + opcodestr, "$vd, $vs1, $vs2${vm}">; // op vd, vs2, rs1, vm (with mask) class VALUVX_t funct6, RISCVVFormat opv, string opcodestr> - : RVInstVX; + opcodestr, "$vd, $vs2, $rs1${vm}">; // op vd, vs2, rs1, v0 (without mask, use v0 as carry input) +let vm = 1 in class VALUmVX funct6, RISCVVFormat opv, string opcodestr> - : RVInstVX; -// op vd, rs1, vs2 (without mask, reverse the order of rs1 and vs2) -class VALUrVX funct6, RISCVVFormat opv, string opcodestr> - : RVInstVX; - // op vd, rs1, vs2, vm (with mask, reverse the order of rs1 and vs2) class VALUrVX_t funct6, RISCVVFormat opv, string opcodestr> - : RVInstVX; - -// op vd, vs2, imm (without mask) -class VALUVI funct6, string opcodestr, Operand optype = simm5> - : RVInstIVI; + opcodestr, "$vd, $rs1, $vs2${vm}">; // op vd, vs2, imm, vm (with mask) class VALUVI_t funct6, string opcodestr, Operand optype = simm5> - : RVInstIVI; + opcodestr, "$vd, $vs2, $imm${vm}">; // op vd, vs2, imm, v0 (without mask, use v0 as carry input) class VALUmVI funct6, string opcodestr, Operand optype = simm5> - : RVInstIVI; -// op vd, vs2, rs1 (Float) (without mask) -class VALUVF funct6, RISCVVFormat opv, string opcodestr> - : RVInstVX; - // op vd, vs2, rs1, vm (Float) (with mask) class VALUVF_t funct6, RISCVVFormat opv, string opcodestr> - : RVInstVX; - -// op vd, rs1, vs2 (Float) (without mask, reverse the order of rs1 and vs2) -class VALUrVF funct6, RISCVVFormat opv, string opcodestr> - : RVInstVX; + opcodestr, "$vd, $vs2, $rs1${vm}">; // op vd, rs1, vs2 (Float) (with mask, reverse the order of rs1 and vs2) class VALUrVF_t funct6, RISCVVFormat opv, string opcodestr> - : RVInstVX; - -// op vd, vs2 (without mask, use vs1 as instruction encoding) -class VALUVs2 funct6, bits<5> vs1, RISCVVFormat opv, string opcodestr> - : RVInstV; + opcodestr, "$vd, $rs1, $vs2${vm}">; // op vd, vs2, vm (with mask, use vs1 as instruction encoding) class VALUVs2_t funct6, bits<5> vs1, RISCVVFormat opv, string opcodestr> - : RVInstV; + opcodestr, "$vd, $vs2${vm}">; } //===----------------------------------------------------------------------===// @@ -267,75 +196,61 @@ //===----------------------------------------------------------------------===// multiclass VALUVV_Mask funct6, RISCVVFormat opv, string opcodestr> { - def "": VALUVV; - def _T : VALUVV_t; + def "" : VALUVV_t; } multiclass VALUrVV_Mask funct6, RISCVVFormat opv, string opcodestr> { - def "": VALUrVV; - def _T : VALUrVV_t; + def "" : VALUrVV_t; } multiclass VALUVX_Mask funct6, RISCVVFormat opv, string opcodestr> { - def "": VALUVX; - def _T : VALUVX_t; + def "" : VALUVX_t; } multiclass VALUrVX_Mask funct6, RISCVVFormat opv, string opcodestr> { - def "": VALUrVX; - def _T : VALUrVX_t; + def "" : VALUrVX_t; } multiclass VALUVI_Mask funct6, string opcodestr, Operand optype = simm5> { - def "": VALUVI; - def _T : VALUVI_t; + def "" : VALUVI_t; } multiclass VALUVF_Mask funct6, RISCVVFormat opv, string opcodestr> { - def "": VALUVF; - def _T : VALUVF_t; + def "" : VALUVF_t; } multiclass VALUrVF_Mask funct6, RISCVVFormat opv, string opcodestr> { - def "": VALUrVF; - def _T : VALUrVF_t; + def "" : VALUrVF_t; } multiclass VALUVs2_Mask funct6, bits<5> vs1, RISCVVFormat opv, string opcodestr> { - def "": VALUVs2; - def _T : VALUVs2_t; + def "" : VALUVs2_t; } multiclass VUnitStrideLoadMask { - def "": VUnitStrideLoad; - def _T : VUnitStrideLoad_t; + def "" : VUnitStrideLoad_t; } multiclass VStridedLoadMask { - def "": VStridedLoad; - def _T : VStridedLoad_t; + def "" : VStridedLoad_t; } multiclass VIndexedLoadMask { - def "": VIndexedLoad; - def _T : VIndexedLoad_t; + def "" : VIndexedLoad_t; } multiclass VUnitStrideStoreMask { - def "": VUnitStrideStore; - def _T : VUnitStrideStore_t; + def "" : VUnitStrideStore_t; } multiclass VStridedStoreMask { - def "": VStridedStore; - def _T : VStridedStore_t; + def "" : VStridedStore_t; } multiclass VIndexedStoreMask { - def "": VIndexedStore; - def _T : VIndexedStore_t; + def "" : VIndexedStore_t; } multiclass VALU_IV_V_X_I funct6, Operand optype = simm5, string vw = "v"> { @@ -610,18 +525,21 @@ // Vector Integer Move Instructions let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in { // op vd, vs1 -def VMV_V_V : RVInstVV<0b010111, OPIVV, 1, (outs VPRRegOp:$vd), +def VMV_V_V : RVInstVV<0b010111, OPIVV, (outs VPRRegOp:$vd), (ins VPRRegOp:$vs1), "vmv.v.v", "$vd, $vs1"> { + let vm = 1; let vs2 = 0; } // op vd, rs1 -def VMV_V_X : RVInstVX<0b010111, OPIVX, 1, (outs VPRRegOp:$vd), +def VMV_V_X : RVInstVX<0b010111, OPIVX, (outs VPRRegOp:$vd), (ins GPR:$rs1), "vmv.v.x", "$vd, $rs1"> { + let vm = 1; let vs2 = 0; } // op vd, imm -def VMV_V_I : RVInstIVI<0b010111, 1, (outs VPRRegOp:$vd), +def VMV_V_I : RVInstIVI<0b010111, (outs VPRRegOp:$vd), (ins simm5:$imm), "vmv.v.i", "$vd, $imm"> { + let vm = 1; let vs2 = 0; } } @@ -722,13 +640,17 @@ let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in { // Vector Floating-Point Merge Instruction -def VFMERGE_VFM : RVInstVX<0b010111, OPFVF, 0, (outs VPRRegOp:$vd), +def VFMERGE_VFM : RVInstVX<0b010111, OPFVF, (outs VPRRegOp:$vd), (ins VPRRegOp:$vs2, FPR32:$rs1, VPRV0:$v0), - "vfmerge.vfm", "$vd, $vs2, $rs1, v0">; + "vfmerge.vfm", "$vd, $vs2, $rs1, v0"> +{ + let vm = 0; +} // Vector Floating-Point Move Instruction -def VFMV_V_F : RVInstVX<0b010111, OPFVF, 1, (outs VPRRegOp:$vd), +def VFMV_V_F : RVInstVX<0b010111, OPFVF, (outs VPRRegOp:$vd), (ins FPR32:$rs1), "vfmv.v.f", "$vd, $rs1"> { + let vm = 1; let vs2 = 0; } } @@ -792,18 +714,14 @@ let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in { // Vector mask population count vpopc -def VPOPC_M : RVInstV<0b010000, 0b10000, OPMVV, 1, (outs GPR:$vd), - (ins VPRRegOp:$vs2), "vpopc.m", "$vd, $vs2">; -def VPOPC_M_T : RVInstV<0b010000, 0b10000, OPMVV, 0, (outs GPR:$vd), +def VPOPC_M : RVInstV<0b010000, 0b10000, OPMVV, (outs GPR:$vd), (ins VPRRegOp:$vs2, VPRMaskRegOp:$vm), - "vpopc.m", "$vd, $vs2, $vm">; + "vpopc.m", "$vd, $vs2${vm}">; // vfirst find-first-set mask bit -def VFIRST_M : RVInstV<0b010000, 0b10001, OPMVV, 1, (outs GPR:$vd), - (ins VPRRegOp:$vs2), "vfirst.m", "$vd, $vs2">; -def VFIRST_M_T : RVInstV<0b010000, 0b10001, OPMVV, 0, (outs GPR:$vd), +def VFIRST_M : RVInstV<0b010000, 0b10001, OPMVV, (outs GPR:$vd), (ins VPRRegOp:$vs2, VPRMaskRegOp:$vm), - "vfirst.m", "$vd, $vs2, $vm">; + "vfirst.m", "$vd, $vs2${vm}">; } // vmsbf.m set-before-first mask bit @@ -822,27 +740,35 @@ // Vector Element Index Instruction let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in { -def VID_V : RVInstV<0b010100, 0b10001, OPMVV, 1, (outs VPRRegOp:$vd), - (ins), "vid.v", "$vd"> { - let vs2 = 0; -} -def VID_V_T : RVInstV<0b010100, 0b10001, OPMVV, 0, (outs VPRRegOp:$vd), - (ins VPRMaskRegOp:$vm), "vid.v", "$vd, $vm"> { +def VID_V : RVInstV<0b010100, 0b10001, OPMVV, (outs VPRRegOp:$vd), + (ins VPRMaskRegOp:$vm), "vid.v", "$vd${vm}"> { let vs2 = 0; } // Integer Scalar Move Instructions -def VMV_X_S : RVInstV<0b010000, 0b00000, OPMVV, 1, (outs GPR:$vd), - (ins VPRRegOp:$vs2), "vmv.x.s", "$vd, $vs2">; -def VMV_S_X : RVInstV2<0b010000, 0b00000, OPMVX, 1, (outs VPRRegOp:$vd), - (ins GPR:$rs1), "vmv.s.x", "$vd, $rs1">; +def VMV_X_S : RVInstV<0b010000, 0b00000, OPMVV, (outs GPR:$vd), + (ins VPRRegOp:$vs2), "vmv.x.s", "$vd, $vs2"> +{ + let vm = 1; +} +def VMV_S_X : RVInstV2<0b010000, 0b00000, OPMVX, (outs VPRRegOp:$vd), + (ins GPR:$rs1), "vmv.s.x", "$vd, $rs1"> +{ + let vm = 1; +} // Floating-Point Scalar Move Instructions -def VFMV_F_S : RVInstV<0b010000, 0b00000, OPFVV, 1, (outs FPR32:$vd), - (ins VPRRegOp:$vs2), "vfmv.f.s", "$vd, $vs2">; -def VFMV_S_F : RVInstV2<0b010000, 0b00000, OPFVF, 1, (outs VPRRegOp:$vd), - (ins FPR32:$rs1), "vfmv.s.f", "$vd, $rs1">; +def VFMV_F_S : RVInstV<0b010000, 0b00000, OPFVV, (outs FPR32:$vd), + (ins VPRRegOp:$vs2), "vfmv.f.s", "$vd, $vs2"> +{ + let vm = 1; +} +def VFMV_S_F : RVInstV2<0b010000, 0b00000, OPFVF, (outs VPRRegOp:$vd), + (ins FPR32:$rs1), "vfmv.s.f", "$vd, $rs1"> +{ + let vm = 1; +} } // Vector Slide Instructions