[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC v3 PATCH 07/14] tcg/ppc: Add support for fence
From: |
Sergey Fedorov |
Subject: |
Re: [Qemu-devel] [RFC v3 PATCH 07/14] tcg/ppc: Add support for fence |
Date: |
Wed, 22 Jun 2016 22:50:22 +0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0 |
On 18/06/16 07:03, Pranith Kumar wrote:
> Signed-off-by: Richard Henderson <address@hidden>
> Signed-off-by: Pranith Kumar <address@hidden>
> ---
> tcg/ppc/tcg-target.inc.c | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/tcg/ppc/tcg-target.inc.c b/tcg/ppc/tcg-target.inc.c
> index da10052..766848e 100644
> --- a/tcg/ppc/tcg-target.inc.c
> +++ b/tcg/ppc/tcg-target.inc.c
> @@ -469,6 +469,10 @@ static int tcg_target_const_match(tcg_target_long val,
> TCGType type,
> #define STHX XO31(407)
> #define STWX XO31(151)
>
> +#define EIEIO XO31(854)
> +#define HWSYNC XO31(598)
> +#define LWSYNC (HWSYNC | (1u << 21))
> +
> #define SPR(a, b) ((((a)<<5)|(b))<<11)
> #define LR SPR(8, 0)
> #define CTR SPR(9, 0)
> @@ -1237,6 +1241,21 @@ static void tcg_out_brcond2 (TCGContext *s, const
> TCGArg *args,
> tcg_out_bc(s, BC | BI(7, CR_EQ) | BO_COND_TRUE, arg_label(args[5]));
> }
>
> +static void tcg_out_mb(TCGContext *s, TCGArg a0)
> +{
> + switch (a0 & TCG_MO_ALL) {
> + case TCG_MO_LD_LD:
> + tcg_out32(s, LWSYNC);
lwsync can be used for all cases except store-load which requires
hwsync. eieio is for synchronizing memory-mapped IO which is not used by
TCG at all. So there should be:
switch (a0 & TCG_MO_ALL) {
case TCG_MO_ST_LD:
tcg_out32(s, HWSYNC);
break;
default:
tcg_out32(s, LWSYNC);
break;
}
Kind regards,
Sergey
> + break;
> + case TCG_MO_ST_ST:
> + tcg_out32(s, EIEIO);
> + break;
> + default:
> + tcg_out32(s, HWSYNC);
> + break;
> + }
> +}
> +
> #ifdef __powerpc64__
> void ppc_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr)
> {
> @@ -2439,6 +2458,10 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
> const TCGArg *args,
> tcg_out32(s, MULHD | TAB(args[0], args[1], args[2]));
> break;
>
> + case INDEX_op_mb:
> + tcg_out_mb(s, args[0]);
> + break;
> +
> case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */
> case INDEX_op_mov_i64:
> case INDEX_op_movi_i32: /* Always emitted via tcg_out_movi. */
> @@ -2586,6 +2609,7 @@ static const TCGTargetOpDef ppc_op_defs[] = {
> { INDEX_op_qemu_st_i64, { "S", "S", "S", "S" } },
> #endif
>
> + { INDEX_op_mb, { } },
> { -1 },
> };
>