@samitouri / QOSamiQemu / commits / 4abc45a78f

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 },