disas/riscv: Handle c.lui imm != 0 during decode
Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20260812223142.349142-16-richard.henderson@linaro.org> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Richard Henderson committed
Aug 12, 2026 at 15:31 UTC
3421486be8e9420eb357b878d867f47c9647c1c8
1 file changed
+7
-5
disas/riscv.c
+7
-5
@@ -1902,9 +1902,9 @@ static const rv_opcode_data rvi_opcode_data[] = {
1902
{ "c.li", rv_codec_ci_li, rv_fmt_rd_rs1_imm, NULL, rv_op_addi, rv_op_addi,
1903
rv_op_addi },
1904
{ "c.addi16sp", rv_codec_ci_16sp, rv_fmt_rd_rs1_imm, NULL, rv_op_addi,
1905
- rv_op_addi, rv_op_addi, rvcd_imm_nz },
1905
+ rv_op_addi, rv_op_addi },
1906
{ "c.lui", rv_codec_ci_lui, rv_fmt_rd_uimm, NULL, rv_op_lui, rv_op_lui,
1907
- rv_op_lui, rvcd_imm_nz },
1907
+ rv_op_lui },
1908
{ "c.srli", rv_codec_cb_sh6, rv_fmt_rd_rs1_imm, NULL, rv_op_srli,
1909
rv_op_srli, rv_op_srli, rvcd_imm_nz },
1910
{ "c.srai", rv_codec_cb_sh6, rv_fmt_rd_rs1_imm, NULL, rv_op_srai,
@@ -3032,9 +3032,11 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
3032
break;
3033
}
3034
}
3035
- switch ((inst >> 7) & 0b11111) {
3036
- case 2: op = rv_op_c_addi16sp; break;
3037
- default: op = rv_op_c_lui; break;
3035
+ if (inst & ((1 << 12) | (0x1f << 2))) {
3036
+ switch ((inst >> 7) & 0b11111) {
3037
+ case 2: op = rv_op_c_addi16sp; break;
3038
+ default: op = rv_op_c_lui; break;
3039
+ }
3040
}
3041
break;
3042
case 4: