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)