From: Alex Richardson <Alexander.Richardson@cl.cam.ac.uk> Cc: "open list:RISC-V TCG CPUs" <qemu-riscv@nongnu.org>, Sagar Karandikar <sagark@eecs.berkeley.edu>, Bastian Koppelmann <kbastian@mail.uni-paderborn.de>, "open list:All patches CC here" <qemu-devel@nongnu.org>, Alistair Francis <Alistair.Francis@wdc.com>, Alex Richardson <Alexander.Richardson@cl.cam.ac.uk>, Palmer Dabbelt <palmer@dabbelt.com> Subject: [PATCH v2 1/2] target/riscv: Reduce duplicated code in trans_rvh.c.inc Date: Mon, 22 Feb 2021 18:49:38 +0000 [thread overview] Message-ID: <20210222184940.43169-1-Alexander.Richardson@cl.cam.ac.uk> (raw) I rencently merged CHERI QEMU up to 5.2, and we have to modify all functions that perform memory accesses. Factoring these almost-indentical functions into two shared helpers makes our changes a lot smaller and should also make this code easier to maintain. --- target/riscv/insn_trans/trans_rvh.c.inc | 199 ++++-------------------- 1 file changed, 29 insertions(+), 170 deletions(-) diff --git a/target/riscv/insn_trans/trans_rvh.c.inc b/target/riscv/insn_trans/trans_rvh.c.inc index ce7ed5affb..c66268a9b0 100644 --- a/target/riscv/insn_trans/trans_rvh.c.inc +++ b/target/riscv/insn_trans/trans_rvh.c.inc @@ -28,7 +28,7 @@ static void check_access(DisasContext *ctx) { } #endif -static bool trans_hlv_b(DisasContext *ctx, arg_hlv_b *a) +static bool gen_hlv(DisasContext *ctx, int rs1, int rd, MemOp memop) { REQUIRE_EXT(ctx, RVH); #ifndef CONFIG_USER_ONLY @@ -37,10 +37,10 @@ static bool trans_hlv_b(DisasContext *ctx, arg_hlv_b *a) check_access(ctx); - gen_get_gpr(t0, a->rs1); + gen_get_gpr(t0, rs1); - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_SB); - gen_set_gpr(a->rd, t1); + tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, memop); + gen_set_gpr(rd, t1); tcg_temp_free(t0); tcg_temp_free(t1); @@ -50,224 +50,83 @@ static bool trans_hlv_b(DisasContext *ctx, arg_hlv_b *a) #endif } -static bool trans_hlv_h(DisasContext *ctx, arg_hlv_h *a) + +static bool gen_hsv(DisasContext *ctx, int rs1, int rs2, MemOp memop) { REQUIRE_EXT(ctx, RVH); #ifndef CONFIG_USER_ONLY TCGv t0 = tcg_temp_new(); - TCGv t1 = tcg_temp_new(); + TCGv dat = tcg_temp_new(); check_access(ctx); - gen_get_gpr(t0, a->rs1); + gen_get_gpr(t0, rs1); + gen_get_gpr(dat, rs2); - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TESW); - gen_set_gpr(a->rd, t1); + tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, memop); tcg_temp_free(t0); - tcg_temp_free(t1); + tcg_temp_free(dat); return true; #else return false; #endif } -static bool trans_hlv_w(DisasContext *ctx, arg_hlv_w *a) +static bool trans_hlv_b(DisasContext *ctx, arg_hlv_b *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv t1 = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); + return gen_hlv(ctx, a->rs1, a->rd, MO_SB); +} - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TESL); - gen_set_gpr(a->rd, t1); +static bool trans_hlv_h(DisasContext *ctx, arg_hlv_h *a) +{ + return gen_hlv(ctx, a->rs1, a->rd, MO_TESW); +} - tcg_temp_free(t0); - tcg_temp_free(t1); - return true; -#else - return false; -#endif +static bool trans_hlv_w(DisasContext *ctx, arg_hlv_w *a) +{ + return gen_hlv(ctx, a->rs1, a->rd, MO_TESL); } static bool trans_hlv_bu(DisasContext *ctx, arg_hlv_bu *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv t1 = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_UB); - gen_set_gpr(a->rd, t1); - - tcg_temp_free(t0); - tcg_temp_free(t1); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rd, MO_UB); } static bool trans_hlv_hu(DisasContext *ctx, arg_hlv_hu *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv t1 = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TEUW); - gen_set_gpr(a->rd, t1); - - tcg_temp_free(t0); - tcg_temp_free(t1); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rd, MO_TEUW); } static bool trans_hsv_b(DisasContext *ctx, arg_hsv_b *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv dat = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - gen_get_gpr(dat, a->rs2); - - tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_SB); - - tcg_temp_free(t0); - tcg_temp_free(dat); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rs2, MO_SB); } static bool trans_hsv_h(DisasContext *ctx, arg_hsv_h *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv dat = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - gen_get_gpr(dat, a->rs2); - - tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TESW); - - tcg_temp_free(t0); - tcg_temp_free(dat); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rs2, MO_TESW); } static bool trans_hsv_w(DisasContext *ctx, arg_hsv_w *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv dat = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - gen_get_gpr(dat, a->rs2); - - tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TESL); - - tcg_temp_free(t0); - tcg_temp_free(dat); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rs2, MO_TESL); } #ifdef TARGET_RISCV64 static bool trans_hlv_wu(DisasContext *ctx, arg_hlv_wu *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv t1 = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TEUL); - gen_set_gpr(a->rd, t1); - - tcg_temp_free(t0); - tcg_temp_free(t1); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rd, MO_TEUL); } static bool trans_hlv_d(DisasContext *ctx, arg_hlv_d *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv t1 = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TEQ); - gen_set_gpr(a->rd, t1); - - tcg_temp_free(t0); - tcg_temp_free(t1); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rd, MO_TEQ); } static bool trans_hsv_d(DisasContext *ctx, arg_hsv_d *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv dat = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - gen_get_gpr(dat, a->rs2); - - tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TEQ); - - tcg_temp_free(t0); - tcg_temp_free(dat); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rs2, MO_TEQ); } #endif -- 2.30.0
WARNING: multiple messages have this Message-ID (diff)
From: Alex Richardson <Alexander.Richardson@cl.cam.ac.uk> Cc: Alex Richardson <Alexander.Richardson@cl.cam.ac.uk>, Palmer Dabbelt <palmer@dabbelt.com>, Alistair Francis <Alistair.Francis@wdc.com>, Sagar Karandikar <sagark@eecs.berkeley.edu>, Bastian Koppelmann <kbastian@mail.uni-paderborn.de>, qemu-riscv@nongnu.org (open list:RISC-V TCG CPUs), qemu-devel@nongnu.org (open list:All patches CC here) Subject: [PATCH v2 1/2] target/riscv: Reduce duplicated code in trans_rvh.c.inc Date: Mon, 22 Feb 2021 18:49:38 +0000 [thread overview] Message-ID: <20210222184940.43169-1-Alexander.Richardson@cl.cam.ac.uk> (raw) I rencently merged CHERI QEMU up to 5.2, and we have to modify all functions that perform memory accesses. Factoring these almost-indentical functions into two shared helpers makes our changes a lot smaller and should also make this code easier to maintain. --- target/riscv/insn_trans/trans_rvh.c.inc | 199 ++++-------------------- 1 file changed, 29 insertions(+), 170 deletions(-) diff --git a/target/riscv/insn_trans/trans_rvh.c.inc b/target/riscv/insn_trans/trans_rvh.c.inc index ce7ed5affb..c66268a9b0 100644 --- a/target/riscv/insn_trans/trans_rvh.c.inc +++ b/target/riscv/insn_trans/trans_rvh.c.inc @@ -28,7 +28,7 @@ static void check_access(DisasContext *ctx) { } #endif -static bool trans_hlv_b(DisasContext *ctx, arg_hlv_b *a) +static bool gen_hlv(DisasContext *ctx, int rs1, int rd, MemOp memop) { REQUIRE_EXT(ctx, RVH); #ifndef CONFIG_USER_ONLY @@ -37,10 +37,10 @@ static bool trans_hlv_b(DisasContext *ctx, arg_hlv_b *a) check_access(ctx); - gen_get_gpr(t0, a->rs1); + gen_get_gpr(t0, rs1); - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_SB); - gen_set_gpr(a->rd, t1); + tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, memop); + gen_set_gpr(rd, t1); tcg_temp_free(t0); tcg_temp_free(t1); @@ -50,224 +50,83 @@ static bool trans_hlv_b(DisasContext *ctx, arg_hlv_b *a) #endif } -static bool trans_hlv_h(DisasContext *ctx, arg_hlv_h *a) + +static bool gen_hsv(DisasContext *ctx, int rs1, int rs2, MemOp memop) { REQUIRE_EXT(ctx, RVH); #ifndef CONFIG_USER_ONLY TCGv t0 = tcg_temp_new(); - TCGv t1 = tcg_temp_new(); + TCGv dat = tcg_temp_new(); check_access(ctx); - gen_get_gpr(t0, a->rs1); + gen_get_gpr(t0, rs1); + gen_get_gpr(dat, rs2); - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TESW); - gen_set_gpr(a->rd, t1); + tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, memop); tcg_temp_free(t0); - tcg_temp_free(t1); + tcg_temp_free(dat); return true; #else return false; #endif } -static bool trans_hlv_w(DisasContext *ctx, arg_hlv_w *a) +static bool trans_hlv_b(DisasContext *ctx, arg_hlv_b *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv t1 = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); + return gen_hlv(ctx, a->rs1, a->rd, MO_SB); +} - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TESL); - gen_set_gpr(a->rd, t1); +static bool trans_hlv_h(DisasContext *ctx, arg_hlv_h *a) +{ + return gen_hlv(ctx, a->rs1, a->rd, MO_TESW); +} - tcg_temp_free(t0); - tcg_temp_free(t1); - return true; -#else - return false; -#endif +static bool trans_hlv_w(DisasContext *ctx, arg_hlv_w *a) +{ + return gen_hlv(ctx, a->rs1, a->rd, MO_TESL); } static bool trans_hlv_bu(DisasContext *ctx, arg_hlv_bu *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv t1 = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_UB); - gen_set_gpr(a->rd, t1); - - tcg_temp_free(t0); - tcg_temp_free(t1); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rd, MO_UB); } static bool trans_hlv_hu(DisasContext *ctx, arg_hlv_hu *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv t1 = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TEUW); - gen_set_gpr(a->rd, t1); - - tcg_temp_free(t0); - tcg_temp_free(t1); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rd, MO_TEUW); } static bool trans_hsv_b(DisasContext *ctx, arg_hsv_b *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv dat = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - gen_get_gpr(dat, a->rs2); - - tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_SB); - - tcg_temp_free(t0); - tcg_temp_free(dat); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rs2, MO_SB); } static bool trans_hsv_h(DisasContext *ctx, arg_hsv_h *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv dat = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - gen_get_gpr(dat, a->rs2); - - tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TESW); - - tcg_temp_free(t0); - tcg_temp_free(dat); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rs2, MO_TESW); } static bool trans_hsv_w(DisasContext *ctx, arg_hsv_w *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv dat = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - gen_get_gpr(dat, a->rs2); - - tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TESL); - - tcg_temp_free(t0); - tcg_temp_free(dat); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rs2, MO_TESL); } #ifdef TARGET_RISCV64 static bool trans_hlv_wu(DisasContext *ctx, arg_hlv_wu *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv t1 = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TEUL); - gen_set_gpr(a->rd, t1); - - tcg_temp_free(t0); - tcg_temp_free(t1); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rd, MO_TEUL); } static bool trans_hlv_d(DisasContext *ctx, arg_hlv_d *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv t1 = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - - tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TEQ); - gen_set_gpr(a->rd, t1); - - tcg_temp_free(t0); - tcg_temp_free(t1); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rd, MO_TEQ); } static bool trans_hsv_d(DisasContext *ctx, arg_hsv_d *a) { - REQUIRE_EXT(ctx, RVH); -#ifndef CONFIG_USER_ONLY - TCGv t0 = tcg_temp_new(); - TCGv dat = tcg_temp_new(); - - check_access(ctx); - - gen_get_gpr(t0, a->rs1); - gen_get_gpr(dat, a->rs2); - - tcg_gen_qemu_st_tl(dat, t0, ctx->mem_idx | TB_FLAGS_PRIV_HYP_ACCESS_MASK, MO_TEQ); - - tcg_temp_free(t0); - tcg_temp_free(dat); - return true; -#else - return false; -#endif + return gen_hlv(ctx, a->rs1, a->rs2, MO_TEQ); } #endif -- 2.30.0
next reply other threads:[~2021-02-22 19:08 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-02-22 18:49 Alex Richardson [this message] 2021-02-22 18:49 ` [PATCH v2 1/2] target/riscv: Reduce duplicated code in trans_rvh.c.inc Alex Richardson 2021-02-22 18:49 ` [PATCH v2 2/2] target/riscv: Call check_access() before tcg_temp_new() Alex Richardson 2021-02-22 18:49 ` Alex Richardson 2021-02-24 0:31 ` Richard Henderson 2021-02-24 0:24 ` [PATCH v2 1/2] target/riscv: Reduce duplicated code in trans_rvh.c.inc Richard Henderson
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210222184940.43169-1-Alexander.Richardson@cl.cam.ac.uk \ --to=alexander.richardson@cl.cam.ac.uk \ --cc=Alistair.Francis@wdc.com \ --cc=kbastian@mail.uni-paderborn.de \ --cc=palmer@dabbelt.com \ --cc=qemu-devel@nongnu.org \ --cc=qemu-riscv@nongnu.org \ --cc=sagark@eecs.berkeley.edu \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.