Files
ircolib/arch/RISCV/RISCVGenCompressedInstructionsInfo.inc
T
iris 802798ce3c Squashed 'external/capstone/' content from commit e46f64fa
git-subtree-dir: external/capstone
git-subtree-split: e46f64fadb351e9ecd05264fab26f2772feb0994
2026-05-11 11:55:07 +02:00

3670 lines
175 KiB
C

/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|* *|
|* Compress instruction Source Fragment *|
|* *|
|* Automatically generated file, do not edit! *|
|* From: RISCV.td *|
|* *|
\*===----------------------------------------------------------------------===*/
#ifdef GEN_COMPRESS_INSTR
#undef GEN_COMPRESS_INSTR
static bool RISCVValidateMCOperandForCompress(MCInst *MI,MCOperand *MCOp,
unsigned PredicateIndex) {
switch (PredicateIndex) {
default:
CS_ASSERT_RET_VAL(0,false);
return false;
break;
case 1: {
// uimm10_lsb00nonzero
int64_t Imm;
if (!(Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return false;
return isShiftedUIntN(8, 2, Imm) && (Imm != 0);
}
case 2: {
// simm6nonzero
int64_t Imm;
if ((Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return (Imm != 0) && isIntN(6, Imm);
return MCOperand_isExpr(MCOp);
}
case 3: {
// simm6
int64_t Imm;
if ((Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return isIntN(6, Imm);
return MCOperand_isExpr(MCOp);
}
case 4: {
// simm10_lsb0000nonzero
int64_t Imm;
if (!(Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return false;
return isShiftedIntN(6, 4, Imm) && (Imm != 0);
}
case 5: {
// simm9_lsb0
int64_t Imm;
if ((Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return isShiftedIntN(8, 1, Imm);
return MCOperand_isExpr(MCOp);
}
case 6: {
// uimm8_lsb000
int64_t Imm;
if (!(Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return false;
return isShiftedUIntN(5, 3, Imm);
}
case 7: {
// uimm9_lsb000
int64_t Imm;
if (!(Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return false;
return isShiftedUIntN(6, 3, Imm);
}
case 8: {
// uimm7_lsb00
int64_t Imm;
if (!(Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return false;
return isShiftedUIntN(5, 2, Imm);
}
case 9: {
// uimm8_lsb00
int64_t Imm;
if (!(Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return false;
return isShiftedUIntN(6, 2, Imm);
}
case 10: {
// simm12_lsb0
int64_t Imm;
if ((Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return isShiftedIntN(11, 1, Imm);
return MCOperand_isExpr(MCOp);
}
case 11: {
// uimm2
int64_t Imm;
if (!(Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return false;
return isUIntN(2, Imm);
}
case 12: {
// uimm2_lsb0
int64_t Imm;
if (!(Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return false;
return isShiftedUIntN(1, 1, Imm);
}
case 13: {
// c_lui_imm
int64_t Imm;
if ((Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return (Imm != 0) && (isUIntN(5, Imm) ||
(Imm >= 0xfffe0 && Imm <= 0xfffff));
return MCOperand_isExpr(MCOp);
}
case 14: {
// uimmlog2xlennonzero
int64_t Imm;
if (!(Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return false;
if (RISCV_getFeatureBits(MI->csh->mode,RISCV_Feature64Bit))
return isUIntN(6, Imm) && (Imm != 0);
return isUIntN(5, Imm) && (Imm != 0);
}
}
}
static bool compressInst(MCInst *OutInst,
MCInst *MI) {
switch (MCInst_getOpcode(MI)) {
default: return false;
case RISCV_ADD: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.mv $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_C_MV);
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.mv $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_C_MV);
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.add $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_C_ADD);
// Operand: rs1_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.add $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_C_ADD);
// Operand: rs1_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case ADD
case RISCV_ADDI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 1)) {
// c.addi4spn $rd, $rs1, $imm
MCInst_setOpcode(OutInst, RISCV_C_ADDI4SPN);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) &&
(MCOperand_isImm(MCInst_getOperand(MI, 2))) &&
(MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0)) {
// c.nop
MCInst_setOpcode(OutInst, RISCV_C_NOP);
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 2)) {
// c.addi $rd, $imm
MCInst_setOpcode(OutInst, RISCV_C_ADDI);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 3)) {
// c.li $rd, $imm
MCInst_setOpcode(OutInst, RISCV_C_LI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X2) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X2) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 4)) {
// c.addi16sp $rd, $imm
MCInst_setOpcode(OutInst, RISCV_C_ADDI16SP);
// Operand: rd_wb
MCOperand_CreateReg0(OutInst, RISCV_X2);
// Operand: rd
MCOperand_CreateReg0(OutInst, RISCV_X2);
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isImm(MCInst_getOperand(MI, 2))) &&
(MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.mv $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_C_MV);
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case ADDI
case RISCV_ADDIW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 3)) {
// c.addiw $rd, $imm
MCInst_setOpcode(OutInst, RISCV_C_ADDIW);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 3)) {
// c.li $rd, $imm
MCInst_setOpcode(OutInst, RISCV_C_LI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case ADDIW
case RISCV_ADDW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.addw $rd, $rs2
MCInst_setOpcode(OutInst, RISCV_C_ADDW);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.addw $rd, $rs2
MCInst_setOpcode(OutInst, RISCV_C_ADDW);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case ADDW
case RISCV_ADD_UW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZba) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.zext.w $rd
MCInst_setOpcode(OutInst, RISCV_C_ZEXT_W);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case ADD_UW
case RISCV_AND: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.and $rd, $rs2
MCInst_setOpcode(OutInst, RISCV_C_AND);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.and $rd, $rs2
MCInst_setOpcode(OutInst, RISCV_C_AND);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case AND
case RISCV_ANDI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 3)) {
// c.andi $rs1, $imm
MCInst_setOpcode(OutInst, RISCV_C_ANDI);
// Operand: rs1_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isImm(MCInst_getOperand(MI, 2))) &&
(MCOperand_getImm(MCInst_getOperand(MI, 2)) == 255) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.zext.b $rd
MCInst_setOpcode(OutInst, RISCV_C_ZEXT_B);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case ANDI
case RISCV_BEQ: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 5)) {
// c.beqz $rs1, $imm
MCInst_setOpcode(OutInst, RISCV_C_BEQZ);
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 5)) {
// c.beqz $rs1, $imm
MCInst_setOpcode(OutInst, RISCV_C_BEQZ);
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case BEQ
case RISCV_BNE: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 5)) {
// c.bnez $rs1, $imm
MCInst_setOpcode(OutInst, RISCV_C_BNEZ);
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 5)) {
// c.bnez $rs1, $imm
MCInst_setOpcode(OutInst, RISCV_C_BNEZ);
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case BNE
case RISCV_EBREAK: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca))) {
// c.ebreak
MCInst_setOpcode(OutInst, RISCV_C_EBREAK);
return true;
} // if
break;
} // case EBREAK
case RISCV_FLD: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtD) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcd)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR64CRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 6)) {
// c.fld $rd, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_FLD);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtD) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcd)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR64RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 7)) {
// c.fldsp $rd, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_FLDSP);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case FLD
case RISCV_FLW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtF) &&
!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZce) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcf)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR32CRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 8)) {
// c.flw $rd, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_FLW);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtF) &&
!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZce) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcf)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR32RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 9)) {
// c.flwsp $rd, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_FLWSP);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case FLW
case RISCV_FSD: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtD) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcd)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR64CRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 6)) {
// c.fsd $rs2, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_FSD);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtD) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcd)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR64RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 7)) {
// c.fsdsp $rs2, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_FSDSP);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case FSD
case RISCV_FSW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtF) &&
!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZce) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcf)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR32CRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 8)) {
// c.fsw $rs2, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_FSW);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtF) &&
!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZce) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcf)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR32RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 9)) {
// c.fswsp $rs2, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_FSWSP);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case FSW
case RISCV_JAL: {
if (!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X1) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 1), 10)) {
// c.jal $offset
MCInst_setOpcode(OutInst, RISCV_C_JAL);
// Operand: offset
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 1), 10)) {
// c.j $offset
MCInst_setOpcode(OutInst, RISCV_C_J);
// Operand: offset
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case JAL
case RISCV_JALR: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0) &&
(MCOperand_isImm(MCInst_getOperand(MI, 2))) &&
(MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.jr $rs1
MCInst_setOpcode(OutInst, RISCV_C_JR);
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X1) &&
(MCOperand_isImm(MCInst_getOperand(MI, 2))) &&
(MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.jalr $rs1
MCInst_setOpcode(OutInst, RISCV_C_JALR);
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case JALR
case RISCV_LBU: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 11)) {
// c.lbu $rd, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_LBU);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case LBU
case RISCV_LD: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 6)) {
// c.ld $rd, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_LD);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 7)) {
// c.ldsp $rd, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_LDSP);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case LD
case RISCV_LH: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 12)) {
// c.lh $rd, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_LH);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case LH
case RISCV_LHU: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 12)) {
// c.lhu $rd, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_LHU);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case LHU
case RISCV_LUI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0X2RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 1), 13)) {
// c.lui $rd, $imm
MCInst_setOpcode(OutInst, RISCV_C_LUI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case LUI
case RISCV_LW: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 8)) {
// c.lw $rd, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_LW);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 9)) {
// c.lwsp $rd, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_LWSP);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case LW
case RISCV_MUL: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtM) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZmmul)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.mul $rd, $rs2
MCInst_setOpcode(OutInst, RISCV_C_MUL);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtM) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZmmul)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.mul $rd, $rs2
MCInst_setOpcode(OutInst, RISCV_C_MUL);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case MUL
case RISCV_OR: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.or $rd, $rs2
MCInst_setOpcode(OutInst, RISCV_C_OR);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.or $rd, $rs2
MCInst_setOpcode(OutInst, RISCV_C_OR);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case OR
case RISCV_SB: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 11)) {
// c.sb $rs2, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_SB);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case SB
case RISCV_SD: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 6)) {
// c.sd $rs2, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_SD);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 7)) {
// c.sdsp $rs2, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_SDSP);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case SD
case RISCV_SEXT_B: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZbb) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.sext.b $rd
MCInst_setOpcode(OutInst, RISCV_C_SEXT_B);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case SEXT_B
case RISCV_SEXT_H: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZbb) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.sext.h $rd
MCInst_setOpcode(OutInst, RISCV_C_SEXT_H);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case SEXT_H
case RISCV_SH: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 12)) {
// c.sh $rs2, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_SH);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case SH
case RISCV_SLLI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 14)) {
// c.slli $rd, $imm
MCInst_setOpcode(OutInst, RISCV_C_SLLI);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case SLLI
case RISCV_SRAI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 14)) {
// c.srai $rs1, $imm
MCInst_setOpcode(OutInst, RISCV_C_SRAI);
// Operand: rs1_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case SRAI
case RISCV_SRLI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 14)) {
// c.srli $rs1, $imm
MCInst_setOpcode(OutInst, RISCV_C_SRLI);
// Operand: rs1_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case SRLI
case RISCV_SSPOPCHK: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcmop) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZicfiss) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X5)) {
// c.sspopchk $rs1
MCInst_setOpcode(OutInst, RISCV_C_SSPOPCHK);
// Operand: rs1
MCOperand_CreateReg0(OutInst, RISCV_X5);
return true;
} // if
break;
} // case SSPOPCHK
case RISCV_SSPUSH: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcmop) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZicfiss) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X1)) {
// c.sspush $rs1
MCInst_setOpcode(OutInst, RISCV_C_SSPUSH);
// Operand: rs1
MCOperand_CreateReg0(OutInst, RISCV_X1);
return true;
} // if
break;
} // case SSPUSH
case RISCV_SUB: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.sub $rd, $rs2
MCInst_setOpcode(OutInst, RISCV_C_SUB);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case SUB
case RISCV_SUBW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.subw $rd, $rs2
MCInst_setOpcode(OutInst, RISCV_C_SUBW);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case SUBW
case RISCV_SW: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 8)) {
// c.sw $rs2, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_SW);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForCompress(MI,MCInst_getOperand(MI, 2), 9)) {
// c.swsp $rs2, ${imm}(${rs1})
MCInst_setOpcode(OutInst, RISCV_C_SWSP);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case SW
case RISCV_UNIMP: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca))) {
// c.unimp
MCInst_setOpcode(OutInst, RISCV_C_UNIMP);
return true;
} // if
break;
} // case UNIMP
case RISCV_XOR: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.xor $rd, $rs2
MCInst_setOpcode(OutInst, RISCV_C_XOR);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.xor $rd, $rs2
MCInst_setOpcode(OutInst, RISCV_C_XOR);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case XOR
case RISCV_XORI: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isImm(MCInst_getOperand(MI, 2))) &&
(MCOperand_getImm(MCInst_getOperand(MI, 2)) == -1) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.not $rd
MCInst_setOpcode(OutInst, RISCV_C_NOT);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case XORI
case RISCV_ZEXT_H_RV32: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZbb) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.zext.h $rd
MCInst_setOpcode(OutInst, RISCV_C_ZEXT_H);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case ZEXT_H_RV32
case RISCV_ZEXT_H_RV64: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZbb) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.zext.h $rd
MCInst_setOpcode(OutInst, RISCV_C_ZEXT_H);
// Operand: rd_wb
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
} // case ZEXT_H_RV64
} // switch
return false;
}
#endif //GEN_COMPRESS_INSTR
#ifdef GEN_UNCOMPRESS_INSTR
#undef GEN_UNCOMPRESS_INSTR
static bool RISCVValidateMCOperandForUncompress(MCInst *MI,MCOperand *MCOp,
unsigned PredicateIndex) {
switch (PredicateIndex) {
default:
CS_ASSERT_RET_VAL(0,false);
return false;
break;
case 1: {
// simm12
int64_t Imm;
if ((Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return isIntN(12, Imm);
return MCOperand_isExpr(MCOp);
}
case 2: {
// simm13_lsb0
int64_t Imm;
if ((Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return isShiftedIntN(12, 1, Imm);
return MCOperand_isExpr(MCOp);
}
case 3: {
// simm21_lsb0_jal
int64_t Imm;
if ((Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return isShiftedIntN(20, 1, Imm);
return MCOperand_isExpr(MCOp);
}
case 4: {
// uimm20_lui
int64_t Imm;
if ((Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return isUIntN(20, Imm);
return MCOperand_isExpr(MCOp);
}
case 5: {
// uimmlog2xlen
int64_t Imm;
if (!(Imm = MCOperand_getImm(MCOp), MCOperand_isImm(MCOp)))
return false;
if (RISCV_getFeatureBits(MI->csh->mode,RISCV_Feature64Bit))
return isUIntN(6, Imm);
return isUIntN(5, Imm);
}
}
}
static bool uncompressInst(MCInst *OutInst,
MCInst *MI) {
switch (MCInst_getOpcode(MI)) {
default: return false;
case RISCV_C_ADD: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// add $rd, $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_ADD);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_ADD
case RISCV_C_ADDI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// addi $rd, $rs1, $imm12
MCInst_setOpcode(OutInst, RISCV_ADDI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_ADDI
case RISCV_C_ADDI16SP: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X2) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X2) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// addi $rd, $rs1, $imm12
MCInst_setOpcode(OutInst, RISCV_ADDI);
// Operand: rd
MCOperand_CreateReg0(OutInst, RISCV_X2);
// Operand: rs1
MCOperand_CreateReg0(OutInst, RISCV_X2);
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_ADDI16SP
case RISCV_C_ADDI4SPN: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// addi $rd, $rs1, $imm12
MCInst_setOpcode(OutInst, RISCV_ADDI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_ADDI4SPN
case RISCV_C_ADDIW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// addiw $rd, $rs1, $imm12
MCInst_setOpcode(OutInst, RISCV_ADDIW);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_ADDIW
case RISCV_C_ADDW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// addw $rd, $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_ADDW);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_ADDW
case RISCV_C_AND: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// and $rd, $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_AND);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_AND
case RISCV_C_ANDI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// andi $rd, $rs1, $imm12
MCInst_setOpcode(OutInst, RISCV_ANDI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_ANDI
case RISCV_C_BEQZ: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 1), 2)) {
// beq $rs1, $rs2, $imm12
MCInst_setOpcode(OutInst, RISCV_BEQ);
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCOperand_CreateReg0(OutInst, RISCV_X0);
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case C_BEQZ
case RISCV_C_BNEZ: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 1), 2)) {
// bne $rs1, $rs2, $imm12
MCInst_setOpcode(OutInst, RISCV_BNE);
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCOperand_CreateReg0(OutInst, RISCV_X0);
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case C_BNEZ
case RISCV_C_EBREAK: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca))) {
// ebreak
MCInst_setOpcode(OutInst, RISCV_EBREAK);
return true;
} // if
break;
} // case C_EBREAK
case RISCV_C_FLD: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtD) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcd)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR64RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// fld $rd, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_FLD);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_FLD
case RISCV_C_FLDSP: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtD) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcd)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR64RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// fld $rd, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_FLD);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_FLDSP
case RISCV_C_FLW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtF) &&
!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZce) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcf)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR32RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// flw $rd, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_FLW);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_FLW
case RISCV_C_FLWSP: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtF) &&
!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZce) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcf)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR32RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// flw $rd, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_FLW);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_FLWSP
case RISCV_C_FSD: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtD) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcd)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR64RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// fsd $rs2, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_FSD);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_FSD
case RISCV_C_FSDSP: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtD) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcd)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR64RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// fsd $rs2, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_FSD);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_FSDSP
case RISCV_C_FSW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtF) &&
!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZce) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcf)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR32RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// fsw $rs2, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_FSW);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_FSW
case RISCV_C_FSWSP: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtF) &&
!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZce) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcf)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR32RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// fsw $rs2, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_FSW);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_FSWSP
case RISCV_C_J: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 0), 3)) {
// jal $rd, $imm20
MCInst_setOpcode(OutInst, RISCV_JAL);
// Operand: rd
MCOperand_CreateReg0(OutInst, RISCV_X0);
// Operand: imm20
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
return true;
} // if
break;
} // case C_J
case RISCV_C_JAL: {
if (!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 0), 3)) {
// jal $rd, $imm20
MCInst_setOpcode(OutInst, RISCV_JAL);
// Operand: rd
MCOperand_CreateReg0(OutInst, RISCV_X1);
// Operand: imm20
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
return true;
} // if
break;
} // case C_JAL
case RISCV_C_JALR: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCOperand_CreateImm1(MI, 0), 1)) {
// jalr $rd, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_JALR);
// Operand: rd
MCOperand_CreateReg0(OutInst, RISCV_X1);
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: imm12
MCOperand_CreateImm0(OutInst, 0);
return true;
} // if
break;
} // case C_JALR
case RISCV_C_JR: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCOperand_CreateImm1(MI, 0), 1)) {
// jalr $rd, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_JALR);
// Operand: rd
MCOperand_CreateReg0(OutInst, RISCV_X0);
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: imm12
MCOperand_CreateImm0(OutInst, 0);
return true;
} // if
break;
} // case C_JR
case RISCV_C_LBU: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// lbu $rd, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_LBU);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_LBU
case RISCV_C_LD: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// ld $rd, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_LD);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_LD
case RISCV_C_LDSP: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// ld $rd, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_LD);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_LDSP
case RISCV_C_LH: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// lh $rd, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_LH);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_LH
case RISCV_C_LHU: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// lhu $rd, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_LHU);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_LHU
case RISCV_C_LI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 1), 1)) {
// addi $rd, $rs1, $imm12
MCInst_setOpcode(OutInst, RISCV_ADDI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCOperand_CreateReg0(OutInst, RISCV_X0);
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case C_LI
case RISCV_C_LUI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 1), 4)) {
// lui $rd, $imm20
MCInst_setOpcode(OutInst, RISCV_LUI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: imm20
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
return true;
} // if
break;
} // case C_LUI
case RISCV_C_LW: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// lw $rd, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_LW);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_LW
case RISCV_C_LWSP: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// lw $rd, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_LW);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_LWSP
case RISCV_C_MUL: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtM) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZmmul)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// mul $rd, $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_MUL);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_MUL
case RISCV_C_MV: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCOperand_CreateImm1(MI, 0), 1)) {
// addi $rd, $rs1, $imm12
MCInst_setOpcode(OutInst, RISCV_ADDI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCOperand_CreateImm0(OutInst, 0);
return true;
} // if
break;
} // case C_MV
case RISCV_C_NOP: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
RISCVValidateMCOperandForUncompress(MI,MCOperand_CreateImm1(MI, 0), 1)) {
// addi $rd, $rs1, $imm12
MCInst_setOpcode(OutInst, RISCV_ADDI);
// Operand: rd
MCOperand_CreateReg0(OutInst, RISCV_X0);
// Operand: rs1
MCOperand_CreateReg0(OutInst, RISCV_X0);
// Operand: imm12
MCOperand_CreateImm0(OutInst, 0);
return true;
} // if
break;
} // case C_NOP
case RISCV_C_NOT: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCOperand_CreateImm1(MI, -1), 1)) {
// xori $rd, $rs1, $imm12
MCInst_setOpcode(OutInst, RISCV_XORI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: imm12
MCOperand_CreateImm0(OutInst, -1);
return true;
} // if
break;
} // case C_NOT
case RISCV_C_OR: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// or $rd, $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_OR);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_OR
case RISCV_C_SB: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// sb $rs2, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_SB);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_SB
case RISCV_C_SD: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// sd $rs2, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_SD);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_SD
case RISCV_C_SDSP: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// sd $rs2, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_SD);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_SDSP
case RISCV_C_SEXT_B: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZbb) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0))))) {
// sext.b $rd, $rs1
MCInst_setOpcode(OutInst, RISCV_SEXT_B);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
return true;
} // if
break;
} // case C_SEXT_B
case RISCV_C_SEXT_H: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZbb) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0))))) {
// sext.h $rd, $rs1
MCInst_setOpcode(OutInst, RISCV_SEXT_H);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
return true;
} // if
break;
} // case C_SEXT_H
case RISCV_C_SH: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// sh $rs2, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_SH);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_SH
case RISCV_C_SLLI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 5)) {
// slli $rd, $rs1, $shamt
MCInst_setOpcode(OutInst, RISCV_SLLI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: shamt
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_SLLI
case RISCV_C_SRAI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 5)) {
// srai $rd, $rs1, $shamt
MCInst_setOpcode(OutInst, RISCV_SRAI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: shamt
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_SRAI
case RISCV_C_SRLI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 5)) {
// srli $rd, $rs1, $shamt
MCInst_setOpcode(OutInst, RISCV_SRLI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: shamt
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_SRLI
case RISCV_C_SSPOPCHK: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcmop) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZicfiss) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X5)) {
// sspopchk $rs1
MCInst_setOpcode(OutInst, RISCV_SSPOPCHK);
// Operand: rs1
MCOperand_CreateReg0(OutInst, RISCV_X5);
return true;
} // if
break;
} // case C_SSPOPCHK
case RISCV_C_SSPUSH: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcmop) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZicfiss) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X1)) {
// sspush $rs2
MCInst_setOpcode(OutInst, RISCV_SSPUSH);
// Operand: rs2
MCOperand_CreateReg0(OutInst, RISCV_X1);
return true;
} // if
break;
} // case C_SSPUSH
case RISCV_C_SUB: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// sub $rd, $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_SUB);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_SUB
case RISCV_C_SUBW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// subw $rd, $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_SUBW);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_SUBW
case RISCV_C_SW: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// sw $rs2, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_SW);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_SW
case RISCV_C_SWSP: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
RISCVValidateMCOperandForUncompress(MI,MCInst_getOperand(MI, 2), 1)) {
// sw $rs2, ${imm12}(${rs1})
MCInst_setOpcode(OutInst, RISCV_SW);
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 1));
// Operand: imm12
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_SWSP
case RISCV_C_UNIMP: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca))) {
// unimp
MCInst_setOpcode(OutInst, RISCV_UNIMP);
return true;
} // if
break;
} // case C_UNIMP
case RISCV_C_XOR: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// xor $rd, $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_XOR);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 2));
return true;
} // if
break;
} // case C_XOR
case RISCV_C_ZEXT_B: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
RISCVValidateMCOperandForUncompress(MI,MCOperand_CreateImm1(MI, 255), 1)) {
// andi $rd, $rs1, $imm12
MCInst_setOpcode(OutInst, RISCV_ANDI);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: imm12
MCOperand_CreateImm0(OutInst, 255);
return true;
} // if
break;
} // case C_ZEXT_B
case RISCV_C_ZEXT_H: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZbb) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0))))) {
// zext.h $rd, $rs1
MCInst_setOpcode(OutInst, RISCV_ZEXT_H_RV32);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZbb) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0))))) {
// zext.h $rd, $rs1
MCInst_setOpcode(OutInst, RISCV_ZEXT_H_RV64);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
return true;
} // if
break;
} // case C_ZEXT_H
case RISCV_C_ZEXT_W: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZba) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0))))) {
// add.uw $rd, $rs1, $rs2
MCInst_setOpcode(OutInst, RISCV_ADD_UW);
// Operand: rd
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs1
MCInst_addOperand2(OutInst, MCInst_getOperand(MI, 0));
// Operand: rs2
MCOperand_CreateReg0(OutInst, RISCV_X0);
return true;
} // if
} // case C_ZEXT_W
} // switch
return false;
}
#endif //GEN_UNCOMPRESS_INSTR
#ifdef GEN_CHECK_COMPRESS_INSTR
#undef GEN_CHECK_COMPRESS_INSTR
static bool RISCVValidateMachineOperand(MCInst *MI,MCOperand *MO,
unsigned PredicateIndex) {
int64_t Imm = MCOperand_getImm(MO);
switch (PredicateIndex) {
default:
CS_ASSERT_RET_VAL(0,false);
return false;
break;
case 1: {
// simm6nonzero
return (Imm != 0) && isIntN(6, Imm);
}
case 2: {
// simm10_lsb0000nonzero
return (Imm != 0) && isShiftedIntN(6, 4, Imm);
}
case 3: {
// uimm10_lsb00nonzero
return isShiftedUIntN(8, 2, Imm) && (Imm != 0);
}
case 4: {
// simm6
return isIntN(6, Imm);
}
case 5: {
// simm9_lsb0
return isShiftedIntN(8, 1, Imm);
}
case 6: {
// uimm8_lsb000
return isShiftedUIntN(5, 3, Imm);
}
case 7: {
// uimm9_lsb000
return isShiftedUIntN(6, 3, Imm);
}
case 8: {
// uimm7_lsb00
return isShiftedUIntN(5, 2, Imm);
}
case 9: {
// uimm8_lsb00
return isShiftedUIntN(6, 2, Imm);
}
case 10: {
// simm12_lsb0
return isShiftedIntN(11, 1, Imm);
}
case 11: {
// uimm2
return isUIntN(2, Imm);
}
case 12: {
// uimm2_lsb0
return isShiftedUIntN(1, 1, Imm);
}
case 13: {
// c_lui_imm
return (Imm != 0) &&
(isUIntN(5, Imm) ||
(Imm >= 0xfffe0 && Imm <= 0xfffff));
}
case 14: {
// uimmlog2xlennonzero
if (RISCV_getFeatureBits(MI->csh->mode,RISCV_Feature64Bit))
return isUIntN(6, Imm) && (Imm != 0);
return isUIntN(5, Imm) && (Imm != 0);
}
}
}
static bool isCompressibleInst(MCInst *MI) {
switch (MCInst_getOpcode(MI)) {
default: return false;
case RISCV_ADD: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.add $rs1, $rs2
// Operand: rs1_wb
// Operand: rs1
// Operand: rs2
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.add $rs1, $rs2
// Operand: rs1_wb
// Operand: rs1
// Operand: rs2
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.mv $rs1, $rs2
// Operand: rs1
// Operand: rs2
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.mv $rs1, $rs2
// Operand: rs1
// Operand: rs2
return true;
} // if
break;
} // case ADD
case RISCV_ADDI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 1)) {
// c.addi $rd, $imm
// Operand: rd_wb
// Operand: rd
// Operand: imm
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X2) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X2) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 2)) {
// c.addi16sp $rd, $imm
// Operand: rd_wb
// Operand: rd
// Operand: imm
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 3)) {
// c.addi4spn $rd, $rs1, $imm
// Operand: rd
// Operand: rs1
// Operand: imm
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 4)) {
// c.li $rd, $imm
// Operand: rd
// Operand: imm
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isImm(MCInst_getOperand(MI, 2))) &&
(MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.mv $rs1, $rs2
// Operand: rs1
// Operand: rs2
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) &&
(MCOperand_isImm(MCInst_getOperand(MI, 2))) &&
(MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0)) {
// c.nop
return true;
} // if
break;
} // case ADDI
case RISCV_ADDIW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 4)) {
// c.addiw $rd, $imm
// Operand: rd_wb
// Operand: rd
// Operand: imm
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 4)) {
// c.li $rd, $imm
// Operand: rd
// Operand: imm
return true;
} // if
break;
} // case ADDIW
case RISCV_ADDW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.addw $rd, $rs2
// Operand: rd_wb
// Operand: rd
// Operand: rs2
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.addw $rd, $rs2
// Operand: rd_wb
// Operand: rd
// Operand: rs2
return true;
} // if
break;
} // case ADDW
case RISCV_ADD_UW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZba) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.zext.w $rd
// Operand: rd_wb
// Operand: rd
return true;
} // if
break;
} // case ADD_UW
case RISCV_AND: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.and $rd, $rs2
// Operand: rd_wb
// Operand: rd
// Operand: rs2
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.and $rd, $rs2
// Operand: rd_wb
// Operand: rd
// Operand: rs2
return true;
} // if
break;
} // case AND
case RISCV_ANDI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 4)) {
// c.andi $rs1, $imm
// Operand: rs1_wb
// Operand: rs1
// Operand: imm
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isImm(MCInst_getOperand(MI, 2))) &&
(MCOperand_getImm(MCInst_getOperand(MI, 2)) == 255) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.zext.b $rd
// Operand: rd_wb
// Operand: rd
return true;
} // if
break;
} // case ANDI
case RISCV_BEQ: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 5)) {
// c.beqz $rs1, $imm
// Operand: rs1
// Operand: imm
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 5)) {
// c.beqz $rs1, $imm
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case BEQ
case RISCV_BNE: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 5)) {
// c.bnez $rs1, $imm
// Operand: rs1
// Operand: imm
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 5)) {
// c.bnez $rs1, $imm
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case BNE
case RISCV_EBREAK: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca))) {
// c.ebreak
return true;
} // if
break;
} // case EBREAK
case RISCV_FLD: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtD) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcd)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR64CRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 6)) {
// c.fld $rd, ${imm}(${rs1})
// Operand: rd
// Operand: rs1
// Operand: imm
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtD) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcd)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR64RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 7)) {
// c.fldsp $rd, ${imm}(${rs1})
// Operand: rd
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case FLD
case RISCV_FLW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtF) &&
!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZce) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcf)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR32CRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 8)) {
// c.flw $rd, ${imm}(${rs1})
// Operand: rd
// Operand: rs1
// Operand: imm
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtF) &&
!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZce) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcf)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR32RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 9)) {
// c.flwsp $rd, ${imm}(${rs1})
// Operand: rd
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case FLW
case RISCV_FSD: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtD) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcd)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR64CRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 6)) {
// c.fsd $rs2, ${imm}(${rs1})
// Operand: rs2
// Operand: rs1
// Operand: imm
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtD) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcd)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR64RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 7)) {
// c.fsdsp $rs2, ${imm}(${rs1})
// Operand: rs2
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case FSD
case RISCV_FSW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtF) &&
!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZce) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcf)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR32CRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 8)) {
// c.fsw $rs2, ${imm}(${rs1})
// Operand: rs2
// Operand: rs1
// Operand: imm
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtF) &&
!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZce) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcf)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_FPR32RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 9)) {
// c.fswsp $rs2, ${imm}(${rs1})
// Operand: rs2
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case FSW
case RISCV_JAL: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0) &&
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 1), 10)) {
// c.j $offset
// Operand: offset
return true;
} // if
if (!RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X1) &&
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 1), 10)) {
// c.jal $offset
// Operand: offset
return true;
} // if
break;
} // case JAL
case RISCV_JALR: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X1) &&
(MCOperand_isImm(MCInst_getOperand(MI, 2))) &&
(MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.jalr $rs1
// Operand: rs1
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X0) &&
(MCOperand_isImm(MCInst_getOperand(MI, 2))) &&
(MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.jr $rs1
// Operand: rs1
return true;
} // if
break;
} // case JALR
case RISCV_LBU: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 11)) {
// c.lbu $rd, ${imm}(${rs1})
// Operand: rd
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case LBU
case RISCV_LD: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 6)) {
// c.ld $rd, ${imm}(${rs1})
// Operand: rd
// Operand: rs1
// Operand: imm
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 7)) {
// c.ldsp $rd, ${imm}(${rs1})
// Operand: rd
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case LD
case RISCV_LH: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 12)) {
// c.lh $rd, ${imm}(${rs1})
// Operand: rd
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case LH
case RISCV_LHU: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 12)) {
// c.lhu $rd, ${imm}(${rs1})
// Operand: rd
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case LHU
case RISCV_LUI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0X2RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 1), 13)) {
// c.lui $rd, $imm
// Operand: rd
// Operand: imm
return true;
} // if
break;
} // case LUI
case RISCV_LW: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 8)) {
// c.lw $rd, ${imm}(${rs1})
// Operand: rd
// Operand: rs1
// Operand: imm
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 9)) {
// c.lwsp $rd, ${imm}(${rs1})
// Operand: rd
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case LW
case RISCV_MUL: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtM) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZmmul)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.mul $rd, $rs2
// Operand: rd_wb
// Operand: rd
// Operand: rs2
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtM) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZmmul)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.mul $rd, $rs2
// Operand: rd_wb
// Operand: rd
// Operand: rs2
return true;
} // if
break;
} // case MUL
case RISCV_OR: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.or $rd, $rs2
// Operand: rd_wb
// Operand: rd
// Operand: rs2
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.or $rd, $rs2
// Operand: rd_wb
// Operand: rd
// Operand: rs2
return true;
} // if
break;
} // case OR
case RISCV_SB: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 11)) {
// c.sb $rs2, ${imm}(${rs1})
// Operand: rs2
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case SB
case RISCV_SD: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 6)) {
// c.sd $rs2, ${imm}(${rs1})
// Operand: rs2
// Operand: rs1
// Operand: imm
return true;
} // if
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 7)) {
// c.sdsp $rs2, ${imm}(${rs1})
// Operand: rs2
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case SD
case RISCV_SEXT_B: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZbb) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.sext.b $rd
// Operand: rd_wb
// Operand: rd
return true;
} // if
break;
} // case SEXT_B
case RISCV_SEXT_H: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZbb) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.sext.h $rd
// Operand: rd_wb
// Operand: rd
return true;
} // if
break;
} // case SEXT_H
case RISCV_SH: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 12)) {
// c.sh $rs2, ${imm}(${rs1})
// Operand: rs2
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case SH
case RISCV_SLLI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRNoX0RegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 14)) {
// c.slli $rd, $imm
// Operand: rd_wb
// Operand: rd
// Operand: imm
return true;
} // if
break;
} // case SLLI
case RISCV_SRAI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 14)) {
// c.srai $rs1, $imm
// Operand: rs1_wb
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case SRAI
case RISCV_SRLI: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 14)) {
// c.srli $rs1, $imm
// Operand: rs1_wb
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case SRLI
case RISCV_SSPOPCHK: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcmop) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZicfiss) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X5)) {
// c.sspopchk $rs1
// Operand: rs1
return true;
} // if
break;
} // case SSPOPCHK
case RISCV_SSPUSH: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcmop) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZicfiss) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 0)) == RISCV_X1)) {
// c.sspush $rs1
// Operand: rs1
return true;
} // if
break;
} // case SSPUSH
case RISCV_SUB: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.sub $rd, $rs2
// Operand: rd_wb
// Operand: rd
// Operand: rs2
return true;
} // if
break;
} // case SUB
case RISCV_SUBW: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_Feature64Bit) &&
(RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.subw $rd, $rs2
// Operand: rd_wb
// Operand: rd
// Operand: rs2
return true;
} // if
break;
} // case SUBW
case RISCV_SW: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 8)) {
// c.sw $rs2, ${imm}(${rs1})
// Operand: rs2
// Operand: rs1
// Operand: imm
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 0)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_SPRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
RISCVValidateMachineOperand(MI,MCInst_getOperand(MI, 2), 9)) {
// c.swsp $rs2, ${imm}(${rs1})
// Operand: rs2
// Operand: rs1
// Operand: imm
return true;
} // if
break;
} // case SW
case RISCV_UNIMP: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca))) {
// c.unimp
return true;
} // if
break;
} // case UNIMP
case RISCV_XOR: {
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2))))) {
// c.xor $rd, $rs2
// Operand: rd_wb
// Operand: rd
// Operand: rs2
return true;
} // if
if ((RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtC) || RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZca)) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 2)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 2))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 2)))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.xor $rd, $rs2
// Operand: rd_wb
// Operand: rd
// Operand: rs2
return true;
} // if
break;
} // case XOR
case RISCV_XORI: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isImm(MCInst_getOperand(MI, 2))) &&
(MCOperand_getImm(MCInst_getOperand(MI, 2)) == -1) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.not $rd
// Operand: rd_wb
// Operand: rd
return true;
} // if
break;
} // case XORI
case RISCV_ZEXT_H_RV32: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZbb) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.zext.h $rd
// Operand: rd_wb
// Operand: rd
return true;
} // if
break;
} // case ZEXT_H_RV32
case RISCV_ZEXT_H_RV64: {
if (RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZbb) &&
RISCV_getFeatureBits(MI->csh->mode, RISCV_FeatureStdExtZcb) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) && (MCOperand_isReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 0))) &&
(MCOperand_isReg(MCInst_getOperand(MI, 1))) &&
(MCRegisterClass_contains(MCRegisterInfo_getRegClass(MI->MRI, RISCV_GPRCRegClassID),MCOperand_getReg(MCInst_getOperand(MI, 1))))) {
// c.zext.h $rd
// Operand: rd_wb
// Operand: rd
return true;
} // if
} // case ZEXT_H_RV64
} // switch
return false;
}
#endif //GEN_CHECK_COMPRESS_INSTR