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 v2 02/37] target/ppc: Migrate atomic loads to decodetree
Date: Wed, 26 Aug 2026 14:50:19 +0530 [thread overview]
Message-ID: <20260826140945.286298f2-fa-amachhiw@linux.ibm.com> (raw)
In-Reply-To: <20260826050923.74756-3-rathc@linux.ibm.com>
On 2026/08/26 10:38 AM, 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 | 124 +++++++++++++++++++--------------------
> 2 files changed, 69 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..cc9287dcc5 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,68 @@ 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);
The old GEN_HANDLER_E used PPC2_LSQ_ISA207, but the new code uses
PPC2_ISA207S . In the current QEMU CPU model set this makes no practical
difference — every CPU that sets PPC2_ISA207S also sets PPC2_LSQ_ISA207.
However, PPC2_LSQ_ISA207 is the precise flag for this feature and keeps
lqarx symmetric with its companion stqcx_ (line 5870) which correctly
continues to use PPC2_LSQ_ISA207. Please use REQUIRE_INSNS_FLAGS2(ctx,
LSQ_ISA207) for consistency and to guard against future CPU models that
may set these flags independently
> +#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);
> +
> + tcg_gen_st_i64(cpu_gpr[a->rt],
> + tcg_env, offsetof(CPUPPCState, reserve_val));
All these multi-line calls can be collapsed to single lines — they are
within 80 characters respectively and fit within the 80-column limit.
The only exception is tcg_gen_st_i64(..., reserve_val2) at 85 chars,
which legitimately needs wrapping. The unnecessary line splits add
visual noise without any readability benefit.
> + 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 +5858,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 +5866,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
>
next prev parent reply other threads:[~2026-08-26 9:21 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-26 5:08 [PATCH v2 00/37] target/ppc: PPC TCG Improvements (decodetree migrations + ISA 2.07 flag updates) Chinmay Rath
2026-08-26 5:08 ` [PATCH v2 01/37] target/ppc: Migrate extswsli to decodetree Chinmay Rath
2026-08-26 7:33 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 02/37] target/ppc: Migrate atomic loads " Chinmay Rath
2026-08-26 9:20 ` Amit Machhiwal [this message]
2026-08-26 12:28 ` Chinmay Rath
2026-08-26 12:30 ` Chinmay Rath
2026-08-26 5:08 ` [PATCH v2 03/37] target/ppc: Convert cache instructions " Chinmay Rath
2026-08-26 10:20 ` Amit Machhiwal
2026-08-26 13:09 ` Chinmay Rath
2026-08-26 13:17 ` Amit Machhiwal
2026-08-27 9:13 ` Chinmay Rath
2026-08-27 8:37 ` Chinmay Rath
2026-08-26 5:08 ` [PATCH v2 04/37] target/ppc: Move vector merge " Chinmay Rath
2026-08-26 10:57 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 05/37] target/ppc: Move vector pack " Chinmay Rath
2026-08-26 11:04 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 06/37] target/ppc: Move st{b, h, w, d, q}cx " Chinmay Rath
2026-08-26 11:18 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 07/37] target/ppc: convert slw, srw instruction via decode spec Chinmay Rath
2026-08-26 11:28 ` Amit Machhiwal
2026-08-26 11:30 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 08/37] target/ppc: convert sraw[i] " Chinmay Rath
2026-08-26 11:41 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 09/37] target/ppc: Convert mcrf to decode tree Chinmay Rath
2026-08-26 11:52 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 10/37] target/ppc: Move fixed-point Shift insns to decodetree Chinmay Rath
2026-08-26 5:08 ` [PATCH v2 11/37] target/ppc: Move fixed-point byte-reversal store " Chinmay Rath
2026-08-26 5:08 ` [PATCH v2 12/37] target/ppc: Move GPR atomic load/store instructions " Chinmay Rath
2026-08-26 12:05 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 13/37] target/ppc: Move isync instruction " Chinmay Rath
2026-08-26 12:20 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 14/37] target/ppc: Convert b{a, l, la} to decode tree Chinmay Rath
2026-08-26 12:24 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 15/37] target/ppc: move various conditional branch insns to decodetree Chinmay Rath
2026-08-26 12:38 ` Amit Machhiwal
2026-08-26 12:45 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 16/37] target/ppc: Fix TRANS* macro variadic arguments handling Chinmay Rath
2026-08-26 12:50 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 17/37] target/ppc: Move wait instruction to decodetree Chinmay Rath
2026-08-26 13:12 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 18/37] target/ppc: Move sleep & friends " Chinmay Rath
2026-08-26 13:26 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 19/37] target/ppc: Refactor sleep and its variants to use a common helper Chinmay Rath
2026-08-26 13:38 ` Amit Machhiwal
2026-08-26 14:30 ` Miles Glenn
2026-08-26 5:08 ` [PATCH v2 20/37] target/ppc: Move Condition Register access instructions to decodetree Chinmay Rath
2026-08-26 14:24 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 21/37] target/ppc: Move Condition Register logical " Chinmay Rath
2026-08-26 14:43 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 22/37] target/ppc: make do_ea_calc_ra available for 32 bit builds Chinmay Rath
2026-08-26 14:48 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 23/37] target/ppc: Move Fixed-Point Load/Store String instructions to decodetree Chinmay Rath
2026-08-26 15:19 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 24/37] target/ppc: Move VMX integer arithmetic and BCD " Chinmay Rath
2026-08-26 15:30 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 25/37] target/ppc: Move rlwimi, rlwinm " Chinmay Rath
2026-08-26 15:41 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 26/37] target/ppc: Move lmw, stmw " Chinmay Rath
2026-08-26 15:44 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 27/37] target/ppc: Move mfmsr, mtmsr[d] " Chinmay Rath
2026-08-26 15:49 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 28/37] target/ppc: Move byte-reverse " Chinmay Rath
2026-08-26 15:54 ` Amit Machhiwal
2026-08-27 10:52 ` Chinmay Rath
2026-08-26 5:08 ` [PATCH v2 29/37] target/ppc: Move system call and rfi " Chinmay Rath
2026-08-26 16:54 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 30/37] target/ppc: Replace PPC2_VSX207 flag with PPC2_ISA207 Chinmay Rath
2026-08-26 16:56 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 31/37] target/ppc: Use PPC2_ISA207 instead of PPC2_BCTAR_ISA207 Chinmay Rath
2026-08-26 16:58 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 32/37] target/ppc: Use PPC2_ISA207 instead of PPC2_LSQ_ISA207 Chinmay Rath
2026-08-26 17:01 ` Amit Machhiwal
2026-08-26 5:08 ` [PATCH v2 33/37] target/ppc: Use PPC2_ISA207 instead of PPC2_ALTIVEC_207 Chinmay Rath
2026-08-26 17:23 ` Amit Machhiwal
2026-08-26 5:09 ` [PATCH v2 34/37] target/ppc: Use PPC2_ISA207 instead of PPC2_ISA207S Chinmay Rath
2026-08-26 5:09 ` [PATCH v2 35/37] target/ppc: Reorder PPC2 flags Chinmay Rath
2026-08-26 5:09 ` [PATCH v2 36/37] target/ppc: Add ICBT support for ISA version 2.07 Chinmay Rath
2026-08-26 5:09 ` [PATCH v2 37/37] target/ppc: Add self as maintainer for PowerPC TCG CPUs Chinmay Rath
2026-08-26 5:41 ` Amit Machhiwal
2026-08-26 6:25 ` Gautam Menghani
2026-08-26 9:37 ` Aditya Gupta
2026-08-27 9:50 ` [PATCH v2 00/37] target/ppc: PPC TCG Improvements (decodetree migrations + ISA 2.07 flag updates) 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=20260826140945.286298f2-fa-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.