diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -2318,23 +2318,26 @@ MCRegister SrcReg = RISCV::X0; for (RISCVMatInt::Inst &Inst : Seq) { - if (Inst.Opc == RISCV::LUI) { + switch (Inst.getOpndKind()) { + case RISCVMatInt::Imm: + emitToStreamer(Out, + MCInstBuilder(Inst.Opc).addReg(DestReg).addImm(Inst.Imm)); + break; + case RISCVMatInt::RegX0: emitToStreamer( - Out, MCInstBuilder(RISCV::LUI).addReg(DestReg).addImm(Inst.Imm)); - } else if (Inst.Opc == RISCV::ADD_UW) { - emitToStreamer(Out, MCInstBuilder(RISCV::ADD_UW) - .addReg(DestReg) - .addReg(SrcReg) - .addReg(RISCV::X0)); - } else if (Inst.Opc == RISCV::SH1ADD || Inst.Opc == RISCV::SH2ADD || - Inst.Opc == RISCV::SH3ADD) { + Out, MCInstBuilder(Inst.Opc).addReg(DestReg).addReg(SrcReg).addReg( + RISCV::X0)); + break; + case RISCVMatInt::RegReg: emitToStreamer( Out, MCInstBuilder(Inst.Opc).addReg(DestReg).addReg(SrcReg).addReg( SrcReg)); - } else { + break; + case RISCVMatInt::RegImm: emitToStreamer( Out, MCInstBuilder(Inst.Opc).addReg(DestReg).addReg(SrcReg).addImm( Inst.Imm)); + break; } // Only the first instruction has X0 as its source. diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.h --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.h +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.h @@ -17,11 +17,21 @@ class APInt; namespace RISCVMatInt { + +enum OpndKind { + RegImm, // ADDI/ADDIW/SLLI/SRLI/BSETI/BCLRI + Imm, // LUI + RegReg, // SH1ADD/SH2ADD/SH3ADD + RegX0, // ADD_UW +}; + struct Inst { unsigned Opc; int64_t Imm; Inst(unsigned Opc, int64_t Imm) : Opc(Opc), Imm(Imm) {} + + OpndKind getOpndKind() const; }; using InstSeq = SmallVector; diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp @@ -394,5 +394,30 @@ } return std::max(1, Cost); } + +OpndKind Inst::getOpndKind() const { + switch (Opc) { + default: + llvm_unreachable("Unexpected opcode!"); + case RISCV::LUI: + return RISCVMatInt::Imm; + case RISCV::ADD_UW: + return RISCVMatInt::RegX0; + case RISCV::SH1ADD: + case RISCV::SH2ADD: + case RISCV::SH3ADD: + return RISCVMatInt::RegReg; + case RISCV::ADDI: + case RISCV::ADDIW: + case RISCV::SLLI: + case RISCV::SRLI: + case RISCV::SLLI_UW: + case RISCV::RORI: + case RISCV::BSETI: + case RISCV::BCLRI: + return RISCVMatInt::RegImm; + } +} + } // namespace RISCVMatInt } // namespace llvm diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp @@ -188,16 +188,21 @@ SDValue SrcReg = CurDAG->getRegister(RISCV::X0, XLenVT); for (RISCVMatInt::Inst &Inst : Seq) { SDValue SDImm = CurDAG->getTargetConstant(Inst.Imm, DL, XLenVT); - if (Inst.Opc == RISCV::LUI) - Result = CurDAG->getMachineNode(RISCV::LUI, DL, XLenVT, SDImm); - else if (Inst.Opc == RISCV::ADD_UW) - Result = CurDAG->getMachineNode(RISCV::ADD_UW, DL, XLenVT, SrcReg, + switch (Inst.getOpndKind()) { + case RISCVMatInt::Imm: + Result = CurDAG->getMachineNode(Inst.Opc, DL, XLenVT, SDImm); + break; + case RISCVMatInt::RegX0: + Result = CurDAG->getMachineNode(Inst.Opc, DL, XLenVT, SrcReg, CurDAG->getRegister(RISCV::X0, XLenVT)); - else if (Inst.Opc == RISCV::SH1ADD || Inst.Opc == RISCV::SH2ADD || - Inst.Opc == RISCV::SH3ADD) + break; + case RISCVMatInt::RegReg: Result = CurDAG->getMachineNode(Inst.Opc, DL, XLenVT, SrcReg, SrcReg); - else + break; + case RISCVMatInt::RegImm: Result = CurDAG->getMachineNode(Inst.Opc, DL, XLenVT, SrcReg, SDImm); + break; + } // Only the first instruction has X0 as its source. SrcReg = SDValue(Result, 0); diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -651,27 +651,32 @@ assert(!Seq.empty()); for (RISCVMatInt::Inst &Inst : Seq) { - if (Inst.Opc == RISCV::LUI) { - BuildMI(MBB, MBBI, DL, get(RISCV::LUI), DstReg) + switch (Inst.getOpndKind()) { + case RISCVMatInt::Imm: + BuildMI(MBB, MBBI, DL, get(Inst.Opc), DstReg) .addImm(Inst.Imm) .setMIFlag(Flag); - } else if (Inst.Opc == RISCV::ADD_UW) { - BuildMI(MBB, MBBI, DL, get(RISCV::ADD_UW), DstReg) + break; + case RISCVMatInt::RegX0: + BuildMI(MBB, MBBI, DL, get(Inst.Opc), DstReg) .addReg(SrcReg, RegState::Kill) .addReg(RISCV::X0) .setMIFlag(Flag); - } else if (Inst.Opc == RISCV::SH1ADD || Inst.Opc == RISCV::SH2ADD || - Inst.Opc == RISCV::SH3ADD) { + break; + case RISCVMatInt::RegReg: BuildMI(MBB, MBBI, DL, get(Inst.Opc), DstReg) .addReg(SrcReg, RegState::Kill) .addReg(SrcReg, RegState::Kill) .setMIFlag(Flag); - } else { + break; + case RISCVMatInt::RegImm: BuildMI(MBB, MBBI, DL, get(Inst.Opc), DstReg) .addReg(SrcReg, RegState::Kill) .addImm(Inst.Imm) .setMIFlag(Flag); + break; } + // Only the first instruction has X0 as its source. SrcReg = DstReg; }