@samitouri / QOSamiQemu / commits / e1322e1558

target/riscv: Support raising misaligned exceptions for floating-point loads/stores

When the Zicclsm extension is not enabled, raise misaligned load/store exceptions for misaligned accesses from floating-point load/store instructions (RVF, RVD, Zfh). Signed-off-by: Frank Chang <frank.chang@sifive.com> Reviewed-by: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com> Message-ID: <20260810055618.1175500-5-frank.chang@sifive.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

Frank Chang committed Aug 10, 2026 at 13:56 UTC e1322e1558ac9b2547baa2eb9b5b924220e89910
3 files changed +18
target/riscv/tcg/insn_trans/trans_rvd.c.inc
+6
@@ -61,6 +61,9 @@ static bool trans_fld(DisasContext *ctx, arg_fld *a)
61 memop |= MO_ATOM_IFALIGN;
62 }
63 memop |= ctx->mo_endianness;
64 + if (!ctx->cfg_ptr->ext_zicclsm) {
65 + memop |= MO_ALIGN;
66 + }
67
68 decode_save_opc(ctx, 0);
69 addr = get_address(ctx, a->rs1, a->imm);
@@ -86,6 +89,9 @@ static bool trans_fsd(DisasContext *ctx, arg_fsd *a)
89 memop |= MO_ATOM_IFALIGN;
90 }
91 memop |= ctx->mo_endianness;
92 + if (!ctx->cfg_ptr->ext_zicclsm) {
93 + memop |= MO_ALIGN;
94 + }
95
96 decode_save_opc(ctx, 0);
97 addr = get_address(ctx, a->rs1, a->imm);
target/riscv/tcg/insn_trans/trans_rvf.c.inc
+6
@@ -52,6 +52,9 @@ static bool trans_flw(DisasContext *ctx, arg_flw *a)
52 if (ctx->cfg_ptr->ext_zama16b) {
53 memop |= MO_ATOM_WITHIN16;
54 }
55 + if (!ctx->cfg_ptr->ext_zicclsm) {
56 + memop |= MO_ALIGN;
57 + }
58
59 decode_save_opc(ctx, 0);
60 addr = get_address(ctx, a->rs1, a->imm);
@@ -75,6 +78,9 @@ static bool trans_fsw(DisasContext *ctx, arg_fsw *a)
78 if (ctx->cfg_ptr->ext_zama16b) {
79 memop |= MO_ATOM_WITHIN16;
80 }
81 + if (!ctx->cfg_ptr->ext_zicclsm) {
82 + memop |= MO_ALIGN;
83 + }
84
85 decode_save_opc(ctx, 0);
86 addr = get_address(ctx, a->rs1, a->imm);
target/riscv/tcg/insn_trans/trans_rvzfh.c.inc
+6
@@ -50,6 +50,9 @@ static bool trans_flh(DisasContext *ctx, arg_flh *a)
50 REQUIRE_ZFHMIN_OR_ZFBFMIN(ctx);
51
52 memop |= ctx->mo_endianness;
53 + if (!ctx->cfg_ptr->ext_zicclsm) {
54 + memop |= MO_ALIGN;
55 + }
56 decode_save_opc(ctx, 0);
57 t0 = get_gpr(ctx, a->rs1, EXT_NONE);
58 if (a->imm) {
@@ -75,6 +78,9 @@ static bool trans_fsh(DisasContext *ctx, arg_fsh *a)
78 REQUIRE_ZFHMIN_OR_ZFBFMIN(ctx);
79
80 memop |= ctx->mo_endianness;
81 + if (!ctx->cfg_ptr->ext_zicclsm) {
82 + memop |= MO_ALIGN;
83 + }
84 decode_save_opc(ctx, 0);
85 t0 = get_gpr(ctx, a->rs1, EXT_NONE);
86 if (a->imm) {