According to version
20250508 of the unprivileged specification the frm
field of fcsr is 3-bits in size, fix it to 8-bits. Similarly fflags is
5 bits, fix to 8. Uses of frm is restricted to uint8_t where sensible,
helpers still need 32-bit arguments and the DisasContext field is kept
as int to represent -1 for an unknown rm.
Signed-off-by: Anton Johansson <anjo@rev.ng>
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Message-ID: <
20260520125406.28693-5-anjo@rev.ng>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
/* Floating-Point state */
uint64_t fpr[32]; /* assume both F and D extensions */
- target_ulong frm;
+ uint8_t frm;
float_status fp_status;
target_ulong badaddr;
RISCVException exception,
uintptr_t pc);
-target_ulong riscv_cpu_get_fflags(CPURISCVState *env);
-void riscv_cpu_set_fflags(CPURISCVState *env, target_ulong);
+uint8_t riscv_cpu_get_fflags(CPURISCVState *env);
+void riscv_cpu_set_fflags(CPURISCVState *env, uint8_t);
#ifndef CONFIG_USER_ONLY
void cpu_set_exception_base(int vp_index, target_ulong address);
static RISCVException read_fcsr(CPURISCVState *env, int csrno,
target_ulong *val)
{
+ /*
+ * This is an 8-bit operation, fflags make up the lower 5 bits and
+ * frm the upper 3 bits of fcsr.
+ */
*val = (riscv_cpu_get_fflags(env) << FSR_AEXC_SHIFT)
| (env->frm << FSR_RD_SHIFT);
return RISCV_EXCP_NONE;
#include "fpu/softfloat.h"
#include "internals.h"
-target_ulong riscv_cpu_get_fflags(CPURISCVState *env)
+uint8_t riscv_cpu_get_fflags(CPURISCVState *env)
{
int soft = get_float_exception_flags(&env->fp_status);
- target_ulong hard = 0;
+ uint8_t hard = 0;
hard |= (soft & float_flag_inexact) ? FPEXC_NX : 0;
hard |= (soft & float_flag_underflow) ? FPEXC_UF : 0;
return hard;
}
-void riscv_cpu_set_fflags(CPURISCVState *env, target_ulong hard)
+void riscv_cpu_set_fflags(CPURISCVState *env, uint8_t hard)
{
int soft = 0;
void helper_set_rounding_mode(CPURISCVState *env, uint32_t rm)
{
- int softrm;
+ FloatRoundMode softrm;
if (rm == RISCV_FRM_DYN) {
rm = env->frm;
void helper_set_rounding_mode_chkfrm(CPURISCVState *env, uint32_t rm)
{
- int softrm;
+ FloatRoundMode softrm;
/* Always validate frm, even if rm != DYN. */
if (unlikely(env->frm >= 5)) {
VMSTATE_UINT64(env.pc, RISCVCPU),
VMSTATE_UINT64(env.load_res, RISCVCPU),
VMSTATE_UINT64(env.load_val, RISCVCPU),
- VMSTATE_UINTTL(env.frm, RISCVCPU),
+ VMSTATE_UINT8(env.frm, RISCVCPU),
VMSTATE_UINTTL(env.badaddr, RISCVCPU),
VMSTATE_UINTTL(env.guest_phys_fault_addr, RISCVCPU),
VMSTATE_UINTTL(env.priv_ver, RISCVCPU),
ctx->vstart_eq_zero = true;
}
-static void gen_set_rm(DisasContext *ctx, int rm)
+static void gen_set_rm(DisasContext *ctx, uint8_t rm)
{
if (ctx->frm == rm) {
return;
gen_helper_set_rounding_mode(tcg_env, tcg_constant_i32(rm));
}
-static void gen_set_rm_chkfrm(DisasContext *ctx, int rm)
+static void gen_set_rm_chkfrm(DisasContext *ctx, uint8_t rm)
{
if (ctx->frm == rm && ctx->frm_valid) {
return;