Skip to content
Merged
61 changes: 61 additions & 0 deletions llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1023,6 +1023,37 @@ static void parseCondBranch(MachineInstr &LastInst, MachineBasicBlock *&Target,
Cond.push_back(LastInst.getOperand(1));
}

static unsigned getReverseOpcode(unsigned Opcode) {
switch (Opcode) {
default:
llvm_unreachable("Unexpected Opcode");
case RISCV::QC_MVEQ:
return RISCV::QC_MVNE;
case RISCV::QC_MVNE:
return RISCV::QC_MVEQ;
case RISCV::QC_MVLT:
return RISCV::QC_MVGE;
case RISCV::QC_MVGE:
return RISCV::QC_MVLT;
case RISCV::QC_MVLTU:
return RISCV::QC_MVGEU;
case RISCV::QC_MVGEU:
return RISCV::QC_MVLTU;
case RISCV::QC_MVEQI:
return RISCV::QC_MVNEI;
case RISCV::QC_MVNEI:
return RISCV::QC_MVEQI;
case RISCV::QC_MVLTI:
return RISCV::QC_MVGEI;
case RISCV::QC_MVGEI:
return RISCV::QC_MVLTI;
case RISCV::QC_MVLTUI:
return RISCV::QC_MVGEUI;
case RISCV::QC_MVGEUI:
return RISCV::QC_MVLTUI;
}
}

unsigned RISCVCC::getBrCond(RISCVCC::CondCode CC, unsigned SelectOpc) {
switch (SelectOpc) {
default:
Expand Down Expand Up @@ -3762,6 +3793,19 @@ bool RISCVInstrInfo::findCommutedOpIndices(const MachineInstr &MI,
return false;
// Operands 1 and 2 are commutable, if we switch the opcode.
return fixCommutedOpIndices(SrcOpIdx1, SrcOpIdx2, 1, 2);
case RISCV::QC_MVEQ:
case RISCV::QC_MVNE:
case RISCV::QC_MVLT:
case RISCV::QC_MVGE:
case RISCV::QC_MVLTU:
case RISCV::QC_MVGEU:
case RISCV::QC_MVEQI:
case RISCV::QC_MVNEI:
case RISCV::QC_MVLTI:
case RISCV::QC_MVGEI:
case RISCV::QC_MVLTUI:
case RISCV::QC_MVGEUI:
return fixCommutedOpIndices(SrcOpIdx1, SrcOpIdx2, 1, 4);
case RISCV::TH_MULA:
case RISCV::TH_MULAW:
case RISCV::TH_MULAH:
Expand Down Expand Up @@ -3974,6 +4018,23 @@ MachineInstr *RISCVInstrInfo::commuteInstructionImpl(MachineInstr &MI,
return TargetInstrInfo::commuteInstructionImpl(WorkingMI, false, OpIdx1,
OpIdx2);
}
case RISCV::QC_MVEQ:
case RISCV::QC_MVNE:
case RISCV::QC_MVLT:
case RISCV::QC_MVGE:
case RISCV::QC_MVLTU:
case RISCV::QC_MVGEU:
case RISCV::QC_MVEQI:
case RISCV::QC_MVNEI:
case RISCV::QC_MVLTI:
case RISCV::QC_MVGEI:
case RISCV::QC_MVLTUI:
case RISCV::QC_MVGEUI: {
auto &WorkingMI = cloneIfNew(MI);
WorkingMI.setDesc(get(getReverseOpcode(MI.getOpcode())));
return TargetInstrInfo::commuteInstructionImpl(WorkingMI, false, OpIdx1,
OpIdx2);
}
case RISCV::PseudoCCMOVGPRNoX0:
case RISCV::PseudoCCMOVGPR: {
// CCMOV can be commuted by inverting the condition.
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td
Original file line number Diff line number Diff line change
Expand Up @@ -604,15 +604,15 @@ class QCILICC<bits<3> funct3, bits<2> funct2, DAGOperand InTyRs2, string opcodes
let Inst{31-25} = {simm, funct2};
}

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
let hasSideEffects = 0, mayLoad = 0, mayStore = 0, isCommutable = 1 in
class QCIMVCC<bits<3> funct3, string opcodestr>
: RVInstR4<0b00, funct3, OPC_CUSTOM_2, (outs GPRNoX0:$rd_wb),
(ins GPRNoX0:$rd, GPRNoX0:$rs1, GPRNoX0:$rs2, GPRNoX0:$rs3),
opcodestr, "$rd, $rs1, $rs2, $rs3"> {
let Constraints = "$rd = $rd_wb";
}

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
let hasSideEffects = 0, mayLoad = 0, mayStore = 0, isCommutable = 1 in
class QCIMVCCI<bits<3> funct3, string opcodestr, DAGOperand immType>
: RVInstR4<0b10, funct3, OPC_CUSTOM_2, (outs GPRNoX0:$rd_wb),
(ins GPRNoX0:$rd, GPRNoX0:$rs1, immType:$imm, GPRNoX0:$rs3),
Expand Down
Loading
Loading