@samitouri / QOSamiQemu / commits / 6162c1baa9

target/arm: Implement SMOP4[AS] (2-way)

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

Richard Henderson committed Jul 2, 2026 at 13:43 UTC 6162c1baa90dba9c5e38c203f445f9ce5663c643
4 files changed +39
target/arm/tcg/helper-sme-defs.h
+3
@@ -379,3 +379,6 @@ DEF_HELPER_FLAGS_5(sme_ah_bfmop4s_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env,
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)
382 +
383 +DEF_HELPER_FLAGS_4(sme_smop4a_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
384 +DEF_HELPER_FLAGS_4(sme_smop4s_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
target/arm/tcg/sme.decode
+2
@@ -1116,3 +1116,5 @@ FMOP4_sh 1000 0001 001. ...0 0000 00.. ..0. 00.. @mop4_o2
1116
1117 FMOP4A_sb 1000 0000 001. ...0 0000 00.. ..00 00.. @mop4_o2_s0
1118 FMOP4A_hb 1000 0000 001. ...0 0000 00.. ..00 100. @mop4_o1_s0
1119 +
1120 +SMOP4_sh 1000 0000 000. ...0 1000 00.. ..0. 10.. @mop4_o2
target/arm/tcg/sme_helper.c
+16
@@ -2938,3 +2938,19 @@ void HELPER(sme_ah_fmop4s_sh)(void *vza, void *vzn, void *vzm,
2938 {
2939 sme_mop4(vza, vzn, vzm, env, desc, sizeof(float32), inner_ah_fmop4s_sh);
2940 }
2941 +
2942 +#define IMOP4_2WAY(NAME, OP, TYPED, TYPEN, TYPEM) \
2943 +static void inner_##NAME(void *vd, void *vn, void *vm, void *vinfo) \
2944 +{ \
2945 + TYPEN *n = vn; TYPEM *m = vm; TYPED *d = vd; \
2946 + *d OP##= (TYPED)n[0] * m[0] + (TYPED)n[1] * m[1]; \
2947 +} \
2948 +void HELPER(sme_##NAME)(void *vza, void *vzn, void *vzm, uint32_t desc) \
2949 +{ \
2950 + sme_mop4(vza, vzn, vzm, NULL, desc, sizeof(TYPED), inner_##NAME); \
2951 +}
2952 +
2953 +IMOP4_2WAY(smop4a_sh, +, int32_t, int16_t, int16_t)
2954 +IMOP4_2WAY(smop4s_sh, -, int32_t, int16_t, int16_t)
2955 +
2956 +#undef IMOP4_2WAY
target/arm/tcg/translate-sme.c
+18
@@ -2092,3 +2092,21 @@ TRANS_FEAT(FMOP4A_sb, aa64_sme_mop4_f8f32,
2092 do_mop4_fp8, a, MO_32, gen_helper_sme_fmop4a_sb)
2093 TRANS_FEAT(FMOP4A_hb, aa64_sme_mop4_f8f16,
2094 do_mop4_fp8, a, MO_16, gen_helper_sme_fmop4a_hb)
2095 +
2096 +static bool do_mop4_int(DisasContext *s, arg_mop4 *a, MemOp esz,
2097 + gen_helper_gvec_3 *fn)
2098 +{
2099 + if (sme_smza_enabled_check(s)) {
2100 + int svl = streaming_vec_reg_size(s);
2101 + uint32_t desc = simd_desc(svl, svl, (a->m << 1) | a->n);
2102 + TCGv_ptr za = get_tile(s, esz, a->zad);
2103 + TCGv_ptr zn = vec_full_reg_ptr(s, a->zn);
2104 + TCGv_ptr zm = vec_full_reg_ptr(s, a->zm);
2105 +
2106 + fn(za, zn, zm, tcg_constant_i32(desc));
2107 + }
2108 + return true;
2109 +}
2110 +
2111 +TRANS_FEAT(SMOP4_sh, aa64_sme_mop4, do_mop4_int, a, MO_32,
2112 + a->s ? gen_helper_sme_smop4s_sh : gen_helper_sme_smop4a_sh)