mirror of https://github.com/xemu-project/xemu.git
target/riscv: zfh: implement zfhmin extension
Zfhmin extension is a subset of Zfh extension, consisting only of data transfer and conversion instructions. If enabled, only the following instructions from Zfh extension are included: * flh, fsh, fmv.x.h, fmv.h.x, fcvt.s.h, fcvt.h.s * If D extension is present: fcvt.d.h, fcvt.h.d Signed-off-by: Frank Chang <frank.chang@sifive.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-id: 20211210074329.5775-8-frank.chang@sifive.com Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
13fb8c7b42
commit
2d258b428b
|
@ -313,6 +313,7 @@ struct RISCVCPU {
|
||||||
bool ext_ifencei;
|
bool ext_ifencei;
|
||||||
bool ext_icsr;
|
bool ext_icsr;
|
||||||
bool ext_zfh;
|
bool ext_zfh;
|
||||||
|
bool ext_zfhmin;
|
||||||
|
|
||||||
char *priv_spec;
|
char *priv_spec;
|
||||||
char *user_spec;
|
char *user_spec;
|
||||||
|
|
|
@ -22,13 +22,19 @@
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define REQUIRE_ZFH_OR_ZFHMIN(ctx) do { \
|
||||||
|
if (!(ctx->ext_zfh || ctx->ext_zfhmin)) { \
|
||||||
|
return false; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
static bool trans_flh(DisasContext *ctx, arg_flh *a)
|
static bool trans_flh(DisasContext *ctx, arg_flh *a)
|
||||||
{
|
{
|
||||||
TCGv_i64 dest;
|
TCGv_i64 dest;
|
||||||
TCGv t0;
|
TCGv t0;
|
||||||
|
|
||||||
REQUIRE_FPU;
|
REQUIRE_FPU;
|
||||||
REQUIRE_ZFH(ctx);
|
REQUIRE_ZFH_OR_ZFHMIN(ctx);
|
||||||
|
|
||||||
t0 = get_gpr(ctx, a->rs1, EXT_NONE);
|
t0 = get_gpr(ctx, a->rs1, EXT_NONE);
|
||||||
if (a->imm) {
|
if (a->imm) {
|
||||||
|
@ -50,7 +56,7 @@ static bool trans_fsh(DisasContext *ctx, arg_fsh *a)
|
||||||
TCGv t0;
|
TCGv t0;
|
||||||
|
|
||||||
REQUIRE_FPU;
|
REQUIRE_FPU;
|
||||||
REQUIRE_ZFH(ctx);
|
REQUIRE_ZFH_OR_ZFHMIN(ctx);
|
||||||
|
|
||||||
t0 = get_gpr(ctx, a->rs1, EXT_NONE);
|
t0 = get_gpr(ctx, a->rs1, EXT_NONE);
|
||||||
if (a->imm) {
|
if (a->imm) {
|
||||||
|
@ -283,7 +289,7 @@ static bool trans_fmax_h(DisasContext *ctx, arg_fmax_h *a)
|
||||||
static bool trans_fcvt_s_h(DisasContext *ctx, arg_fcvt_s_h *a)
|
static bool trans_fcvt_s_h(DisasContext *ctx, arg_fcvt_s_h *a)
|
||||||
{
|
{
|
||||||
REQUIRE_FPU;
|
REQUIRE_FPU;
|
||||||
REQUIRE_ZFH(ctx);
|
REQUIRE_ZFH_OR_ZFHMIN(ctx);
|
||||||
|
|
||||||
gen_set_rm(ctx, a->rm);
|
gen_set_rm(ctx, a->rm);
|
||||||
gen_helper_fcvt_s_h(cpu_fpr[a->rd], cpu_env, cpu_fpr[a->rs1]);
|
gen_helper_fcvt_s_h(cpu_fpr[a->rd], cpu_env, cpu_fpr[a->rs1]);
|
||||||
|
@ -296,7 +302,7 @@ static bool trans_fcvt_s_h(DisasContext *ctx, arg_fcvt_s_h *a)
|
||||||
static bool trans_fcvt_d_h(DisasContext *ctx, arg_fcvt_d_h *a)
|
static bool trans_fcvt_d_h(DisasContext *ctx, arg_fcvt_d_h *a)
|
||||||
{
|
{
|
||||||
REQUIRE_FPU;
|
REQUIRE_FPU;
|
||||||
REQUIRE_ZFH(ctx);
|
REQUIRE_ZFH_OR_ZFHMIN(ctx);
|
||||||
REQUIRE_EXT(ctx, RVD);
|
REQUIRE_EXT(ctx, RVD);
|
||||||
|
|
||||||
gen_set_rm(ctx, a->rm);
|
gen_set_rm(ctx, a->rm);
|
||||||
|
@ -311,7 +317,7 @@ static bool trans_fcvt_d_h(DisasContext *ctx, arg_fcvt_d_h *a)
|
||||||
static bool trans_fcvt_h_s(DisasContext *ctx, arg_fcvt_h_s *a)
|
static bool trans_fcvt_h_s(DisasContext *ctx, arg_fcvt_h_s *a)
|
||||||
{
|
{
|
||||||
REQUIRE_FPU;
|
REQUIRE_FPU;
|
||||||
REQUIRE_ZFH(ctx);
|
REQUIRE_ZFH_OR_ZFHMIN(ctx);
|
||||||
|
|
||||||
gen_set_rm(ctx, a->rm);
|
gen_set_rm(ctx, a->rm);
|
||||||
gen_helper_fcvt_h_s(cpu_fpr[a->rd], cpu_env, cpu_fpr[a->rs1]);
|
gen_helper_fcvt_h_s(cpu_fpr[a->rd], cpu_env, cpu_fpr[a->rs1]);
|
||||||
|
@ -324,7 +330,7 @@ static bool trans_fcvt_h_s(DisasContext *ctx, arg_fcvt_h_s *a)
|
||||||
static bool trans_fcvt_h_d(DisasContext *ctx, arg_fcvt_h_d *a)
|
static bool trans_fcvt_h_d(DisasContext *ctx, arg_fcvt_h_d *a)
|
||||||
{
|
{
|
||||||
REQUIRE_FPU;
|
REQUIRE_FPU;
|
||||||
REQUIRE_ZFH(ctx);
|
REQUIRE_ZFH_OR_ZFHMIN(ctx);
|
||||||
REQUIRE_EXT(ctx, RVD);
|
REQUIRE_EXT(ctx, RVD);
|
||||||
|
|
||||||
gen_set_rm(ctx, a->rm);
|
gen_set_rm(ctx, a->rm);
|
||||||
|
@ -441,7 +447,7 @@ static bool trans_fcvt_h_wu(DisasContext *ctx, arg_fcvt_h_wu *a)
|
||||||
static bool trans_fmv_x_h(DisasContext *ctx, arg_fmv_x_h *a)
|
static bool trans_fmv_x_h(DisasContext *ctx, arg_fmv_x_h *a)
|
||||||
{
|
{
|
||||||
REQUIRE_FPU;
|
REQUIRE_FPU;
|
||||||
REQUIRE_ZFH(ctx);
|
REQUIRE_ZFH_OR_ZFHMIN(ctx);
|
||||||
|
|
||||||
TCGv dest = dest_gpr(ctx, a->rd);
|
TCGv dest = dest_gpr(ctx, a->rd);
|
||||||
|
|
||||||
|
@ -461,7 +467,7 @@ static bool trans_fmv_x_h(DisasContext *ctx, arg_fmv_x_h *a)
|
||||||
static bool trans_fmv_h_x(DisasContext *ctx, arg_fmv_h_x *a)
|
static bool trans_fmv_h_x(DisasContext *ctx, arg_fmv_h_x *a)
|
||||||
{
|
{
|
||||||
REQUIRE_FPU;
|
REQUIRE_FPU;
|
||||||
REQUIRE_ZFH(ctx);
|
REQUIRE_ZFH_OR_ZFHMIN(ctx);
|
||||||
|
|
||||||
TCGv t0 = get_gpr(ctx, a->rs1, EXT_ZERO);
|
TCGv t0 = get_gpr(ctx, a->rs1, EXT_ZERO);
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,7 @@ typedef struct DisasContext {
|
||||||
bool virt_enabled;
|
bool virt_enabled;
|
||||||
bool ext_ifencei;
|
bool ext_ifencei;
|
||||||
bool ext_zfh;
|
bool ext_zfh;
|
||||||
|
bool ext_zfhmin;
|
||||||
bool hlsx;
|
bool hlsx;
|
||||||
/* vector extension */
|
/* vector extension */
|
||||||
bool vill;
|
bool vill;
|
||||||
|
@ -644,6 +645,7 @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
|
||||||
ctx->frm = -1; /* unknown rounding mode */
|
ctx->frm = -1; /* unknown rounding mode */
|
||||||
ctx->ext_ifencei = cpu->cfg.ext_ifencei;
|
ctx->ext_ifencei = cpu->cfg.ext_ifencei;
|
||||||
ctx->ext_zfh = cpu->cfg.ext_zfh;
|
ctx->ext_zfh = cpu->cfg.ext_zfh;
|
||||||
|
ctx->ext_zfhmin = cpu->cfg.ext_zfhmin;
|
||||||
ctx->vlen = cpu->cfg.vlen;
|
ctx->vlen = cpu->cfg.vlen;
|
||||||
ctx->mstatus_hs_fs = FIELD_EX32(tb_flags, TB_FLAGS, MSTATUS_HS_FS);
|
ctx->mstatus_hs_fs = FIELD_EX32(tb_flags, TB_FLAGS, MSTATUS_HS_FS);
|
||||||
ctx->hlsx = FIELD_EX32(tb_flags, TB_FLAGS, HLSX);
|
ctx->hlsx = FIELD_EX32(tb_flags, TB_FLAGS, HLSX);
|
||||||
|
|
Loading…
Reference in New Issue