disas/riscv: Break pseudo loop for jal and jalr
These were clearly intending to simplify jal ra, foo to jal foo and similarly for jalr, but the pseudo expansion looped back to the original jal/jalr with the full format. Add new opcode expansions dropping the implied ra. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20260812223142.349142-26-richard.henderson@linaro.org> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Richard Henderson committed
Aug 12, 2026 at 15:31 UTC
4abc45a78ff3cb6dbb2d74d8d651e2325c731c28
1 file changed
+9
-7
disas/riscv.c
+9
-7
@@ -326,6 +326,8 @@ typedef enum {
326
rv_op_bgez = 295,
327
rv_op_bltz = 296,
328
rv_op_bgtz = 297,
329
+ rv_op_jal_ra = 298,
330
+ rv_op_jalr_ra = 299,
331
rv_op_j = 302,
332
rv_op_ret = 303,
333
rv_op_jr = 304,
@@ -1029,9 +1031,9 @@ static const char rv_fli_name_const[32][9] =
1031
1032
/* pseudo-instruction constraints */
1033
1032
-static const rvc_constraint rvcc_jal[] = { rvc_rd_eq_ra, rvc_end };
1033
-static const rvc_constraint rvcc_jalr[] = { rvc_rd_eq_ra, rvc_imm_eq_zero,
1034
- rvc_end };
1034
+static const rvc_constraint rvcc_jal_ra[] = { rvc_rd_eq_ra, rvc_end };
1035
+static const rvc_constraint rvcc_jalr_ra[] = { rvc_rd_eq_ra, rvc_imm_eq_zero,
1036
+ rvc_end };
1037
static const rvc_constraint rvcc_nop[] = { rvc_rd_eq_x0, rvc_rs1_eq_x0,
1038
rvc_imm_eq_zero, rvc_end };
1039
static const rvc_constraint rvcc_mv[] = { rvc_imm_eq_zero, rvc_end };
@@ -1068,14 +1070,14 @@ static const rvc_constraint rvcc_jr[] = { rvc_rd_eq_x0, rvc_imm_eq_zero,
1070
1071
static const rv_comp_data rvcp_jal[] = {
1072
{ rv_op_j, rvcc_j },
1071
- { rv_op_jal, rvcc_jal },
1073
+ { rv_op_jal_ra, rvcc_jal_ra },
1074
{ rv_op_illegal, NULL }
1075
};
1076
1077
static const rv_comp_data rvcp_jalr[] = {
1078
{ rv_op_ret, rvcc_ret },
1079
{ rv_op_jr, rvcc_jr },
1078
- { rv_op_jalr, rvcc_jalr },
1080
+ { rv_op_jalr_ra, rvcc_jalr_ra },
1081
{ rv_op_illegal, NULL }
1082
};
1083
@@ -1884,8 +1886,8 @@ static const rv_opcode_data rvi_opcode_data[] = {
1886
{ "bgez", rv_codec_sb, rv_fmt_rs1_offset },
1887
{ "bltz", rv_codec_sb, rv_fmt_rs1_offset },
1888
{ "bgtz", rv_codec_sb, rv_fmt_rs2_offset },
1887
- { },
1888
- { },
1889
+ { "jal", rv_codec_none, rv_fmt_offset }, /* rv_op_jal_ra */
1890
+ { "jalr", rv_codec_none, rv_fmt_rs1 }, /* rv_op_jalr_ra */
1891
{ },
1892
{ },
1893
{ "j", rv_codec_uj, rv_fmt_offset },