void RISCVAsmBackend::relaxInstruction(MCInst &Inst,
const MCSubtargetInfo &STI) const {
- // TODO: replace this with call to auto generated uncompressinstr() function.
MCInst Res;
switch (Inst.getOpcode()) {
default:
llvm_unreachable("Opcode not expected!");
case RISCV::C_BEQZ:
- // c.beqz $rs1, $imm -> beq $rs1, X0, $imm.
- Res.setOpcode(RISCV::BEQ);
- Res.addOperand(Inst.getOperand(0));
- Res.addOperand(MCOperand::createReg(RISCV::X0));
- Res.addOperand(Inst.getOperand(1));
- break;
case RISCV::C_BNEZ:
- // c.bnez $rs1, $imm -> bne $rs1, X0, $imm.
- Res.setOpcode(RISCV::BNE);
- Res.addOperand(Inst.getOperand(0));
- Res.addOperand(MCOperand::createReg(RISCV::X0));
- Res.addOperand(Inst.getOperand(1));
- break;
case RISCV::C_J:
- // c.j $imm -> jal X0, $imm.
- Res.setOpcode(RISCV::JAL);
- Res.addOperand(MCOperand::createReg(RISCV::X0));
- Res.addOperand(Inst.getOperand(0));
- break;
case RISCV::C_JAL:
- // c.jal $imm -> jal X1, $imm.
- Res.setOpcode(RISCV::JAL);
- Res.addOperand(MCOperand::createReg(RISCV::X1));
- Res.addOperand(Inst.getOperand(0));
+ bool Success = RISCVRVC::uncompress(Res, Inst, STI);
+ assert(Success && "Can't uncompress instruction");
+ (void)Success;
break;
}
Inst = std::move(Res);