On 2026/08/26 10:38 AM, Chinmay Rath wrote: > From: Aboorva Devarajan <[email protected]> > > Move below instructions to decodetree specification: > > vpkuhum, vpkuwum, vpkuhus, vpkuwus : VX-form (PPC_ALTIVEC) > vpkshus, vpkswus, vpkshss, vpkswss : VX-form (PPC_ALTIVEC) > vpkpx : VX-form (PPC_ALTIVEC) > vpkudum, vpkudus, vpksdus, vpksdss : VX-form (PPC2_ALTIVEC_207) > > The legacy GEN_VXFORM_ENV/GEN_VXFORM macros that generated gen_vpk*() > functions reading register fields from ctx->opcode are replaced by new > do_vpk_env()/do_vpk() helpers in vmx-impl.c.inc that use the > pre-extracted decodetree argument fields (a->vrt, a->vra, a->vrb) > directly. The existing gen_helper_vpk*() implementations in > int_helper.c are reused without changes. > > The changes were verified by validating that the tcg ops generated by > those instructions remain the same, which were captured with the '-d > in_asm,op' option before and after the patch. > > Signed-off-by: Aboorva Devarajan <[email protected]> > Reviewed-by: Nikhil Kumar Singh <[email protected]> > Reviewed-by: Glenn Miles <[email protected]> > Signed-off-by: Chinmay Rath <[email protected]> > --- > target/ppc/helper.h | 26 +++++++-------- > target/ppc/insn32.decode | 16 +++++++++ > target/ppc/int_helper.c | 28 ++++++++-------- > target/ppc/translate/vmx-impl.c.inc | 51 +++++++++++++++++++++-------- > target/ppc/translate/vmx-ops.c.inc | 13 -------- > 5 files changed, 81 insertions(+), 53 deletions(-)
Reviewed-by: Amit Machhiwal <[email protected]> > > diff --git a/target/ppc/helper.h b/target/ppc/helper.h > index 6db917935c..6df3de6516 100644 > --- a/target/ppc/helper.h > +++ b/target/ppc/helper.h > @@ -249,19 +249,19 @@ DEF_HELPER_FLAGS_4(VMSUMUBM, TCG_CALL_NO_RWG, void, > avr, avr, avr, avr) > DEF_HELPER_FLAGS_4(VMSUMMBM, TCG_CALL_NO_RWG, void, avr, avr, avr, avr) > DEF_HELPER_FLAGS_4(VPERM, TCG_CALL_NO_RWG, void, avr, avr, avr, avr) > DEF_HELPER_FLAGS_4(VPERMR, TCG_CALL_NO_RWG, void, avr, avr, avr, avr) > -DEF_HELPER_4(vpkshss, void, env, avr, avr, avr) > -DEF_HELPER_4(vpkshus, void, env, avr, avr, avr) > -DEF_HELPER_4(vpkswss, void, env, avr, avr, avr) > -DEF_HELPER_4(vpkswus, void, env, avr, avr, avr) > -DEF_HELPER_4(vpksdss, void, env, avr, avr, avr) > -DEF_HELPER_4(vpksdus, void, env, avr, avr, avr) > -DEF_HELPER_4(vpkuhus, void, env, avr, avr, avr) > -DEF_HELPER_4(vpkuwus, void, env, avr, avr, avr) > -DEF_HELPER_4(vpkudus, void, env, avr, avr, avr) > -DEF_HELPER_4(vpkuhum, void, env, avr, avr, avr) > -DEF_HELPER_4(vpkuwum, void, env, avr, avr, avr) > -DEF_HELPER_4(vpkudum, void, env, avr, avr, avr) > -DEF_HELPER_FLAGS_3(vpkpx, TCG_CALL_NO_RWG, void, avr, avr, avr) > +DEF_HELPER_4(VPKSHSS, void, env, avr, avr, avr) > +DEF_HELPER_4(VPKSHUS, void, env, avr, avr, avr) > +DEF_HELPER_4(VPKSWSS, void, env, avr, avr, avr) > +DEF_HELPER_4(VPKSWUS, void, env, avr, avr, avr) > +DEF_HELPER_4(VPKSDSS, void, env, avr, avr, avr) > +DEF_HELPER_4(VPKSDUS, void, env, avr, avr, avr) > +DEF_HELPER_4(VPKUHUS, void, env, avr, avr, avr) > +DEF_HELPER_4(VPKUWUS, void, env, avr, avr, avr) > +DEF_HELPER_4(VPKUDUS, void, env, avr, avr, avr) > +DEF_HELPER_4(VPKUHUM, void, env, avr, avr, avr) > +DEF_HELPER_4(VPKUWUM, void, env, avr, avr, avr) > +DEF_HELPER_4(VPKUDUM, void, env, avr, avr, avr) > +DEF_HELPER_FLAGS_3(VPKPX, TCG_CALL_NO_RWG, void, avr, avr, avr) > DEF_HELPER_5(VMHADDSHS, void, env, avr, avr, avr, avr) > DEF_HELPER_5(VMHRADDSHS, void, env, avr, avr, avr, avr) > DEF_HELPER_FLAGS_4(VMSUMUHM, TCG_CALL_NO_RWG, void, avr, avr, avr, avr) > diff --git a/target/ppc/insn32.decode b/target/ppc/insn32.decode > index 8aca8a00c0..c51efbfd33 100644 > --- a/target/ppc/insn32.decode > +++ b/target/ppc/insn32.decode > @@ -1054,6 +1054,22 @@ VSTRIHR 000100 ..... 00011 ..... . 0000001101 > @VX_tb_rc > VCLRLB 000100 ..... ..... ..... 00110001101 @VX > VCLRRB 000100 ..... ..... ..... 00111001101 @VX > > +## Vector Pack Instructions > + > +VPKUHUM 000100 ..... ..... ..... 0000000111 0 @VX > +VPKUWUM 000100 ..... ..... ..... 0000100111 0 @VX > +VPKUDUM 000100 ..... ..... ..... 1000100111 0 @VX > +VPKUHUS 000100 ..... ..... ..... 0001000111 0 @VX > +VPKUWUS 000100 ..... ..... ..... 0001100111 0 @VX > +VPKUDUS 000100 ..... ..... ..... 1001100111 0 @VX > +VPKSHUS 000100 ..... ..... ..... 0010000111 0 @VX > +VPKSWUS 000100 ..... ..... ..... 0010100111 0 @VX > +VPKSDUS 000100 ..... ..... ..... 1010100111 0 @VX > +VPKSHSS 000100 ..... ..... ..... 0011000111 0 @VX > +VPKSWSS 000100 ..... ..... ..... 0011100111 0 @VX > +VPKSDSS 000100 ..... ..... ..... 1011100111 0 @VX > +VPKPX 000100 ..... ..... ..... 0110000111 0 @VX > + > # VSX Load/Store Instructions > > LXSD 111001 ..... ..... .............. 10 @DS > diff --git a/target/ppc/int_helper.c b/target/ppc/int_helper.c > index a3adf746bd..dc55ccadf7 100644 > --- a/target/ppc/int_helper.c > +++ b/target/ppc/int_helper.c > @@ -1465,7 +1465,7 @@ void helper_VPMSUMD(ppc_avr_t *r, ppc_avr_t *a, > ppc_avr_t *b) > #else > #define PKBIG 0 > #endif > -void helper_vpkpx(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) > +void helper_VPKPX(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) > { > int i, j; > ppc_avr_t result; > @@ -1488,7 +1488,7 @@ void helper_vpkpx(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t > *b) > } > > #define VPK(suffix, from, to, cvt, dosat) \ > - void helper_vpk##suffix(CPUPPCState *env, ppc_avr_t *r, \ > + void helper_VPK##suffix(CPUPPCState *env, ppc_avr_t *r, \ > ppc_avr_t *a, ppc_avr_t *b) \ > { \ > int i; \ > @@ -1507,18 +1507,18 @@ void helper_vpkpx(ppc_avr_t *r, ppc_avr_t *a, > ppc_avr_t *b) > } \ > } > #define I(x, y) (x) > -VPK(shss, s16, s8, cvtshsb, 1) > -VPK(shus, s16, u8, cvtshub, 1) > -VPK(swss, s32, s16, cvtswsh, 1) > -VPK(swus, s32, u16, cvtswuh, 1) > -VPK(sdss, s64, s32, cvtsdsw, 1) > -VPK(sdus, s64, u32, cvtsduw, 1) > -VPK(uhus, u16, u8, cvtuhub, 1) > -VPK(uwus, u32, u16, cvtuwuh, 1) > -VPK(udus, u64, u32, cvtuduw, 1) > -VPK(uhum, u16, u8, I, 0) > -VPK(uwum, u32, u16, I, 0) > -VPK(udum, u64, u32, I, 0) > +VPK(SHSS, s16, s8, cvtshsb, 1) > +VPK(SHUS, s16, u8, cvtshub, 1) > +VPK(SWSS, s32, s16, cvtswsh, 1) > +VPK(SWUS, s32, u16, cvtswuh, 1) > +VPK(SDSS, s64, s32, cvtsdsw, 1) > +VPK(SDUS, s64, u32, cvtsduw, 1) > +VPK(UHUS, u16, u8, cvtuhub, 1) > +VPK(UWUS, u32, u16, cvtuwuh, 1) > +VPK(UDUS, u64, u32, cvtuduw, 1) > +VPK(UHUM, u16, u8, I, 0) > +VPK(UWUM, u32, u16, I, 0) > +VPK(UDUM, u64, u32, I, 0) > #undef I > #undef VPK > #undef PKBIG > diff --git a/target/ppc/translate/vmx-impl.c.inc > b/target/ppc/translate/vmx-impl.c.inc > index 00b359f031..65230f3461 100644 > --- a/target/ppc/translate/vmx-impl.c.inc > +++ b/target/ppc/translate/vmx-impl.c.inc > @@ -1070,19 +1070,44 @@ TRANS(VRLQMI, do_vector_rotl_quad, false, true) > > GEN_VXFORM_TRANS(vsl, 2, 7); > GEN_VXFORM_TRANS(vsr, 2, 11); > -GEN_VXFORM_ENV(vpkuhum, 7, 0); > -GEN_VXFORM_ENV(vpkuwum, 7, 1); > -GEN_VXFORM_ENV(vpkudum, 7, 17); > -GEN_VXFORM_ENV(vpkuhus, 7, 2); > -GEN_VXFORM_ENV(vpkuwus, 7, 3); > -GEN_VXFORM_ENV(vpkudus, 7, 19); > -GEN_VXFORM_ENV(vpkshus, 7, 4); > -GEN_VXFORM_ENV(vpkswus, 7, 5); > -GEN_VXFORM_ENV(vpksdus, 7, 21); > -GEN_VXFORM_ENV(vpkshss, 7, 6); > -GEN_VXFORM_ENV(vpkswss, 7, 7); > -GEN_VXFORM_ENV(vpksdss, 7, 23); > -GEN_VXFORM(vpkpx, 7, 12); > +static bool do_vpk_env(DisasContext *ctx, arg_VX *a, > + void (*gen_helper)(TCGv_ptr, TCGv_ptr, > + TCGv_ptr, TCGv_ptr)) > +{ > + TCGv_ptr ra, rb, rd; > + REQUIRE_VECTOR(ctx); > + ra = gen_avr_ptr(a->vra); > + rb = gen_avr_ptr(a->vrb); > + rd = gen_avr_ptr(a->vrt); > + gen_helper(tcg_env, rd, ra, rb); > + return true; > +} > + > +static bool do_vpk(DisasContext *ctx, arg_VX *a, > + void (*gen_helper)(TCGv_ptr, TCGv_ptr, TCGv_ptr)) > +{ > + TCGv_ptr ra, rb, rd; > + REQUIRE_VECTOR(ctx); > + ra = gen_avr_ptr(a->vra); > + rb = gen_avr_ptr(a->vrb); > + rd = gen_avr_ptr(a->vrt); > + gen_helper(rd, ra, rb); > + return true; > +} > + > +TRANS_FLAGS(ALTIVEC, VPKUHUM, do_vpk_env, gen_helper_VPKUHUM) > +TRANS_FLAGS(ALTIVEC, VPKUWUM, do_vpk_env, gen_helper_VPKUWUM) > +TRANS_FLAGS2(ALTIVEC_207, VPKUDUM, do_vpk_env, gen_helper_VPKUDUM) > +TRANS_FLAGS(ALTIVEC, VPKUHUS, do_vpk_env, gen_helper_VPKUHUS) > +TRANS_FLAGS(ALTIVEC, VPKUWUS, do_vpk_env, gen_helper_VPKUWUS) > +TRANS_FLAGS2(ALTIVEC_207, VPKUDUS, do_vpk_env, gen_helper_VPKUDUS) > +TRANS_FLAGS(ALTIVEC, VPKSHUS, do_vpk_env, gen_helper_VPKSHUS) > +TRANS_FLAGS(ALTIVEC, VPKSWUS, do_vpk_env, gen_helper_VPKSWUS) > +TRANS_FLAGS2(ALTIVEC_207, VPKSDUS, do_vpk_env, gen_helper_VPKSDUS) > +TRANS_FLAGS(ALTIVEC, VPKSHSS, do_vpk_env, gen_helper_VPKSHSS) > +TRANS_FLAGS(ALTIVEC, VPKSWSS, do_vpk_env, gen_helper_VPKSWSS) > +TRANS_FLAGS2(ALTIVEC_207, VPKSDSS, do_vpk_env, gen_helper_VPKSDSS) > +TRANS_FLAGS(ALTIVEC, VPKPX, do_vpk, gen_helper_VPKPX) > GEN_VXFORM_ENV(vsum4ubs, 4, 24); > GEN_VXFORM_ENV(vsum4sbs, 4, 28); > GEN_VXFORM_ENV(vsum4shs, 4, 25); > diff --git a/target/ppc/translate/vmx-ops.c.inc > b/target/ppc/translate/vmx-ops.c.inc > index b8f77d3d2c..2820976c0f 100644 > --- a/target/ppc/translate/vmx-ops.c.inc > +++ b/target/ppc/translate/vmx-ops.c.inc > @@ -59,19 +59,6 @@ GEN_VXFORM_300(bcdtrunc, 0, 20), > GEN_VXFORM_300(bcdutrunc, 0, 21), > GEN_VXFORM(vsl, 2, 7), > GEN_VXFORM(vsr, 2, 11), > -GEN_VXFORM(vpkuhum, 7, 0), > -GEN_VXFORM(vpkuwum, 7, 1), > -GEN_VXFORM_207(vpkudum, 7, 17), > -GEN_VXFORM(vpkuhus, 7, 2), > -GEN_VXFORM(vpkuwus, 7, 3), > -GEN_VXFORM_207(vpkudus, 7, 19), > -GEN_VXFORM(vpkshus, 7, 4), > -GEN_VXFORM(vpkswus, 7, 5), > -GEN_VXFORM_207(vpksdus, 7, 21), > -GEN_VXFORM(vpkshss, 7, 6), > -GEN_VXFORM(vpkswss, 7, 7), > -GEN_VXFORM_207(vpksdss, 7, 23), > -GEN_VXFORM(vpkpx, 7, 12), > GEN_VXFORM(vsum4ubs, 4, 24), > GEN_VXFORM(vsum4sbs, 4, 28), > GEN_VXFORM(vsum4shs, 4, 25), > -- > 2.55.0 >
