mirror of
https://github.com/yuzu-emu/unicorn
synced 2024-11-24 10:48:19 +00:00
target/riscv: Convert RV64F insns to decodetree
Backports commit 95561ee3b41a536cc373e59da10605e2a8676ee2 from qemu
This commit is contained in:
parent
9edaf2069e
commit
d8d107ec85
2 changed files with 74 additions and 0 deletions
|
@ -56,3 +56,9 @@ amomin_d 10000 . . ..... ..... 011 ..... 0101111 @atom_st
|
||||||
amomax_d 10100 . . ..... ..... 011 ..... 0101111 @atom_st
|
amomax_d 10100 . . ..... ..... 011 ..... 0101111 @atom_st
|
||||||
amominu_d 11000 . . ..... ..... 011 ..... 0101111 @atom_st
|
amominu_d 11000 . . ..... ..... 011 ..... 0101111 @atom_st
|
||||||
amomaxu_d 11100 . . ..... ..... 011 ..... 0101111 @atom_st
|
amomaxu_d 11100 . . ..... ..... 011 ..... 0101111 @atom_st
|
||||||
|
|
||||||
|
# *** RV64F Standard Extension (in addition to RV32F) ***
|
||||||
|
fcvt_l_s 1100000 00010 ..... ... ..... 1010011 @r2_rm
|
||||||
|
fcvt_lu_s 1100000 00011 ..... ... ..... 1010011 @r2_rm
|
||||||
|
fcvt_s_l 1101000 00010 ..... ... ..... 1010011 @r2_rm
|
||||||
|
fcvt_s_lu 1101000 00011 ..... ... ..... 1010011 @r2_rm
|
||||||
|
|
|
@ -427,3 +427,71 @@ static bool trans_fmv_w_x(DisasContext *ctx, arg_fmv_w_x *a)
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TARGET_RISCV64
|
||||||
|
static bool trans_fcvt_l_s(DisasContext *ctx, arg_fcvt_l_s *a)
|
||||||
|
{
|
||||||
|
TCGContext *tcg_ctx = ctx->uc->tcg_ctx;
|
||||||
|
|
||||||
|
REQUIRE_FPU;
|
||||||
|
REQUIRE_EXT(ctx, RVF);
|
||||||
|
|
||||||
|
TCGv t0 = tcg_temp_new(tcg_ctx);
|
||||||
|
gen_set_rm(ctx, a->rm);
|
||||||
|
gen_helper_fcvt_l_s(tcg_ctx, t0, tcg_ctx->cpu_env, tcg_ctx->cpu_fpr_risc[a->rs1]);
|
||||||
|
gen_set_gpr(ctx, a->rd, t0);
|
||||||
|
tcg_temp_free(tcg_ctx, t0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool trans_fcvt_lu_s(DisasContext *ctx, arg_fcvt_lu_s *a)
|
||||||
|
{
|
||||||
|
TCGContext *tcg_ctx = ctx->uc->tcg_ctx;
|
||||||
|
|
||||||
|
REQUIRE_FPU;
|
||||||
|
REQUIRE_EXT(ctx, RVF);
|
||||||
|
|
||||||
|
TCGv t0 = tcg_temp_new(tcg_ctx);
|
||||||
|
gen_set_rm(ctx, a->rm);
|
||||||
|
gen_helper_fcvt_lu_s(tcg_ctx, t0, tcg_ctx->cpu_env, tcg_ctx->cpu_fpr_risc[a->rs1]);
|
||||||
|
gen_set_gpr(ctx, a->rd, t0);
|
||||||
|
tcg_temp_free(tcg_ctx, t0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool trans_fcvt_s_l(DisasContext *ctx, arg_fcvt_s_l *a)
|
||||||
|
{
|
||||||
|
TCGContext *tcg_ctx = ctx->uc->tcg_ctx;
|
||||||
|
|
||||||
|
REQUIRE_FPU;
|
||||||
|
REQUIRE_EXT(ctx, RVF);
|
||||||
|
|
||||||
|
TCGv t0 = tcg_temp_new(tcg_ctx);
|
||||||
|
gen_get_gpr(ctx, t0, a->rs1);
|
||||||
|
|
||||||
|
gen_set_rm(ctx, a->rm);
|
||||||
|
gen_helper_fcvt_s_l(tcg_ctx, tcg_ctx->cpu_fpr_risc[a->rd], tcg_ctx->cpu_env, t0);
|
||||||
|
|
||||||
|
mark_fs_dirty(ctx);
|
||||||
|
tcg_temp_free(tcg_ctx, t0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool trans_fcvt_s_lu(DisasContext *ctx, arg_fcvt_s_lu *a)
|
||||||
|
{
|
||||||
|
TCGContext *tcg_ctx = ctx->uc->tcg_ctx;
|
||||||
|
|
||||||
|
REQUIRE_FPU;
|
||||||
|
REQUIRE_EXT(ctx, RVF);
|
||||||
|
|
||||||
|
TCGv t0 = tcg_temp_new(tcg_ctx);
|
||||||
|
gen_get_gpr(ctx, t0, a->rs1);
|
||||||
|
|
||||||
|
gen_set_rm(ctx, a->rm);
|
||||||
|
gen_helper_fcvt_s_lu(tcg_ctx, tcg_ctx->cpu_fpr_risc[a->rd], tcg_ctx->cpu_env, t0);
|
||||||
|
|
||||||
|
mark_fs_dirty(ctx);
|
||||||
|
tcg_temp_free(tcg_ctx, t0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue