@samitouri / QOSamiQemu / commits / ae1e896a59

target/arm: Implement FMOP4 (widening, 2-way fp16 to fp32)

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

Richard Henderson committed Jul 2, 2026 at 13:43 UTC ae1e896a599847f53da33bf3c7ef211fcdafa346
4 files changed +63
target/arm/tcg/helper-sme-defs.h
+4
@@ -375,3 +375,7 @@ DEF_HELPER_FLAGS_5(sme_ah_bfmop4s_hh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst
375 DEF_HELPER_FLAGS_5(sme_bfmop4a_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
376 DEF_HELPER_FLAGS_5(sme_bfmop4s_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
377 DEF_HELPER_FLAGS_5(sme_ah_bfmop4s_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
378 +
379 +DEF_HELPER_FLAGS_5(sme_fmop4a_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
380 +DEF_HELPER_FLAGS_5(sme_fmop4s_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
381 +DEF_HELPER_FLAGS_5(sme_ah_fmop4s_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
target/arm/tcg/sme.decode
+1
@@ -1107,3 +1107,4 @@ 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
1108
1109 BFMOP4_sh 1000 0001 000. ...0 0000 00.. ..0. 00.. @mop4_o2
1110 +FMOP4_sh 1000 0001 001. ...0 0000 00.. ..0. 00.. @mop4_o2
target/arm/tcg/sme_helper.c
+51
@@ -2887,3 +2887,54 @@ void HELPER(sme_ah_bfmop4s_sh)(void *vza, void *vzn, void *vzm,
2887 is_ebf(env, &fpst) ? inner_ebf_ah_bfmop4s_sh
2888 : inner_ah_bfmop4s_sh);
2889 }
2890 +
2891 +static void inner_fmop4a_sh(void *vd, void *vn, void *vm, void *vinfo)
2892 +{
2893 + float32 *d = vd;
2894 + uint32_t *n = vn, *m = vm;
2895 + CPUArchState *env = vinfo;
2896 +
2897 + *d = f16_dotadd(*d, *n, *m,
2898 + &env->vfp.fp_status[FPST_ZA_F16],
2899 + &env->vfp.fp_status[FPST_ZA]);
2900 +}
2901 +
2902 +void HELPER(sme_fmop4a_sh)(void *vza, void *vzn, void *vzm,
2903 + CPUArchState *env, uint32_t desc)
2904 +{
2905 + sme_mop4(vza, vzn, vzm, env, desc, sizeof(float32), inner_fmop4a_sh);
2906 +}
2907 +
2908 +static void inner_fmop4s_sh(void *vd, void *vn, void *vm, void *vinfo)
2909 +{
2910 + float32 *d = vd;
2911 + uint32_t *n = vn, *m = vm;
2912 + CPUArchState *env = vinfo;
2913 +
2914 + *d = f16_dotadd(*d, *n ^ 0x80008000u, *m,
2915 + &env->vfp.fp_status[FPST_ZA_F16],
2916 + &env->vfp.fp_status[FPST_ZA]);
2917 +}
2918 +
2919 +void HELPER(sme_fmop4s_sh)(void *vza, void *vzn, void *vzm,
2920 + CPUArchState *env, uint32_t desc)
2921 +{
2922 + sme_mop4(vza, vzn, vzm, env, desc, sizeof(float32), inner_fmop4s_sh);
2923 +}
2924 +
2925 +static void inner_ah_fmop4s_sh(void *vd, void *vn, void *vm, void *vinfo)
2926 +{
2927 + float32 *d = vd;
2928 + uint32_t *n = vn, *m = vm;
2929 + CPUArchState *env = vinfo;
2930 +
2931 + *d = f16_dotadd(*d, f16mop_ah_neg_adj_pair(*n, -1), *m,
2932 + &env->vfp.fp_status[FPST_ZA_F16],
2933 + &env->vfp.fp_status[FPST_ZA]);
2934 +}
2935 +
2936 +void HELPER(sme_ah_fmop4s_sh)(void *vza, void *vzn, void *vzm,
2937 + CPUArchState *env, uint32_t desc)
2938 +{
2939 + sme_mop4(vza, vzn, vzm, env, desc, sizeof(float32), inner_ah_fmop4s_sh);
2940 +}
target/arm/tcg/translate-sme.c
+7
@@ -2065,3 +2065,10 @@ static gen_helper_gvec_3_ptr * const bfmop4_sh[3] = {
2065 gen_helper_sme_ah_bfmop4s_sh
2066 };
2067 TRANS_FEAT(BFMOP4_sh, aa64_sme_mop4, do_mop4_fp, a, MO_32, FPST_ENV, bfmop4_sh)
2068 +
2069 +static gen_helper_gvec_3_ptr * const fmop4_sh[3] = {
2070 + gen_helper_sme_fmop4a_sh,
2071 + gen_helper_sme_fmop4s_sh,
2072 + gen_helper_sme_ah_fmop4s_sh
2073 +};
2074 +TRANS_FEAT(FMOP4_sh, aa64_sme_mop4, do_mop4_fp, a, MO_32, FPST_ENV, fmop4_sh)