On 2026/08/26 10:38 AM, Chinmay Rath wrote: > From: Aboorva Devarajan <[email protected]> > > Move below instructions to decodetree specification: > > vmrg{hb, hh, hw, lb, lh, lw} : VX-form > > The individual gen_vmrg* functions generated by GEN_VXFORM are > replaced by a shared do_vmrg() helper dispatching to the existing > gen_helper_VMRG* TCG helpers via the TRANS_FLAGS() macro, which > also handles the ALTIVEC facility check. > > 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' flag. > > 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 | 12 ++++++------ > target/ppc/insn32.decode | 9 +++++++++ > target/ppc/int_helper.c | 12 ++++++------ > target/ppc/translate/vmx-impl.c.inc | 25 +++++++++++++++++++------ > target/ppc/translate/vmx-ops.c.inc | 6 ------ > 5 files changed, 40 insertions(+), 24 deletions(-)
Reviewed-by: Amit Machhiwal <[email protected]> > > diff --git a/target/ppc/helper.h b/target/ppc/helper.h > index 46ad78d1d4..6db917935c 100644 > --- a/target/ppc/helper.h > +++ b/target/ppc/helper.h > @@ -173,12 +173,12 @@ DEF_HELPER_4(vcmpeqfp_dot, void, env, avr, avr, avr) > DEF_HELPER_4(vcmpgefp_dot, void, env, avr, avr, avr) > DEF_HELPER_4(vcmpgtfp_dot, void, env, avr, avr, avr) > DEF_HELPER_4(vcmpbfp_dot, void, env, avr, avr, avr) > -DEF_HELPER_FLAGS_3(vmrglb, TCG_CALL_NO_RWG, void, avr, avr, avr) > -DEF_HELPER_FLAGS_3(vmrglh, TCG_CALL_NO_RWG, void, avr, avr, avr) > -DEF_HELPER_FLAGS_3(vmrglw, TCG_CALL_NO_RWG, void, avr, avr, avr) > -DEF_HELPER_FLAGS_3(vmrghb, TCG_CALL_NO_RWG, void, avr, avr, avr) > -DEF_HELPER_FLAGS_3(vmrghh, TCG_CALL_NO_RWG, void, avr, avr, avr) > -DEF_HELPER_FLAGS_3(vmrghw, TCG_CALL_NO_RWG, void, avr, avr, avr) > +DEF_HELPER_FLAGS_3(VMRGLB, TCG_CALL_NO_RWG, void, avr, avr, avr) > +DEF_HELPER_FLAGS_3(VMRGLH, TCG_CALL_NO_RWG, void, avr, avr, avr) > +DEF_HELPER_FLAGS_3(VMRGLW, TCG_CALL_NO_RWG, void, avr, avr, avr) > +DEF_HELPER_FLAGS_3(VMRGHB, TCG_CALL_NO_RWG, void, avr, avr, avr) > +DEF_HELPER_FLAGS_3(VMRGHH, TCG_CALL_NO_RWG, void, avr, avr, avr) > +DEF_HELPER_FLAGS_3(VMRGHW, TCG_CALL_NO_RWG, void, avr, avr, avr) > DEF_HELPER_FLAGS_3(VMULESB, TCG_CALL_NO_RWG, void, avr, avr, avr) > DEF_HELPER_FLAGS_3(VMULESH, TCG_CALL_NO_RWG, void, avr, avr, avr) > DEF_HELPER_FLAGS_3(VMULESW, TCG_CALL_NO_RWG, void, avr, avr, avr) > diff --git a/target/ppc/insn32.decode b/target/ppc/insn32.decode > index 6b1cf9a0a9..8aca8a00c0 100644 > --- a/target/ppc/insn32.decode > +++ b/target/ppc/insn32.decode > @@ -795,6 +795,15 @@ VNOR 000100 ..... ..... ..... 10100000100 > @VX > VXOR 000100 ..... ..... ..... 10011000100 @VX > VEQV 000100 ..... ..... ..... 11010000100 @VX > > +## Vector Merge Instructions > + > +VMRGHB 000100 ..... ..... ..... 00000001100 @VX > +VMRGHH 000100 ..... ..... ..... 00001001100 @VX > +VMRGHW 000100 ..... ..... ..... 00010001100 @VX > +VMRGLB 000100 ..... ..... ..... 00100001100 @VX > +VMRGLH 000100 ..... ..... ..... 00101001100 @VX > +VMRGLW 000100 ..... ..... ..... 00110001100 @VX > + > ## Vector Integer Average Instructions > > VAVGSB 000100 ..... ..... ..... 10100000010 @VX > diff --git a/target/ppc/int_helper.c b/target/ppc/int_helper.c > index ef4b2e75d6..a3adf746bd 100644 > --- a/target/ppc/int_helper.c > +++ b/target/ppc/int_helper.c > @@ -950,7 +950,7 @@ void helper_VMLADDUHM(ppc_avr_t *r, ppc_avr_t *a, > ppc_avr_t *b, ppc_avr_t *c, > } > > #define VMRG_DO(name, element, access, ofs) > \ > - void helper_v##name(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) > \ > + void helper_V##name(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) > \ > { > \ > ppc_avr_t result; > \ > int i, half = ARRAY_SIZE(r->element) / 2; > \ > @@ -963,11 +963,11 @@ void helper_VMLADDUHM(ppc_avr_t *r, ppc_avr_t *a, > ppc_avr_t *b, ppc_avr_t *c, > } > > #define VMRG(suffix, element, access) \ > - VMRG_DO(mrgl##suffix, element, access, half) \ > - VMRG_DO(mrgh##suffix, element, access, 0) > -VMRG(b, u8, VsrB) > -VMRG(h, u16, VsrH) > -VMRG(w, u32, VsrW) > + VMRG_DO(MRGL##suffix, element, access, half) \ > + VMRG_DO(MRGH##suffix, element, access, 0) > +VMRG(B, u8, VsrB) > +VMRG(H, u16, VsrH) > +VMRG(W, u32, VsrW) > #undef VMRG_DO > #undef VMRG > > diff --git a/target/ppc/translate/vmx-impl.c.inc > b/target/ppc/translate/vmx-impl.c.inc > index 92d6e8c603..00b359f031 100644 > --- a/target/ppc/translate/vmx-impl.c.inc > +++ b/target/ppc/translate/vmx-impl.c.inc > @@ -350,12 +350,25 @@ GEN_VXFORM_V(vsububm, MO_8, tcg_gen_gvec_sub, 0, 16); > GEN_VXFORM_V(vsubuhm, MO_16, tcg_gen_gvec_sub, 0, 17); > GEN_VXFORM_V(vsubuwm, MO_32, tcg_gen_gvec_sub, 0, 18); > GEN_VXFORM_V(vsubudm, MO_64, tcg_gen_gvec_sub, 0, 19); > -GEN_VXFORM(vmrghb, 6, 0); > -GEN_VXFORM(vmrghh, 6, 1); > -GEN_VXFORM(vmrghw, 6, 2); > -GEN_VXFORM(vmrglb, 6, 4); > -GEN_VXFORM(vmrglh, 6, 5); > -GEN_VXFORM(vmrglw, 6, 6); > + > +static bool do_vmrg(DisasContext *ctx, arg_VX *a, > + void (*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); > + helper(rd, ra, rb); > + return true; > +} > + > +TRANS_FLAGS(ALTIVEC, VMRGHB, do_vmrg, gen_helper_VMRGHB); > +TRANS_FLAGS(ALTIVEC, VMRGHH, do_vmrg, gen_helper_VMRGHH); > +TRANS_FLAGS(ALTIVEC, VMRGHW, do_vmrg, gen_helper_VMRGHW); > +TRANS_FLAGS(ALTIVEC, VMRGLB, do_vmrg, gen_helper_VMRGLB); > +TRANS_FLAGS(ALTIVEC, VMRGLH, do_vmrg, gen_helper_VMRGLH); > +TRANS_FLAGS(ALTIVEC, VMRGLW, do_vmrg, gen_helper_VMRGLW); > > static void trans_vmrgew(DisasContext *ctx) > { > diff --git a/target/ppc/translate/vmx-ops.c.inc > b/target/ppc/translate/vmx-ops.c.inc > index e28958a126..b8f77d3d2c 100644 > --- a/target/ppc/translate/vmx-ops.c.inc > +++ b/target/ppc/translate/vmx-ops.c.inc > @@ -33,12 +33,6 @@ GEN_VXFORM_DUAL(vsubuhm, bcdsub, 0, 17, PPC_ALTIVEC, > PPC_NONE), > GEN_VXFORM_DUAL(vsubuwm, bcdus, 0, 18, PPC_ALTIVEC, PPC2_ISA300), > GEN_VXFORM_DUAL(vsubudm, bcds, 0, 19, PPC2_ALTIVEC_207, PPC2_ISA300), > GEN_VXFORM_300(bcds, 0, 27), > -GEN_VXFORM(vmrghb, 6, 0), > -GEN_VXFORM(vmrghh, 6, 1), > -GEN_VXFORM(vmrghw, 6, 2), > -GEN_VXFORM(vmrglb, 6, 4), > -GEN_VXFORM(vmrglh, 6, 5), > -GEN_VXFORM(vmrglw, 6, 6), > GEN_VXFORM_300(vextublx, 6, 24), > GEN_VXFORM_300(vextuhlx, 6, 25), > GEN_VXFORM_DUAL(vmrgow, vextuwlx, 6, 26, PPC_NONE, PPC2_ALTIVEC_207), > -- > 2.55.0 >
