Skip to content

Commit f2f0a3c

Browse files
authored
Fix LoongArch ld/st instructions register info (#2701)
According to #2700, the register info of LoongArch ld/st instructions is wrong. A fix for the issue is proposed for llvm-capstone at capstone-engine/llvm-capstone#79. This commit integrates the fix and regenerates the tables via `ASUpdater -a LoongArch -w -s IncGen`. The case change in LoongArchGenCSOpGroup.inc is also handled. Fixes: #2700
1 parent 829be2b commit f2f0a3c

File tree

5 files changed

+34
-18
lines changed

5 files changed

+34
-18
lines changed

arch/LoongArch/LoongArchGenCSMappingInsnOp.inc

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3383,49 +3383,49 @@
33833383
}},
33843384
{ /* LOONGARCH_LD_B (690) - LOONGARCH_INS_LD_B - ld.b $rd, $rj, $imm12 */
33853385
{
3386-
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
3386+
{ CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
33873387
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */
33883388
{ CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */
33893389
{ 0 }
33903390
}},
33913391
{ /* LOONGARCH_LD_BU (691) - LOONGARCH_INS_LD_BU - ld.bu $rd, $rj, $imm12 */
33923392
{
3393-
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
3393+
{ CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
33943394
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */
33953395
{ CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */
33963396
{ 0 }
33973397
}},
33983398
{ /* LOONGARCH_LD_D (692) - LOONGARCH_INS_LD_D - ld.d $rd, $rj, $imm12 */
33993399
{
3400-
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
3400+
{ CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
34013401
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */
34023402
{ CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */
34033403
{ 0 }
34043404
}},
34053405
{ /* LOONGARCH_LD_H (693) - LOONGARCH_INS_LD_H - ld.h $rd, $rj, $imm12 */
34063406
{
3407-
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
3407+
{ CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
34083408
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */
34093409
{ CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */
34103410
{ 0 }
34113411
}},
34123412
{ /* LOONGARCH_LD_HU (694) - LOONGARCH_INS_LD_HU - ld.hu $rd, $rj, $imm12 */
34133413
{
3414-
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
3414+
{ CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
34153415
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */
34163416
{ CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */
34173417
{ 0 }
34183418
}},
34193419
{ /* LOONGARCH_LD_W (695) - LOONGARCH_INS_LD_W - ld.w $rd, $rj, $imm12 */
34203420
{
3421-
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
3421+
{ CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
34223422
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */
34233423
{ CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */
34243424
{ 0 }
34253425
}},
34263426
{ /* LOONGARCH_LD_WU (696) - LOONGARCH_INS_LD_WU - ld.wu $rd, $rj, $imm12 */
34273427
{
3428-
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
3428+
{ CS_OP_REG, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
34293429
{ CS_OP_REG | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */
34303430
{ CS_OP_IMM | CS_OP_MEM, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */
34313431
{ 0 }
@@ -4233,28 +4233,28 @@
42334233
}},
42344234
{ /* LOONGARCH_ST_B (818) - LOONGARCH_INS_ST_B - st.b $rd, $rj, $imm12 */
42354235
{
4236-
{ CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
4236+
{ CS_OP_REG, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
42374237
{ CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */
42384238
{ CS_OP_IMM | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */
42394239
{ 0 }
42404240
}},
42414241
{ /* LOONGARCH_ST_D (819) - LOONGARCH_INS_ST_D - st.d $rd, $rj, $imm12 */
42424242
{
4243-
{ CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
4243+
{ CS_OP_REG, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
42444244
{ CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */
42454245
{ CS_OP_IMM | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */
42464246
{ 0 }
42474247
}},
42484248
{ /* LOONGARCH_ST_H (820) - LOONGARCH_INS_ST_H - st.h $rd, $rj, $imm12 */
42494249
{
4250-
{ CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
4250+
{ CS_OP_REG, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
42514251
{ CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */
42524252
{ CS_OP_IMM | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */
42534253
{ 0 }
42544254
}},
42554255
{ /* LOONGARCH_ST_W (821) - LOONGARCH_INS_ST_W - st.w $rd, $rj, $imm12 */
42564256
{
4257-
{ CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
4257+
{ CS_OP_REG, CS_AC_READ, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rd */
42584258
{ CS_OP_REG | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* rj */
42594259
{ CS_OP_IMM | CS_OP_MEM, CS_AC_WRITE, { CS_DATA_TYPE_INVALID_SIMPLE_VALUE_TYPE, CS_DATA_TYPE_LAST } }, /* imm12 */
42604260
{ 0 }

arch/LoongArch/LoongArchGenCSOpGroup.inc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@
1111
/* Capstone's LLVM TableGen Backends: */
1212
/* https://github.com/capstone-engine/llvm-capstone */
1313

14-
LOONGARCH_OP_GROUP_OPERAND = 0,
15-
LOONGARCH_OP_GROUP_ATOMICMEMOP = 1,
14+
LoongArch_OP_GROUP_Operand = 0,
15+
LoongArch_OP_GROUP_AtomicMemOp = 1,

arch/LoongArch/LoongArchInstPrinter.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ static void printRegName(MCInst *MI, SStream *O, MCRegister Reg)
9191

9292
static void printOperand(MCInst *MI, unsigned OpNo, SStream *O)
9393
{
94-
add_cs_detail(MI, LOONGARCH_OP_GROUP_OPERAND, OpNo);
94+
add_cs_detail(MI, LoongArch_OP_GROUP_Operand, OpNo);
9595
MCOperand *MO = MCInst_getOperand(MI, (OpNo));
9696

9797
if (MCOperand_isReg(MO)) {
@@ -134,7 +134,7 @@ static void printOperand(MCInst *MI, unsigned OpNo, SStream *O)
134134

135135
static void printAtomicMemOp(MCInst *MI, unsigned OpNo, SStream *O)
136136
{
137-
add_cs_detail(MI, LOONGARCH_OP_GROUP_ATOMICMEMOP, OpNo);
137+
add_cs_detail(MI, LoongArch_OP_GROUP_AtomicMemOp, OpNo);
138138
MCOperand *MO = MCInst_getOperand(MI, (OpNo));
139139

140140
printRegName(MI, O, MCOperand_getReg(MO));

arch/LoongArch/LoongArchMapping.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ void LoongArch_add_cs_detail(MCInst *MI, int /* loongarch_op_group */ op_group,
549549
default:
550550
printf("ERROR: Operand group %d not handled!\n", op_group);
551551
CS_ASSERT_RET(0);
552-
case LOONGARCH_OP_GROUP_OPERAND:
552+
case LoongArch_OP_GROUP_Operand:
553553
if (op_type == CS_OP_IMM) {
554554
LoongArch_set_detail_op_imm(MI, OpNum, LOONGARCH_OP_IMM,
555555
MCInst_getOpVal(MI, OpNum));
@@ -559,7 +559,7 @@ void LoongArch_add_cs_detail(MCInst *MI, int /* loongarch_op_group */ op_group,
559559
} else
560560
CS_ASSERT_RET(0 && "Op type not handled.");
561561
break;
562-
case LOONGARCH_OP_GROUP_ATOMICMEMOP:
562+
case LoongArch_OP_GROUP_AtomicMemOp:
563563
CS_ASSERT_RET(op_type == CS_OP_REG);
564564
// converted to MEM operand later in LoongArch_rewrite_memory_operand
565565
LoongArch_set_detail_op_reg(MI, OpNum,

tests/details/loongarch.yaml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ test_cases:
3434
imm: -1
3535
-
3636
input:
37-
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 ]
37+
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 ]
3838
arch: "loongarch"
3939
options: [ CS_OPT_DETAIL, CS_MODE_LOONGARCH64]
4040
address: 0x0
@@ -120,6 +120,22 @@ test_cases:
120120
type: LOONGARCH_OP_IMM
121121
imm: 0x0
122122
groups: [ LOONGARCH_GRP_JUMP ]
123+
-
124+
asm_text: "ld.bu $t0, $t4, -1"
125+
details:
126+
loongarch:
127+
operands:
128+
-
129+
type: LOONGARCH_OP_REG
130+
reg: t0
131+
access: CS_AC_WRITE
132+
-
133+
type: LOONGARCH_OP_MEM
134+
mem_base: t4
135+
mem_disp: -1
136+
access: CS_AC_READ
137+
regs_read: [ t4 ]
138+
regs_write: [ t0 ]
123139
-
124140
input:
125141
bytes: [ 0x80, 0x0d, 0x00, 0x40, 0x00, 0xec, 0x0b, 0x54 ]

0 commit comments

Comments
 (0)