All of lore.kernel.org
 help / color / mirror / Atom feed
From: Amit Machhiwal <amachhiw@linux.ibm.com>
To: Chinmay Rath <rathc@linux.ibm.com>
Cc: qemu-devel@nongnu.org, qemu-ppc@nongnu.org,
	harshpb@linux.ibm.com, milesg@linux.ibm.com, npiggin@gmail.com,
	richard.henderson@linaro.org, vishalc@linux.ibm.com,
	tshah@linux.ibm.com, shivangu@linux.ibm.com,
	ojaswin@linux.ibm.com, aboorvad@linux.ibm.com,
	amachhiw@linux.ibm.com, shivani@linux.ibm.com,
	mkchauras@gmail.com, uverma@linux.ibm.com,
	nikhilks@linux.ibm.com
Subject: Re: [PATCH v3 02/37] target/ppc: Migrate atomic loads to decodetree
Date: Thu, 27 Aug 2026 19:59:51 +0530	[thread overview]
Message-ID: <20260827195658.90577edc-2c-amachhiw@linux.ibm.com> (raw)
In-Reply-To: <20260827133010.278889-3-rathc@linux.ibm.com>

Hi Chinmay,

Thanks for addressing the reviews comments on v2 and sending the v3.

On 2026/08/27 06:59 PM, Chinmay Rath wrote:
> From: Nikhil Kumar Singh <nikhilks@linux.ibm.com>
> 
> Migrate load-and-reserve instructions (lbarx, lharx, lwarx, ldarx,
> lqarx) to decodetree using the X-form layout.
> 
> A shared helper (do_load_locked) is introduced for standard-width
> variants, while LQARX is handled separately due to its 128-bit
> semantics and register pairing constraints.
> 
> The implementation preserves legacy behavior, including:
>   - Reservation granularity and overwrite semantics
>   - Alignment requirements
>   - Invalid instruction cases for LQARX
> 
> Testing:
>   - Verified TCG equivalence with legacy implementation
> 
> Signed-off-by: Nikhil Kumar Singh <nikhilks@linux.ibm.com>
> Reviewed-by: Glenn Miles <milesg@linux.ibm.com>
> Signed-off-by: Chinmay Rath <rathc@linux.ibm.com>
> ---
>  target/ppc/insn32.decode |   7 +++
>  target/ppc/translate.c   | 118 +++++++++++++++++++--------------------
>  2 files changed, 63 insertions(+), 62 deletions(-)
> 
> diff --git a/target/ppc/insn32.decode b/target/ppc/insn32.decode
> index 342e65dadf..26948e08a7 100644
> --- a/target/ppc/insn32.decode
> +++ b/target/ppc/insn32.decode
> @@ -1309,6 +1309,13 @@ XVF64GERNN      111011 ... -- .... 0 ..... 11111010 ..-  @XX3_at xa=%xx_xa_pair
>  ##Extend Sign Word and Shift Left Immediate XS-form
>  EXTSWSLI         011111 ..... ..... ..... 110111101 . .         @XS
>  
> +## Load and Reserve Instructions
> +LBARX           011111 ..... ..... ..... 0000110100 .   @X_rc
> +LHARX           011111 ..... ..... ..... 0001110100 .   @X_rc
> +LWARX           011111 ..... ..... ..... 0000010100 .   @X_rc
> +LDARX           011111 ..... ..... ..... 0001010100 .   @X_rc
> +LQARX           011111 ..... ..... ..... 0100010100 .   @X_rc
> +
>  ## Vector Division Instructions
>  
>  VDIVSW          000100 ..... ..... ..... 00110001011    @VX
> diff --git a/target/ppc/translate.c b/target/ppc/translate.c
> index e627f48f9e..69c4443dda 100644
> --- a/target/ppc/translate.c
> +++ b/target/ppc/translate.c
> @@ -2947,30 +2947,6 @@ static void gen_isync(DisasContext *ctx)
>      ctx->base.is_jmp = DISAS_EXIT_UPDATE;
>  }
>  
> -static void gen_load_locked(DisasContext *ctx, MemOp memop)
> -{
> -    TCGv gpr = cpu_gpr[rD(ctx->opcode)];
> -    TCGv t0 = tcg_temp_new();
> -
> -    gen_set_access_type(ctx, ACCESS_RES);
> -    gen_addr_reg_index(ctx, t0);
> -    tcg_gen_qemu_ld_tl(gpr, t0, ctx->mem_idx, DEF_MEMOP(memop) | MO_ALIGN);
> -    tcg_gen_mov_tl(cpu_reserve, t0);
> -    tcg_gen_movi_tl(cpu_reserve_length, memop_size(memop));
> -    tcg_gen_mov_tl(cpu_reserve_val, gpr);
> -}
> -
> -#define LARX(name, memop)                  \
> -static void gen_##name(DisasContext *ctx)  \
> -{                                          \
> -    gen_load_locked(ctx, memop);           \
> -}
> -
> -/* lwarx */
> -LARX(lbarx, MO_UB)
> -LARX(lharx, MO_UW)
> -LARX(lwarx, MO_UL)
> -
>  static void gen_fetch_inc_conditional(DisasContext *ctx, MemOp memop,
>                                        TCGv EA, TCGCond cond, int addend)
>  {
> @@ -3219,42 +3195,9 @@ STCX(sthcx_, MO_UW)
>  STCX(stwcx_, MO_UL)
>  
>  #if defined(TARGET_PPC64)
> -/* ldarx */
> -LARX(ldarx, MO_UQ)
>  /* stdcx. */
>  STCX(stdcx_, MO_UQ)
>  
> -/* lqarx */
> -static void gen_lqarx(DisasContext *ctx)
> -{
> -    int rd = rD(ctx->opcode);
> -    TCGv EA, hi, lo;
> -    TCGv_i128 t16;
> -
> -    if (unlikely((rd & 1) || (rd == rA(ctx->opcode)) ||
> -                 (rd == rB(ctx->opcode)))) {
> -        gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
> -        return;
> -    }
> -
> -    gen_set_access_type(ctx, ACCESS_RES);
> -    EA = tcg_temp_new();
> -    gen_addr_reg_index(ctx, EA);
> -
> -    /* Note that the low part is always in RD+1, even in LE mode.  */
> -    lo = cpu_gpr[rd + 1];
> -    hi = cpu_gpr[rd];
> -
> -    t16 = tcg_temp_new_i128();
> -    tcg_gen_qemu_ld_i128(t16, EA, ctx->mem_idx, DEF_MEMOP(MO_128 | MO_ALIGN));
> -    tcg_gen_extr_i128_i64(lo, hi, t16);
> -
> -    tcg_gen_mov_tl(cpu_reserve, EA);
> -    tcg_gen_movi_tl(cpu_reserve_length, 16);
> -    tcg_gen_st_tl(hi, tcg_env, offsetof(CPUPPCState, reserve_val));
> -    tcg_gen_st_tl(lo, tcg_env, offsetof(CPUPPCState, reserve_val2));
> -}
> -
>  /* stqcx. */
>  static void gen_stqcx_(DisasContext *ctx)
>  {
> @@ -5741,6 +5684,62 @@ static bool trans_EXTSWSLI(DisasContext *ctx, arg_XS *a)
>      return true;
>  }
>  
> +/*
> + * Load-and-reserve core
> + */
> +static bool do_load_locked(DisasContext *ctx, arg_X_rc *a, MemOp memop)
> +{
> +    TCGv EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
> +    TCGv gpr = cpu_gpr[a->rt];
> +
> +    gen_set_access_type(ctx, ACCESS_RES);
> +
> +    tcg_gen_qemu_ld_tl(gpr, EA, ctx->mem_idx, memop | MO_ALIGN);
> +
> +    tcg_gen_mov_tl(cpu_reserve, EA);
> +    tcg_gen_movi_tl(cpu_reserve_length, memop_size(memop));
> +
> +    tcg_gen_mov_tl(cpu_reserve_val, gpr);
> +
> +    return true;
> +}
> +
> +TRANS_FLAGS2(ATOMIC_ISA206, LBARX, do_load_locked, DEF_MEMOP(MO_UB))
> +TRANS_FLAGS2(ATOMIC_ISA206, LHARX, do_load_locked, DEF_MEMOP(MO_UW))
> +TRANS(LWARX, do_load_locked, DEF_MEMOP(MO_UL))
> +TRANS64(LDARX, do_load_locked, DEF_MEMOP(MO_UQ))
> +
> +static bool trans_LQARX(DisasContext *ctx, arg_LQARX *a)
> +{
> +    REQUIRE_64BIT(ctx);
> +    REQUIRE_INSNS_FLAGS2(ctx, ISA207S);
> +#if defined(TARGET_PPC64)
> +    TCGv EA;
> +    TCGv_i128 t16;
> +    /* Must use even register and avoid overlap */
> +    if (unlikely((a->rt & 1) || (a->rt == a->ra) || (a->rt == a->rb))) {
> +        gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
> +        return true;
> +    }
> +
> +    gen_set_access_type(ctx, ACCESS_RES);
> +    EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
> +    t16 = tcg_temp_new_i128();
> +
> +    tcg_gen_qemu_ld_i128(t16, EA, ctx->mem_idx, DEF_MEMOP(MO_128 | MO_ALIGN));
> +    tcg_gen_extr_i128_i64(cpu_gpr[a->rt + 1], cpu_gpr[a->rt], t16);
> +    tcg_gen_mov_tl(cpu_reserve, EA);
> +    tcg_gen_movi_tl(cpu_reserve_length, 16);

LGTM.

Reviewed-by: Amit Machhiwal <amachhiw@linux.ibm.com>

> +    tcg_gen_st_i64(cpu_gpr[a->rt], tcg_env,
> +                   offsetof(CPUPPCState, reserve_val));
> +    tcg_gen_st_i64(cpu_gpr[a->rt + 1], tcg_env,
> +                   offsetof(CPUPPCState, reserve_val2));
> +#else
> +    qemu_build_not_reached();
> +#endif
> +    return true;
> +}
> +
>  #include "translate/fixedpoint-impl.c.inc"
>  
>  #include "translate/fp-impl.c.inc"
> @@ -5853,9 +5852,6 @@ GEN_HANDLER(lswx, 0x1F, 0x15, 0x10, 0x00000001, PPC_STRING),
>  GEN_HANDLER(stswi, 0x1F, 0x15, 0x16, 0x00000001, PPC_STRING),
>  GEN_HANDLER(stswx, 0x1F, 0x15, 0x14, 0x00000001, PPC_STRING),
>  GEN_HANDLER(isync, 0x13, 0x16, 0x04, 0x03FFF801, PPC_MEM),
> -GEN_HANDLER_E(lbarx, 0x1F, 0x14, 0x01, 0, PPC_NONE, PPC2_ATOMIC_ISA206),
> -GEN_HANDLER_E(lharx, 0x1F, 0x14, 0x03, 0, PPC_NONE, PPC2_ATOMIC_ISA206),
> -GEN_HANDLER(lwarx, 0x1F, 0x14, 0x00, 0x00000000, PPC_RES),
>  GEN_HANDLER_E(lwat, 0x1F, 0x06, 0x12, 0x00000001, PPC_NONE, PPC2_ISA300),
>  GEN_HANDLER_E(stwat, 0x1F, 0x06, 0x16, 0x00000001, PPC_NONE, PPC2_ISA300),
>  GEN_HANDLER_E(stbcx_, 0x1F, 0x16, 0x15, 0, PPC_NONE, PPC2_ATOMIC_ISA206),
> @@ -5864,8 +5860,6 @@ GEN_HANDLER2(stwcx_, "stwcx.", 0x1F, 0x16, 0x04, 0x00000000, PPC_RES),
>  #if defined(TARGET_PPC64)
>  GEN_HANDLER_E(ldat, 0x1F, 0x06, 0x13, 0x00000001, PPC_NONE, PPC2_ISA300),
>  GEN_HANDLER_E(stdat, 0x1F, 0x06, 0x17, 0x00000001, PPC_NONE, PPC2_ISA300),
> -GEN_HANDLER(ldarx, 0x1F, 0x14, 0x02, 0x00000000, PPC_64B),
> -GEN_HANDLER_E(lqarx, 0x1F, 0x14, 0x08, 0, PPC_NONE, PPC2_LSQ_ISA207),
>  GEN_HANDLER2(stdcx_, "stdcx.", 0x1F, 0x16, 0x06, 0x00000000, PPC_64B),
>  GEN_HANDLER_E(stqcx_, 0x1F, 0x16, 0x05, 0, PPC_NONE, PPC2_LSQ_ISA207),
>  #endif
> -- 
> 2.55.0
> 


  reply	other threads:[~2026-08-27 14:31 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-27 13:29 [PATCH v3 00/37] target/ppc: PPC TCG Improvements (decodetree migrations + ISA 2.07 flag updates) Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 01/37] target/ppc: Migrate extswsli to decodetree Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 02/37] target/ppc: Migrate atomic loads " Chinmay Rath
