@samitouri / QOSamiQemu / commits / b0a1cc8d83

target/ppc: Move vector merge instructions to decodetree

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 <aboorvad@linux.ibm.com> Reviewed-by: Nikhil Kumar Singh <nikhilks@linux.ibm.com> Reviewed-by: Glenn Miles <milesg@linux.ibm.com> Reviewed-by: Amit Machhiwal <amachhiw@linux.ibm.com> Signed-off-by: Chinmay Rath <rathc@linux.ibm.com> Tested-by: Aniket Sahu <asahu1x@linux.ibm.com> Link: https://lore.kernel.org/qemu-devel/20260827133010.278889-5-rathc@linux.ibm.com Signed-off-by: Harsh Prateek Bora <harshpb@linux.ibm.com>

Aboorva Devarajan committed Aug 27, 2026 at 18:59 UTC b0a1cc8d83c67a49496c97019f3008867184eae9
5 files changed +40 -24
target/ppc/helper.h
+6 -6
@@ -173,12 +173,12 @@ DEF_HELPER_4(vcmpeqfp_dot, void, env, avr, avr, avr)
173 DEF_HELPER_4(vcmpgefp_dot, void, env, avr, avr, avr)
174 DEF_HELPER_4(vcmpgtfp_dot, void, env, avr, avr, avr)
175 DEF_HELPER_4(vcmpbfp_dot, void, env, avr, avr, avr)
176 -DEF_HELPER_FLAGS_3(vmrglb, TCG_CALL_NO_RWG, void, avr, avr, avr)
177 -DEF_HELPER_FLAGS_3(vmrglh, TCG_CALL_NO_RWG, void, avr, avr, avr)
178 -DEF_HELPER_FLAGS_3(vmrglw, TCG_CALL_NO_RWG, void, avr, avr, avr)
179 -DEF_HELPER_FLAGS_3(vmrghb, TCG_CALL_NO_RWG, void, avr, avr, avr)
180 -DEF_HELPER_FLAGS_3(vmrghh, TCG_CALL_NO_RWG, void, avr, avr, avr)
181 -DEF_HELPER_FLAGS_3(vmrghw, TCG_CALL_NO_RWG, void, avr, avr, avr)
176 +DEF_HELPER_FLAGS_3(VMRGLB, TCG_CALL_NO_RWG, void, avr, avr, avr)
177 +DEF_HELPER_FLAGS_3(VMRGLH, TCG_CALL_NO_RWG, void, avr, avr, avr)
178 +DEF_HELPER_FLAGS_3(VMRGLW, TCG_CALL_NO_RWG, void, avr, avr, avr)
179 +DEF_HELPER_FLAGS_3(VMRGHB, TCG_CALL_NO_RWG, void, avr, avr, avr)
180 +DEF_HELPER_FLAGS_3(VMRGHH, TCG_CALL_NO_RWG, void, avr, avr, avr)
181 +DEF_HELPER_FLAGS_3(VMRGHW, TCG_CALL_NO_RWG, void, avr, avr, avr)
182 DEF_HELPER_FLAGS_3(VMULESB, TCG_CALL_NO_RWG, void, avr, avr, avr)
183 DEF_HELPER_FLAGS_3(VMULESH, TCG_CALL_NO_RWG, void, avr, avr, avr)
184 DEF_HELPER_FLAGS_3(VMULESW, TCG_CALL_NO_RWG, void, avr, avr, avr)
target/ppc/insn32.decode
+9
@@ -795,6 +795,15 @@ VNOR 000100 ..... ..... ..... 10100000100 @VX
795 VXOR 000100 ..... ..... ..... 10011000100 @VX
796 VEQV 000100 ..... ..... ..... 11010000100 @VX
797
798 +## Vector Merge Instructions
799 +
800 +VMRGHB 000100 ..... ..... ..... 00000001100 @VX
801 +VMRGHH 000100 ..... ..... ..... 00001001100 @VX
802 +VMRGHW 000100 ..... ..... ..... 00010001100 @VX
803 +VMRGLB 000100 ..... ..... ..... 00100001100 @VX
804 +VMRGLH 000100 ..... ..... ..... 00101001100 @VX
805 +VMRGLW 000100 ..... ..... ..... 00110001100 @VX
806 +
807 ## Vector Integer Average Instructions
808
809 VAVGSB 000100 ..... ..... ..... 10100000010 @VX
target/ppc/int_helper.c
+6 -6
@@ -950,7 +950,7 @@ void helper_VMLADDUHM(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c,
950 }
951
952 #define VMRG_DO(name, element, access, ofs) \
953 - void helper_v##name(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
953 + void helper_V##name(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
954 { \
955 ppc_avr_t result; \
956 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,
963 }
964
965 #define VMRG(suffix, element, access) \
966 - VMRG_DO(mrgl##suffix, element, access, half) \
967 - VMRG_DO(mrgh##suffix, element, access, 0)
968 -VMRG(b, u8, VsrB)
969 -VMRG(h, u16, VsrH)
970 -VMRG(w, u32, VsrW)
966 + VMRG_DO(MRGL##suffix, element, access, half) \
967 + VMRG_DO(MRGH##suffix, element, access, 0)
968 +VMRG(B, u8, VsrB)
969 +VMRG(H, u16, VsrH)
970 +VMRG(W, u32, VsrW)
971 #undef VMRG_DO
972 #undef VMRG
973
target/ppc/translate/vmx-impl.c.inc
+19 -6
@@ -350,12 +350,25 @@ GEN_VXFORM_V(vsububm, MO_8, tcg_gen_gvec_sub, 0, 16);
350 GEN_VXFORM_V(vsubuhm, MO_16, tcg_gen_gvec_sub, 0, 17);
351 GEN_VXFORM_V(vsubuwm, MO_32, tcg_gen_gvec_sub, 0, 18);
352 GEN_VXFORM_V(vsubudm, MO_64, tcg_gen_gvec_sub, 0, 19);
353 -GEN_VXFORM(vmrghb, 6, 0);
354 -GEN_VXFORM(vmrghh, 6, 1);
355 -GEN_VXFORM(vmrghw, 6, 2);
356 -GEN_VXFORM(vmrglb, 6, 4);
357 -GEN_VXFORM(vmrglh, 6, 5);
358 -GEN_VXFORM(vmrglw, 6, 6);
353 +
354 +static bool do_vmrg(DisasContext *ctx, arg_VX *a,
355 + void (*helper)(TCGv_ptr, TCGv_ptr, TCGv_ptr))
356 +{
357 + TCGv_ptr ra, rb, rd;
358 + REQUIRE_VECTOR(ctx);
359 + ra = gen_avr_ptr(a->vra);
360 + rb = gen_avr_ptr(a->vrb);
361 + rd = gen_avr_ptr(a->vrt);
362 + helper(rd, ra, rb);
363 + return true;
364 +}
365 +
366 +TRANS_FLAGS(ALTIVEC, VMRGHB, do_vmrg, gen_helper_VMRGHB);
367 +TRANS_FLAGS(ALTIVEC, VMRGHH, do_vmrg, gen_helper_VMRGHH);
368 +TRANS_FLAGS(ALTIVEC, VMRGHW, do_vmrg, gen_helper_VMRGHW);
369 +TRANS_FLAGS(ALTIVEC, VMRGLB, do_vmrg, gen_helper_VMRGLB);
370 +TRANS_FLAGS(ALTIVEC, VMRGLH, do_vmrg, gen_helper_VMRGLH);
371 +TRANS_FLAGS(ALTIVEC, VMRGLW, do_vmrg, gen_helper_VMRGLW);
372
373 static void trans_vmrgew(DisasContext *ctx)
374 {
target/ppc/translate/vmx-ops.c.inc
-6
@@ -33,12 +33,6 @@ GEN_VXFORM_DUAL(vsubuhm, bcdsub, 0, 17, PPC_ALTIVEC, PPC_NONE),
33 GEN_VXFORM_DUAL(vsubuwm, bcdus, 0, 18, PPC_ALTIVEC, PPC2_ISA300),
34 GEN_VXFORM_DUAL(vsubudm, bcds, 0, 19, PPC2_ALTIVEC_207, PPC2_ISA300),
35 GEN_VXFORM_300(bcds, 0, 27),
36 -GEN_VXFORM(vmrghb, 6, 0),
37 -GEN_VXFORM(vmrghh, 6, 1),
38 -GEN_VXFORM(vmrghw, 6, 2),
39 -GEN_VXFORM(vmrglb, 6, 4),
40 -GEN_VXFORM(vmrglh, 6, 5),
41 -GEN_VXFORM(vmrglw, 6, 6),
36 GEN_VXFORM_300(vextublx, 6, 24),
37 GEN_VXFORM_300(vextuhlx, 6, 25),
38 GEN_VXFORM_DUAL(vmrgow, vextuwlx, 6, 26, PPC_NONE, PPC2_ALTIVEC_207),