diff --git a/arch/LoongArch/LoongArchGenCSMappingInsnOp.inc b/arch/LoongArch/LoongArchGenCSMappingInsnOp.inc index 1065738636..22d8bc512c 100644 --- a/arch/LoongArch/LoongArchGenCSMappingInsnOp.inc +++ b/arch/LoongArch/LoongArchGenCSMappingInsnOp.inc @@ -3383,49 +3383,49 @@ }}, { /* LOONGARCH_LD_B (690) - LOONGARCH_INS_LD_B - ld.b $rd, $rj, $imm12 */ { - { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ + { CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */ { CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */ { 0 } }}, { /* LOONGARCH_LD_BU (691) - LOONGARCH_INS_LD_BU - ld.bu $rd, $rj, $imm12 */ { - { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ + { CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */ { CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */ { 0 } }}, { /* LOONGARCH_LD_D (692) - LOONGARCH_INS_LD_D - ld.d $rd, $rj, $imm12 */ { - { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ + { CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */ { CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */ { 0 } }}, { /* LOONGARCH_LD_H (693) - LOONGARCH_INS_LD_H - ld.h $rd, $rj, $imm12 */ { - { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ + { CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */ { CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */ { 0 } }}, { /* LOONGARCH_LD_HU (694) - LOONGARCH_INS_LD_HU - ld.hu $rd, $rj, $imm12 */ { - { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ + { CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */ { CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */ { 0 } }}, { /* LOONGARCH_LD_W (695) - LOONGARCH_INS_LD_W - ld.w $rd, $rj, $imm12 */ { - { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ + { CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */ { CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */ { 0 } }}, { /* LOONGARCH_LD_WU (696) - LOONGARCH_INS_LD_WU - ld.wu $rd, $rj, $imm12 */ { - { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ + { CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ { CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */ { CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */ { 0 } @@ -4233,28 +4233,28 @@ }}, { /* LOONGARCH_ST_B (818) - LOONGARCH_INS_ST_B - st.b $rd, $rj, $imm12 */ { - { CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ + { CS_OP_REG, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ { CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */ { CS_OP_IMM | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */ { 0 } }}, { /* LOONGARCH_ST_D (819) - LOONGARCH_INS_ST_D - st.d $rd, $rj, $imm12 */ { - { CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ + { CS_OP_REG, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ { CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */ { CS_OP_IMM | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */ { 0 } }}, { /* LOONGARCH_ST_H (820) - LOONGARCH_INS_ST_H - st.h $rd, $rj, $imm12 */ { - { CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ + { CS_OP_REG, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ { CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */ { CS_OP_IMM | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */ { 0 } }}, { /* LOONGARCH_ST_W (821) - LOONGARCH_INS_ST_W - st.w $rd, $rj, $imm12 */ { - { CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ + { CS_OP_REG, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */ { CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */ { CS_OP_IMM | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */ { 0 } diff --git a/arch/LoongArch/LoongArchGenCSOpGroup.inc b/arch/LoongArch/LoongArchGenCSOpGroup.inc index 3cb57d64b4..2a02f81e33 100644 --- a/arch/LoongArch/LoongArchGenCSOpGroup.inc +++ b/arch/LoongArch/LoongArchGenCSOpGroup.inc @@ -11,5 +11,5 @@ /* Capstone's LLVM TableGen Backends: */ /* https://github.com/capstone-engine/llvm-capstone */ - LOONGARCH_OP_GROUP_OPERAND = 0, - LOONGARCH_OP_GROUP_ATOMICMEMOP = 1, + LoongArch_OP_GROUP_Operand = 0, + LoongArch_OP_GROUP_AtomicMemOp = 1, diff --git a/arch/LoongArch/LoongArchInstPrinter.c b/arch/LoongArch/LoongArchInstPrinter.c index 172e4b813c..edb590dae5 100644 --- a/arch/LoongArch/LoongArchInstPrinter.c +++ b/arch/LoongArch/LoongArchInstPrinter.c @@ -91,7 +91,7 @@ static void printRegName(MCInst *MI, SStream *O, MCRegister Reg) static void printOperand(MCInst *MI, unsigned OpNo, SStream *O) { - add_cs_detail(MI, LOONGARCH_OP_GROUP_OPERAND, OpNo); + add_cs_detail(MI, LoongArch_OP_GROUP_Operand, OpNo); MCOperand *MO = MCInst_getOperand(MI, (OpNo)); if (MCOperand_isReg(MO)) { @@ -134,7 +134,7 @@ static void printOperand(MCInst *MI, unsigned OpNo, SStream *O) static void printAtomicMemOp(MCInst *MI, unsigned OpNo, SStream *O) { - add_cs_detail(MI, LOONGARCH_OP_GROUP_ATOMICMEMOP, OpNo); + add_cs_detail(MI, LoongArch_OP_GROUP_AtomicMemOp, OpNo); MCOperand *MO = MCInst_getOperand(MI, (OpNo)); printRegName(MI, O, MCOperand_getReg(MO)); diff --git a/arch/LoongArch/LoongArchMapping.c b/arch/LoongArch/LoongArchMapping.c index dbe3bcf487..b1d40cb5ce 100644 --- a/arch/LoongArch/LoongArchMapping.c +++ b/arch/LoongArch/LoongArchMapping.c @@ -549,7 +549,7 @@ void LoongArch_add_cs_detail(MCInst *MI, int /* loongarch_op_group */ op_group, default: printf("ERROR: Operand group %d not handled!\n", op_group); CS_ASSERT_RET(0); - case LOONGARCH_OP_GROUP_OPERAND: + case LoongArch_OP_GROUP_Operand: if (op_type == CS_OP_IMM) { LoongArch_set_detail_op_imm(MI, OpNum, LOONGARCH_OP_IMM, MCInst_getOpVal(MI, OpNum)); @@ -559,7 +559,7 @@ void LoongArch_add_cs_detail(MCInst *MI, int /* loongarch_op_group */ op_group, } else CS_ASSERT_RET(0 && "Op type not handled."); break; - case LOONGARCH_OP_GROUP_ATOMICMEMOP: + case LoongArch_OP_GROUP_AtomicMemOp: CS_ASSERT_RET(op_type == CS_OP_REG); // converted to MEM operand later in LoongArch_rewrite_memory_operand LoongArch_set_detail_op_reg(MI, OpNum, diff --git a/tests/details/loongarch.yaml b/tests/details/loongarch.yaml index 234102efe4..97fd4fdfc0 100644 --- a/tests/details/loongarch.yaml +++ b/tests/details/loongarch.yaml @@ -34,7 +34,7 @@ test_cases: imm: -1 - input: - bytes: [ 0x80, 0x80, 0x00, 0x40, 0x63, 0x80, 0xff, 0x02, 0x78, 0x20, 0xc0, 0x29, 0x00, 0x84, 0x00, 0x01, 0x00, 0xa4, 0x14, 0x01, 0xed, 0x01, 0x00, 0x4c ] + bytes: [ 0x80, 0x80, 0x00, 0x40, 0x63, 0x80, 0xff, 0x02, 0x78, 0x20, 0xc0, 0x29, 0x00, 0x84, 0x00, 0x01, 0x00, 0xa4, 0x14, 0x01, 0xed, 0x01, 0x00, 0x4c, 0x0c, 0xfe, 0x3f, 0x2a ] arch: "loongarch" options: [ CS_OPT_DETAIL, CS_MODE_LOONGARCH64] address: 0x0 @@ -120,6 +120,22 @@ test_cases: type: LOONGARCH_OP_IMM imm: 0x0 groups: [ LOONGARCH_GRP_JUMP ] + - + asm_text: "ld.bu $t0, $t4, -1" + details: + loongarch: + operands: + - + type: LOONGARCH_OP_REG + reg: t0 + access: CS_AC_WRITE + - + type: LOONGARCH_OP_MEM + mem_base: t4 + mem_disp: -1 + access: CS_AC_READ + regs_read: [ t4 ] + regs_write: [ t0 ] - input: bytes: [ 0x80, 0x0d, 0x00, 0x40, 0x00, 0xec, 0x0b, 0x54 ]