mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-07-15 10:27:44 +00:00
target/riscv: Convert RVXI fence insns to decodetree
Backports commit 0c865e856a7e97d37c4dea4cf2ff875faa6e72ed from qemu
This commit is contained in:
parent
11e2b9c410
commit
de580ee378
|
@ -82,3 +82,5 @@ srl 0000000 ..... ..... 101 ..... 0110011 @r
|
||||||
sra 0100000 ..... ..... 101 ..... 0110011 @r
|
sra 0100000 ..... ..... 101 ..... 0110011 @r
|
||||||
or 0000000 ..... ..... 110 ..... 0110011 @r
|
or 0000000 ..... ..... 110 ..... 0110011 @r
|
||||||
and 0000000 ..... ..... 111 ..... 0110011 @r
|
and 0000000 ..... ..... 111 ..... 0110011 @r
|
||||||
|
fence ---- pred:4 succ:4 ----- 000 ----- 0001111
|
||||||
|
fence_i ---- ---- ---- ----- 001 ----- 0001111
|
||||||
|
|
|
@ -22,7 +22,7 @@ static bool trans_lui(DisasContext *ctx, arg_lui *a)
|
||||||
{
|
{
|
||||||
if (a->rd != 0) {
|
if (a->rd != 0) {
|
||||||
TCGContext *tcg_ctx = ctx->uc->tcg_ctx;
|
TCGContext *tcg_ctx = ctx->uc->tcg_ctx;
|
||||||
tcg_gen_movi_tl(tcg_ctx, tcg_ctx->cpu_gpr[a->rd], a->imm);
|
tcg_gen_movi_tl(tcg_ctx, tcg_ctx->cpu_gpr_risc[a->rd], a->imm);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ static bool trans_auipc(DisasContext *ctx, arg_auipc *a)
|
||||||
{
|
{
|
||||||
if (a->rd != 0) {
|
if (a->rd != 0) {
|
||||||
TCGContext *tcg_ctx = ctx->uc->tcg_ctx;
|
TCGContext *tcg_ctx = ctx->uc->tcg_ctx;
|
||||||
tcg_gen_movi_tl(tcg_ctx, tcg_ctx->cpu_gpr[a->rd], a->imm + ctx->base.pc_next);
|
tcg_gen_movi_tl(tcg_ctx, tcg_ctx->cpu_gpr_risc[a->rd], a->imm + ctx->base.pc_next);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -320,3 +320,26 @@ static bool trans_sraw(DisasContext *ctx, arg_sraw *a)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static bool trans_fence(DisasContext *ctx, arg_fence *a)
|
||||||
|
{
|
||||||
|
TCGContext *tcg_ctx = ctx->uc->tcg_ctx;
|
||||||
|
|
||||||
|
/* FENCE is a full memory barrier. */
|
||||||
|
tcg_gen_mb(tcg_ctx, TCG_MO_ALL | TCG_BAR_SC);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool trans_fence_i(DisasContext *ctx, arg_fence_i *a)
|
||||||
|
{
|
||||||
|
TCGContext *tcg_ctx = ctx->uc->tcg_ctx;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FENCE_I is a no-op in QEMU,
|
||||||
|
* however we need to end the translation block
|
||||||
|
*/
|
||||||
|
tcg_gen_movi_tl(tcg_ctx, tcg_ctx->cpu_pc_risc, ctx->pc_succ_insn);
|
||||||
|
tcg_gen_exit_tb(tcg_ctx, NULL, 0);
|
||||||
|
ctx->base.is_jmp = DISAS_NORETURN;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -1962,7 +1962,6 @@ bool decode_insn32(DisasContext *ctx, uint32_t insn);
|
||||||
|
|
||||||
static void decode_RV32_64G(DisasContext *ctx)
|
static void decode_RV32_64G(DisasContext *ctx)
|
||||||
{
|
{
|
||||||
TCGContext *tcg_ctx = ctx->uc->tcg_ctx;
|
|
||||||
int rs1;
|
int rs1;
|
||||||
int rs2;
|
int rs2;
|
||||||
int rd;
|
int rd;
|
||||||
|
@ -2023,18 +2022,6 @@ static void decode_RV32_64G(DisasContext *ctx)
|
||||||
gen_fp_arith(ctx, MASK_OP_FP_ARITH(ctx->opcode), rd, rs1, rs2,
|
gen_fp_arith(ctx, MASK_OP_FP_ARITH(ctx->opcode), rd, rs1, rs2,
|
||||||
GET_RM(ctx->opcode));
|
GET_RM(ctx->opcode));
|
||||||
break;
|
break;
|
||||||
case OPC_RISC_FENCE:
|
|
||||||
if (ctx->opcode & 0x1000) {
|
|
||||||
/* FENCE_I is a no-op in QEMU,
|
|
||||||
* however we need to end the translation block */
|
|
||||||
tcg_gen_movi_tl(tcg_ctx, tcg_ctx->cpu_pc_risc, ctx->pc_succ_insn);
|
|
||||||
tcg_gen_exit_tb(tcg_ctx, NULL, 0);
|
|
||||||
ctx->base.is_jmp = DISAS_NORETURN;
|
|
||||||
} else {
|
|
||||||
/* FENCE is a full memory barrier. */
|
|
||||||
tcg_gen_mb(tcg_ctx, TCG_MO_ALL | TCG_BAR_SC);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OPC_RISC_SYSTEM:
|
case OPC_RISC_SYSTEM:
|
||||||
gen_system(ctx, MASK_OP_SYSTEM(ctx->opcode), rd, rs1,
|
gen_system(ctx, MASK_OP_SYSTEM(ctx->opcode), rd, rs1,
|
||||||
(ctx->opcode & 0xFFF00000) >> 20);
|
(ctx->opcode & 0xFFF00000) >> 20);
|
||||||
|
|
Loading…
Reference in a new issue