On Wed, 2025-09-17 at 18:43 +0200, Thomas Huth wrote: > On 17/09/2025 18.07, BALATON Zoltan wrote: > > On Wed, 17 Sep 2025, Miles Glenn wrote: > > > On Wed, 2025-09-17 at 08:20 +0200, Thomas Huth wrote: > > > > On 17/09/2025 06.57, Harsh Prateek Bora wrote: > > > > > On 9/12/25 22:17, Glenn Miles wrote: > > > > > > Adds the following instructions exclusively for > > > > > > IBM PPE42 processors: > > > > > > > > > > > > LSKU > > > > > > LCXU > > > > > > STSKU > > > > > > STCXU > > > > > > LVD > > > > > > LVDU > > > > > > LVDX > > > > > > STVD > > > > > > STVDU > > > > > > STVDX > > > > > > SLVD > > > > > > SRVD > > > > > > CMPWBC > > > > > > CMPLWBC > > > > > > CMPWIBC > > > > > > BNBWI > > > > > > BNBW > > > > > > CLRBWIBC > > > > > > CLRWBC > > > > > > DCBQ > > > > > > RLDICL > > > > > > RLDICR > > > > > > RLDIMI > > > > > > > > > > > > A PPE42 GCC compiler is available here: > > > > > > https://github.com/open-power/ppe42-gcc > > > > > > > > > > > > For more information on the PPE42 processors please visit: > > > > > > https://wiki.raptorcs.com/w/images/a/a3/PPE_42X_Core_Users_Manual.pdf > > > > > > > > > > > > Signed-off-by: Glenn Miles <[email protected]> > > > > > > --- > > > > > > Changes from v3: > > > > > > - Removed copy of CHECK_VDR > > > > > > - Refactored ld/st instructions > > > > > > > > > > > > target/ppc/insn32.decode | 66 ++- > > > > > > target/ppc/translate.c | 29 +- > > > > > > target/ppc/translate/ppe-impl.c.inc | 665 > > > > > > ++++++++++++++++++++++++++++ > > > > > > 3 files changed, 750 insertions(+), 10 deletions(-) > > > > > > create mode 100644 target/ppc/translate/ppe-impl.c.inc > > > > > > > > > > > > > > > > <snip> > > > > > > > > > > > diff --git a/target/ppc/translate/ppe-impl.c.inc > > > > > > b/target/ppc/translate/ > > > > > > ppe-impl.c.inc > > > > > > new file mode 100644 > > > > > > index 0000000000..792103d7c2 > > > > > > --- /dev/null > > > > > > +++ b/target/ppc/translate/ppe-impl.c.inc > > > > > > @@ -0,0 +1,665 @@ > > > > > > +/* > > > > > > + * IBM PPE Instructions > > > > > > + * > > > > > > + * Copyright (c) 2025, IBM Corporation. > > > > > > + * > > > > > > + * SPDX-License-Identifier: GPL-2.0-or-later > > > > > > + */ > > > > > > + > > > > > > + > > > > > > +#if !defined(TARGET_PPC64) > > > > > > +static bool vdr_is_valid(uint32_t vdr) > > > > > > +{ > > > > > > + const uint32_t valid_bitmap = 0xf00003ff; > > > > > > + return !!((1ul << (vdr & 0x1f)) & valid_bitmap); > > > > > > +} > > > > > > + > > > > > > +static bool ppe_gpr_is_valid(uint32_t reg) > > > > > > +{ > > > > > > + const uint32_t valid_bitmap = 0xf00027ff; > > > > > > + return !!((1ul << (reg & 0x1f)) & valid_bitmap); > > > > > > +} > > > > > > +#endif > > > > > > + > > > > > > +#define CHECK_VDR(CTX, VDR) \ > > > > > > + do { \ > > > > > > + if (unlikely(!vdr_is_valid(VDR))) { \ > > > > > > + gen_invalid(CTX); \ > > > > > > + return true; \ > > > > > > + } \ > > > > > > + } while (0) > > > > > > + > > > > > > +#define CHECK_PPE_GPR(CTX, REG) \ > > > > > > + do { \ > > > > > > + if (unlikely(!ppe_gpr_is_valid(REG))) { \ > > > > > > + gen_invalid(CTX); \ > > > > > > + return true; \ > > > > > > + } \ > > > > > > + } while (0) > > > > > > + > > > > > > +#define VDR_PAIR_REG(VDR) (((VDR) + 1) & 0x1f) > > > > > > + > > > > > > +#define CHECK_PPE_LEVEL(CTX, LVL) \ > > > > > > + do { \ > > > > > > + if (unlikely(!((CTX)->insns_flags2 & (LVL)))) { \ > > > > > > + gen_invalid(CTX); \ > > > > > > + return true; \ > > > > > > + } \ > > > > > > + } while (0) > > > > > > + > > > > > > +static bool trans_LCXU(DisasContext *ctx, arg_LCXU *a) > > > > > > +{ > > > > > > +#if defined(TARGET_PPC64) > > > > > > + return false; > > > > > > +#else > > > > > > > > > > If we are building the PPE42 instructions only for !TARGET_PPC64, does > > > > > it still make it usable with qemu-system-ppc64? > > > > > > > > As explained in an earlier thread already, qemu-system-ppc64 is a > > > > superset > > > > of qemu-system-ppc. Thus the ppe42 stuff should work in qemu-system- > > > > ppc64, too. > > > > > > > > Thomas > > > > > > > > > > Ah, yes, I don't think I fully understood the ramifications of Thomas's > > > statements earlier. Looks like I'll need to scrub the code to ensure > > > that PPE42 can run even if TARGET_PPC64 is defined. > > > > > > Cedric, this requires me to change my response to your request to add > > > the check for TARGET_PPC64 inside the is_ppe() function. I will need > > > to leave that function as-is if we want PPE42 to be supported in both > > > targets. Will you be ok with that? > > > > Does it make sense to support it with !TARGET_PPC64 if its only use is in > > qemu-system-ppc64? Even if the CPU is 32-bit it has some 64-bit > > instructions > > IIUC so does that make it TARGET_PPC64 only? > > As long as the GPRs are 32 bit only (which is the case here, I assume), it's > a 32-bit PPC CPU, isn't it? So that certainly should not go into the ppc64 > binary only. > > Thomas >
I agree. While the PPE42 does support some 64 bit operations, it actually is using two 32 bit register pairs to accomplish the 64 bit operations. Also, the address space is a 32 bit space. Glenn