2026-08-27 14:29   ` Amit Machhiwal [this message]
2026-08-27 13:29 ` [PATCH v3 03/37] target/ppc: Convert cache instructions " Chinmay Rath
2026-08-27 14:56   ` Amit Machhiwal
2026-08-27 13:29 ` [PATCH v3 04/37] target/ppc: Move vector merge " Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 05/37] target/ppc: Move vector pack " Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 06/37] target/ppc: Move st{b, h, w, d, q}cx " Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 07/37] target/ppc: convert slw, srw instruction via decode spec Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 08/37] target/ppc: convert sraw[i] " Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 09/37] target/ppc: Convert mcrf to decode tree Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 10/37] target/ppc: Move fixed-point Shift insns to decodetree Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 11/37] target/ppc: Move fixed-point byte-reversal store " Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 12/37] target/ppc: Move GPR atomic load/store instructions " Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 13/37] target/ppc: Move isync instruction " Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 14/37] target/ppc: Convert b{a, l, la} to decode tree Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 15/37] target/ppc: move various conditional branch insns to decodetree Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 16/37] target/ppc: Fix TRANS* macro variadic arguments handling Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 17/37] target/ppc: Move wait instruction to decodetree Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 18/37] target/ppc: Move sleep & friends " Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 19/37] target/ppc: Refactor sleep and its variants to use a common helper Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 20/37] target/ppc: Move Condition Register access instructions to decodetree Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 21/37] target/ppc: Move Condition Register logical " Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 22/37] target/ppc: make do_ea_calc_ra available for 32 bit builds Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 23/37] target/ppc: Move Fixed-Point Load/Store String instructions to decodetree Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 24/37] target/ppc: Move VMX integer arithmetic and BCD " Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 25/37] target/ppc: Move rlwimi, rlwinm " Chinmay Rath
2026-08-27 15:37   ` Amit Machhiwal
2026-08-27 13:29 ` [PATCH v3 26/37] target/ppc: Move lmw, stmw " Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 27/37] target/ppc: Move mfmsr, mtmsr[d] " Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 28/37] target/ppc: Move byte-reverse " Chinmay Rath
2026-08-27 15:40   ` Amit Machhiwal
2026-08-27 13:29 ` [PATCH v3 29/37] target/ppc: Move system call and rfi " Chinmay Rath
2026-08-27 16:00   ` Amit Machhiwal
2026-08-28  4:30     ` Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 30/37] target/ppc: Replace PPC2_VSX207 flag with PPC2_ISA207 Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 31/37] target/ppc: Use PPC2_ISA207 instead of PPC2_BCTAR_ISA207 Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 32/37] target/ppc: Use PPC2_ISA207 instead of PPC2_LSQ_ISA207 Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 33/37] target/ppc: Use PPC2_ISA207 instead of PPC2_ALTIVEC_207 Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 34/37] target/ppc: Use PPC2_ISA207 instead of PPC2_ISA207S Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 35/37] target/ppc: Reorder PPC2 flags Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 36/37] target/ppc: Add ICBT support for ISA version 2.07 Chinmay Rath
2026-08-27 13:29 ` [PATCH v3 37/37] target/ppc: Add self as maintainer for PowerPC TCG CPUs Chinmay Rath
2026-08-27 13:37 ` [PATCH v3 00/37] target/ppc: PPC TCG Improvements (decodetree migrations + ISA 2.07 flag updates) Chinmay Rath
2026-08-28  5:23 ` Aniket Sahu

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=20260827195658.90577edc-2c-amachhiw@linux.ibm.com \
    --to=amachhiw@linux.ibm.com \
    --cc=aboorvad@linux.ibm.com \
    --cc=harshpb@linux.ibm.com \
    --cc=milesg@linux.ibm.com \
    --cc=mkchauras@gmail.com \
    --cc=nikhilks@linux.ibm.com \
    --cc=npiggin@gmail.com \
    --cc=ojaswin@linux.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=rathc@linux.ibm.com \
    --cc=richard.henderson@linaro.org \
    --cc=shivangu@linux.ibm.com \
    --cc=shivani@linux.ibm.com \
    --cc=tshah@linux.ibm.com \
    --cc=uverma@linux.ibm.com \
    --cc=vishalc@linux.ibm.com \
    /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: link
Be 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.