@samitouri / QOSamiQemu / commits / 84294be165

target/arm: Implement BFMOP4 (non-widening)

Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20260702204314.79224-5-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Jul 2, 2026 at 13:43 UTC 84294be165d77e465d371c4c5fd621a84a085dfe
5 files changed +60
target/arm/cpu-features.h
+5
@@ -1807,6 +1807,11 @@ isar_feature_aa64_sme_f16f16_or_f8f16(const ARMISARegisters *id)
1807 return isar_feature_aa64_sme_f16f16(id) || isar_feature_aa64_sme_f8f16(id);
1808 }
1809
1810 +static inline bool isar_feature_aa64_sme_mop4_b16b16(const ARMISARegisters *id)
1811 +{
1812 + return isar_feature_aa64_sme_mop4(id) && isar_feature_aa64_sme_b16b16(id);
1813 +}
1814 +
1815 static inline bool isar_feature_aa64_sme_mop4_f16f16(const ARMISARegisters *id)
1816 {
1817 return isar_feature_aa64_sme_mop4(id) && isar_feature_aa64_sme_f16f16(id);
target/arm/tcg/helper-sme-defs.h
+4
@@ -367,3 +367,7 @@ DEF_HELPER_FLAGS_5(sme_ah_fmop4s_ss, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst,
367 DEF_HELPER_FLAGS_5(sme_fmop4a_dd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
368 DEF_HELPER_FLAGS_5(sme_fmop4s_dd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
369 DEF_HELPER_FLAGS_5(sme_ah_fmop4s_dd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
370 +
371 +DEF_HELPER_FLAGS_5(sme_bfmop4a_hh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
372 +DEF_HELPER_FLAGS_5(sme_bfmop4s_hh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
373 +DEF_HELPER_FLAGS_5(sme_ah_bfmop4s_hh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
target/arm/tcg/sme.decode
+1
@@ -1101,6 +1101,7 @@ LUTI4_s_4b 1100 0000 1001 101 1 00 00 00 ....0 zd:5 \
1101 @mop4_o3 .... .... ... m:1 .... .... .. n:1 ... . s:1 . zad:3 \
1102 &mop4 zm=%mop4_zm zn=%mop4_zn
1103
1104 +BFMOP4_hh 1000 0001 001. ...0 0000 00.. ..0. 100. @mop4_o1
1105 FMOP4_hh 1000 0001 000. ...0 0000 00.. ..0. 100. @mop4_o1
1106 FMOP4_ss 1000 0000 000. ...0 0000 00.. ..0. 00.. @mop4_o2
1107 FMOP4_dd 1000 0000 110. ...0 0000 00.. ..0. 1... @mop4_o3
target/arm/tcg/sme_helper.c
+42
@@ -2761,3 +2761,45 @@ void HELPER(sme_ah_fmop4s_dd)(void *vza, void *vzn, void *vzm,
2761 {
2762 sme_mop4(vza, vzn, vzm, fpst, desc, sizeof(float64), inner_ah_fmop4s_dd);
2763 }
2764 +
2765 +static void inner_bfmop4a_hh(void *vd, void *vn, void *vm, void *vinfo)
2766 +{
2767 + bfloat16 *d = vd, *n = vn, *m = vm;
2768 + float_status *fpst = vinfo;
2769 +
2770 + *d = bfloat16_muladd(*n, *m, *d, 0, fpst);
2771 +}
2772 +
2773 +void HELPER(sme_bfmop4a_hh)(void *vza, void *vzn, void *vzm,
2774 + float_status *fpst, uint32_t desc)
2775 +{
2776 + sme_mop4(vza, vzn, vzm, fpst, desc, sizeof(bfloat16), inner_bfmop4a_hh);
2777 +}
2778 +
2779 +static void inner_bfmop4s_hh(void *vd, void *vn, void *vm, void *vinfo)
2780 +{
2781 + bfloat16 *d = vd, *n = vn, *m = vm;
2782 + float_status *fpst = vinfo;
2783 +
2784 + *d = bfloat16_muladd(bfloat16_chs(*n), *m, *d, 0, fpst);
2785 +}
2786 +
2787 +void HELPER(sme_bfmop4s_hh)(void *vza, void *vzn, void *vzm,
2788 + float_status *fpst, uint32_t desc)
2789 +{
2790 + sme_mop4(vza, vzn, vzm, fpst, desc, sizeof(bfloat16), inner_bfmop4s_hh);
2791 +}
2792 +
2793 +static void inner_ah_bfmop4s_hh(void *vd, void *vn, void *vm, void *vinfo)
2794 +{
2795 + bfloat16 *d = vd, *n = vn, *m = vm;
2796 + float_status *fpst = vinfo;
2797 +
2798 + *d = bfloat16_muladd(*n, *m, *d, float_muladd_negate_product, fpst);
2799 +}
2800 +
2801 +void HELPER(sme_ah_bfmop4s_hh)(void *vza, void *vzn, void *vzm,
2802 + float_status *fpst, uint32_t desc)
2803 +{
2804 + sme_mop4(vza, vzn, vzm, fpst, desc, sizeof(bfloat16), inner_ah_bfmop4s_hh);
2805 +}
target/arm/tcg/translate-sme.c
+8
@@ -2025,6 +2025,14 @@ static bool do_mop4_fp(DisasContext *s, arg_mop4 *a, MemOp esz,
2025 return true;
2026 }
2027
2028 +static gen_helper_gvec_3_ptr * const bfmop4_hh[3] = {
2029 + gen_helper_sme_bfmop4a_hh,
2030 + gen_helper_sme_bfmop4s_hh,
2031 + gen_helper_sme_ah_bfmop4s_hh
2032 +};
2033 +TRANS_FEAT(BFMOP4_hh, aa64_sme_mop4_b16b16,
2034 + do_mop4_fp, a, MO_16, FPST_ZA, bfmop4_hh)
2035 +
2036 static gen_helper_gvec_3_ptr * const fmop4_hh[3] = {
2037 gen_helper_sme_fmop4a_hh,
2038 gen_helper_sme_fmop4s_hh,