target/riscv: Add Zihintpause support
Added support for RISC-V PAUSE instruction from Zihintpause extension, enabled by default. Tested-by: Heiko Stuebner <heiko@sntech.de> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Dao Lu <daolu@rivosinc.com> Message-Id: <20220725034728.2620750-2-daolu@rivosinc.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
1ad3f9bdc7
commit
4696f0ab5c
@ -73,6 +73,7 @@ static const struct isa_ext_data isa_edata_arr[] = {
|
||||
ISA_EXT_DATA_ENTRY(v, false, PRIV_VERSION_1_12_0, ext_v),
|
||||
ISA_EXT_DATA_ENTRY(zicsr, true, PRIV_VERSION_1_10_0, ext_icsr),
|
||||
ISA_EXT_DATA_ENTRY(zifencei, true, PRIV_VERSION_1_10_0, ext_ifencei),
|
||||
ISA_EXT_DATA_ENTRY(zihintpause, true, PRIV_VERSION_1_10_0, ext_zihintpause),
|
||||
ISA_EXT_DATA_ENTRY(zfh, true, PRIV_VERSION_1_12_0, ext_zfh),
|
||||
ISA_EXT_DATA_ENTRY(zfhmin, true, PRIV_VERSION_1_12_0, ext_zfhmin),
|
||||
ISA_EXT_DATA_ENTRY(zfinx, true, PRIV_VERSION_1_12_0, ext_zfinx),
|
||||
@ -987,6 +988,7 @@ static Property riscv_cpu_extensions[] = {
|
||||
DEFINE_PROP_UINT8("pmu-num", RISCVCPU, cfg.pmu_num, 16),
|
||||
DEFINE_PROP_BOOL("Zifencei", RISCVCPU, cfg.ext_ifencei, true),
|
||||
DEFINE_PROP_BOOL("Zicsr", RISCVCPU, cfg.ext_icsr, true),
|
||||
DEFINE_PROP_BOOL("Zihintpause", RISCVCPU, cfg.ext_zihintpause, true),
|
||||
DEFINE_PROP_BOOL("Zfh", RISCVCPU, cfg.ext_zfh, false),
|
||||
DEFINE_PROP_BOOL("Zfhmin", RISCVCPU, cfg.ext_zfhmin, false),
|
||||
DEFINE_PROP_BOOL("Zve32f", RISCVCPU, cfg.ext_zve32f, false),
|
||||
|
@ -426,6 +426,7 @@ struct RISCVCPUConfig {
|
||||
bool ext_zkt;
|
||||
bool ext_ifencei;
|
||||
bool ext_icsr;
|
||||
bool ext_zihintpause;
|
||||
bool ext_svinval;
|
||||
bool ext_svnapot;
|
||||
bool ext_svpbmt;
|
||||
|
@ -149,7 +149,12 @@ srl 0000000 ..... ..... 101 ..... 0110011 @r
|
||||
sra 0100000 ..... ..... 101 ..... 0110011 @r
|
||||
or 0000000 ..... ..... 110 ..... 0110011 @r
|
||||
and 0000000 ..... ..... 111 ..... 0110011 @r
|
||||
fence ---- pred:4 succ:4 ----- 000 ----- 0001111
|
||||
|
||||
{
|
||||
pause 0000 0001 0000 00000 000 00000 0001111
|
||||
fence ---- pred:4 succ:4 ----- 000 ----- 0001111
|
||||
}
|
||||
|
||||
fence_i ---- ---- ---- ----- 001 ----- 0001111
|
||||
csrrw ............ ..... 001 ..... 1110011 @csr
|
||||
csrrs ............ ..... 010 ..... 1110011 @csr
|
||||
|
@ -792,6 +792,22 @@ static bool trans_srad(DisasContext *ctx, arg_srad *a)
|
||||
return gen_shift(ctx, a, EXT_SIGN, tcg_gen_sar_tl, NULL);
|
||||
}
|
||||
|
||||
static bool trans_pause(DisasContext *ctx, arg_pause *a)
|
||||
{
|
||||
if (!ctx->cfg_ptr->ext_zihintpause) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* PAUSE is a no-op in QEMU,
|
||||
* end the TB and return to main loop
|
||||
*/
|
||||
gen_set_pc_imm(ctx, ctx->pc_succ_insn);
|
||||
tcg_gen_exit_tb(NULL, 0);
|
||||
ctx->base.is_jmp = DISAS_NORETURN;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_fence(DisasContext *ctx, arg_fence *a)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user