@samitouri / QOSamiQemu / commits / 695e4e87a4

target/arm: Implement [SU]TMOPA (2-way)

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

Richard Henderson committed Aug 11, 2026 at 20:14 UTC 695e4e87a437e1d2d50755b0ed906cc54898813c
4 files changed +39
target/arm/tcg/helper-sme-defs.h
+3
@@ -411,3 +411,6 @@ DEF_HELPER_FLAGS_6(sme_ftmopa_ss, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, fps
411
412 DEF_HELPER_FLAGS_6(sme_bftmopa_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, env, i32)
413 DEF_HELPER_FLAGS_6(sme_ftmopa_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, env, i32)
414 +
415 +DEF_HELPER_FLAGS_5(sme_stmopa_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
416 +DEF_HELPER_FLAGS_5(sme_utmopa_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
target/arm/tcg/sme.decode
+3
@@ -1151,3 +1151,6 @@ FTMOPA_sh 1000 0001 011 ..... 000 ... .... .. 00 .. @tmop_o2
1151
1152 FTMOPA_hb 1000 0000 011 ..... 000 ... .... .. 100 . @tmop_o1
1153 FTMOPA_sb 1000 0000 011 ..... 000 ... .... .. 00 .. @tmop_o2
1154 +
1155 +STMOPA_sh 1000 0000 010 ..... 100 ... .... .. 10 .. @tmop_o2
1156 +UTMOPA_sh 1000 0001 010 ..... 100 ... .... .. 10 .. @tmop_o2
target/arm/tcg/sme_helper.c
+12
@@ -3123,6 +3123,18 @@ IMOP4_2WAY(umop4s_sh, -, int32_t, uint16_t, uint16_t)
3123
3124 #undef IMOP4_2WAY
3125
3126 +#define ITMOP_2WAY(TNAME, MNAME) \
3127 +void HELPER(sme_##TNAME)(void *vza, void *vzn, void *vzm, \
3128 + void *vzk, uint32_t desc) \
3129 +{ \
3130 + sme_tmop_2way_sh(vza, vzn, vzm, vzk, NULL, desc, inner_##MNAME); \
3131 +}
3132 +
3133 +ITMOP_2WAY(stmopa_sh, smop4a_sh)
3134 +ITMOP_2WAY(utmopa_sh, umop4a_sh)
3135 +
3136 +#undef ITMOP_2WAY
3137 +
3138 #define IMOP4_4WAY(NAME, OP, TYPED, TYPEN, TYPEM) \
3139 static void inner_##NAME(void *vd, void *vn, void *vm, void *vinfo) \
3140 { \
target/arm/tcg/translate-sme.c
+21
@@ -2181,3 +2181,24 @@ TRANS_FEAT(FTMOPA_hb, aa64_sme_tmop_f8f16, do_tmop_fp8,
2181 a, MO_16, gen_helper_sme_ftmopa_hb)
2182 TRANS_FEAT(FTMOPA_sb, aa64_sme_tmop_f8f32, do_tmop_fp8,
2183 a, MO_32, gen_helper_sme_ftmopa_sb)
2184 +
2185 +static bool do_tmop_int(DisasContext *s, arg_tmop *a, MemOp esz,
2186 + gen_helper_gvec_4 *fn)
2187 +{
2188 + if (sme_smza_enabled_check(s)) {
2189 + int svl = streaming_vec_reg_size(s);
2190 + uint32_t desc = simd_desc(svl, svl, a->idx);
2191 + TCGv_ptr za = get_tile(s, esz, a->zad);
2192 + TCGv_ptr zn = vec_full_reg_ptr(s, a->zn);
2193 + TCGv_ptr zm = vec_full_reg_ptr(s, a->zm);
2194 + TCGv_ptr zk = vec_full_reg_ptr(s, a->zm);
2195 +
2196 + fn(za, zn, zm, zk, tcg_constant_i32(desc));
2197 + }
2198 + return true;
2199 +}
2200 +
2201 +TRANS_FEAT(STMOPA_sh, aa64_sme_tmop, do_tmop_int,
2202 + a, MO_32, gen_helper_sme_stmopa_sh)
2203 +TRANS_FEAT(UTMOPA_sh, aa64_sme_tmop, do_tmop_int,
2204 + a, MO_32, gen_helper_sme_utmopa_sh)