1f0984d40SFabiano Rosas /* 2f0984d40SFabiano Rosas * AArch64 SME translation 3f0984d40SFabiano Rosas * 4f0984d40SFabiano Rosas * Copyright (c) 2022 Linaro, Ltd 5f0984d40SFabiano Rosas * 6f0984d40SFabiano Rosas * This library is free software; you can redistribute it and/or 7f0984d40SFabiano Rosas * modify it under the terms of the GNU Lesser General Public 8f0984d40SFabiano Rosas * License as published by the Free Software Foundation; either 9f0984d40SFabiano Rosas * version 2.1 of the License, or (at your option) any later version. 10f0984d40SFabiano Rosas * 11f0984d40SFabiano Rosas * This library is distributed in the hope that it will be useful, 12f0984d40SFabiano Rosas * but WITHOUT ANY WARRANTY; without even the implied warranty of 13f0984d40SFabiano Rosas * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14f0984d40SFabiano Rosas * Lesser General Public License for more details. 15f0984d40SFabiano Rosas * 16f0984d40SFabiano Rosas * You should have received a copy of the GNU Lesser General Public 17f0984d40SFabiano Rosas * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18f0984d40SFabiano Rosas */ 19f0984d40SFabiano Rosas 20f0984d40SFabiano Rosas #include "qemu/osdep.h" 21f0984d40SFabiano Rosas #include "translate.h" 22f0984d40SFabiano Rosas #include "translate-a64.h" 23f0984d40SFabiano Rosas 24f0984d40SFabiano Rosas /* 25f0984d40SFabiano Rosas * Include the generated decoder. 26f0984d40SFabiano Rosas */ 27f0984d40SFabiano Rosas 28f0984d40SFabiano Rosas #include "decode-sme.c.inc" 29f0984d40SFabiano Rosas 30f0984d40SFabiano Rosas 31f0984d40SFabiano Rosas /* 32f0984d40SFabiano Rosas * Resolve tile.size[index] to a host pointer, where tile and index 33f0984d40SFabiano Rosas * are always decoded together, dependent on the element size. 34f0984d40SFabiano Rosas */ 35f0984d40SFabiano Rosas static TCGv_ptr get_tile_rowcol(DisasContext *s, int esz, int rs, 36f0984d40SFabiano Rosas int tile_index, bool vertical) 37f0984d40SFabiano Rosas { 38f0984d40SFabiano Rosas int tile = tile_index >> (4 - esz); 39f0984d40SFabiano Rosas int index = esz == MO_128 ? 0 : extract32(tile_index, 0, 4 - esz); 40f0984d40SFabiano Rosas int pos, len, offset; 41f0984d40SFabiano Rosas TCGv_i32 tmp; 42f0984d40SFabiano Rosas TCGv_ptr addr; 43f0984d40SFabiano Rosas 44f0984d40SFabiano Rosas /* Compute the final index, which is Rs+imm. */ 45f0984d40SFabiano Rosas tmp = tcg_temp_new_i32(); 46f0984d40SFabiano Rosas tcg_gen_trunc_tl_i32(tmp, cpu_reg(s, rs)); 47f0984d40SFabiano Rosas tcg_gen_addi_i32(tmp, tmp, index); 48f0984d40SFabiano Rosas 49f0984d40SFabiano Rosas /* Prepare a power-of-two modulo via extraction of @len bits. */ 50f0984d40SFabiano Rosas len = ctz32(streaming_vec_reg_size(s)) - esz; 51f0984d40SFabiano Rosas 52f0984d40SFabiano Rosas if (vertical) { 53f0984d40SFabiano Rosas /* 54f0984d40SFabiano Rosas * Compute the byte offset of the index within the tile: 55f0984d40SFabiano Rosas * (index % (svl / size)) * size 56f0984d40SFabiano Rosas * = (index % (svl >> esz)) << esz 57f0984d40SFabiano Rosas * Perform the power-of-two modulo via extraction of the low @len bits. 58f0984d40SFabiano Rosas * Perform the multiply by shifting left by @pos bits. 59f0984d40SFabiano Rosas * Perform these operations simultaneously via deposit into zero. 60f0984d40SFabiano Rosas */ 61f0984d40SFabiano Rosas pos = esz; 62f0984d40SFabiano Rosas tcg_gen_deposit_z_i32(tmp, tmp, pos, len); 63f0984d40SFabiano Rosas 64f0984d40SFabiano Rosas /* 65f0984d40SFabiano Rosas * For big-endian, adjust the indexed column byte offset within 66f0984d40SFabiano Rosas * the uint64_t host words that make up env->zarray[]. 67f0984d40SFabiano Rosas */ 68f0984d40SFabiano Rosas if (HOST_BIG_ENDIAN && esz < MO_64) { 69f0984d40SFabiano Rosas tcg_gen_xori_i32(tmp, tmp, 8 - (1 << esz)); 70f0984d40SFabiano Rosas } 71f0984d40SFabiano Rosas } else { 72f0984d40SFabiano Rosas /* 73f0984d40SFabiano Rosas * Compute the byte offset of the index within the tile: 74f0984d40SFabiano Rosas * (index % (svl / size)) * (size * sizeof(row)) 75f0984d40SFabiano Rosas * = (index % (svl >> esz)) << (esz + log2(sizeof(row))) 76f0984d40SFabiano Rosas */ 77f0984d40SFabiano Rosas pos = esz + ctz32(sizeof(ARMVectorReg)); 78f0984d40SFabiano Rosas tcg_gen_deposit_z_i32(tmp, tmp, pos, len); 79f0984d40SFabiano Rosas 80f0984d40SFabiano Rosas /* Row slices are always aligned and need no endian adjustment. */ 81f0984d40SFabiano Rosas } 82f0984d40SFabiano Rosas 83f0984d40SFabiano Rosas /* The tile byte offset within env->zarray is the row. */ 84f0984d40SFabiano Rosas offset = tile * sizeof(ARMVectorReg); 85f0984d40SFabiano Rosas 86f0984d40SFabiano Rosas /* Include the byte offset of zarray to make this relative to env. */ 87f0984d40SFabiano Rosas offset += offsetof(CPUARMState, zarray); 88f0984d40SFabiano Rosas tcg_gen_addi_i32(tmp, tmp, offset); 89f0984d40SFabiano Rosas 90f0984d40SFabiano Rosas /* Add the byte offset to env to produce the final pointer. */ 91f0984d40SFabiano Rosas addr = tcg_temp_new_ptr(); 92f0984d40SFabiano Rosas tcg_gen_ext_i32_ptr(addr, tmp); 93*ad75a51eSRichard Henderson tcg_gen_add_ptr(addr, addr, tcg_env); 94f0984d40SFabiano Rosas 95f0984d40SFabiano Rosas return addr; 96f0984d40SFabiano Rosas } 97f0984d40SFabiano Rosas 981f51573fSRichard Henderson /* 991f51573fSRichard Henderson * Resolve tile.size[0] to a host pointer. 1001f51573fSRichard Henderson * Used by e.g. outer product insns where we require the entire tile. 1011f51573fSRichard Henderson */ 1021f51573fSRichard Henderson static TCGv_ptr get_tile(DisasContext *s, int esz, int tile) 1031f51573fSRichard Henderson { 1041f51573fSRichard Henderson TCGv_ptr addr = tcg_temp_new_ptr(); 1051f51573fSRichard Henderson int offset; 1061f51573fSRichard Henderson 1071f51573fSRichard Henderson offset = tile * sizeof(ARMVectorReg) + offsetof(CPUARMState, zarray); 1081f51573fSRichard Henderson 109*ad75a51eSRichard Henderson tcg_gen_addi_ptr(addr, tcg_env, offset); 1101f51573fSRichard Henderson return addr; 1111f51573fSRichard Henderson } 1121f51573fSRichard Henderson 113f0984d40SFabiano Rosas static bool trans_ZERO(DisasContext *s, arg_ZERO *a) 114f0984d40SFabiano Rosas { 115f0984d40SFabiano Rosas if (!dc_isar_feature(aa64_sme, s)) { 116f0984d40SFabiano Rosas return false; 117f0984d40SFabiano Rosas } 118f0984d40SFabiano Rosas if (sme_za_enabled_check(s)) { 119*ad75a51eSRichard Henderson gen_helper_sme_zero(tcg_env, tcg_constant_i32(a->imm), 120f0984d40SFabiano Rosas tcg_constant_i32(streaming_vec_reg_size(s))); 121f0984d40SFabiano Rosas } 122f0984d40SFabiano Rosas return true; 123f0984d40SFabiano Rosas } 124f0984d40SFabiano Rosas 125f0984d40SFabiano Rosas static bool trans_MOVA(DisasContext *s, arg_MOVA *a) 126f0984d40SFabiano Rosas { 127f0984d40SFabiano Rosas static gen_helper_gvec_4 * const h_fns[5] = { 128f0984d40SFabiano Rosas gen_helper_sve_sel_zpzz_b, gen_helper_sve_sel_zpzz_h, 129f0984d40SFabiano Rosas gen_helper_sve_sel_zpzz_s, gen_helper_sve_sel_zpzz_d, 130f0984d40SFabiano Rosas gen_helper_sve_sel_zpzz_q 131f0984d40SFabiano Rosas }; 132f0984d40SFabiano Rosas static gen_helper_gvec_3 * const cz_fns[5] = { 133f0984d40SFabiano Rosas gen_helper_sme_mova_cz_b, gen_helper_sme_mova_cz_h, 134f0984d40SFabiano Rosas gen_helper_sme_mova_cz_s, gen_helper_sme_mova_cz_d, 135f0984d40SFabiano Rosas gen_helper_sme_mova_cz_q, 136f0984d40SFabiano Rosas }; 137f0984d40SFabiano Rosas static gen_helper_gvec_3 * const zc_fns[5] = { 138f0984d40SFabiano Rosas gen_helper_sme_mova_zc_b, gen_helper_sme_mova_zc_h, 139f0984d40SFabiano Rosas gen_helper_sme_mova_zc_s, gen_helper_sme_mova_zc_d, 140f0984d40SFabiano Rosas gen_helper_sme_mova_zc_q, 141f0984d40SFabiano Rosas }; 142f0984d40SFabiano Rosas 143f0984d40SFabiano Rosas TCGv_ptr t_za, t_zr, t_pg; 144f0984d40SFabiano Rosas TCGv_i32 t_desc; 145f0984d40SFabiano Rosas int svl; 146f0984d40SFabiano Rosas 147f0984d40SFabiano Rosas if (!dc_isar_feature(aa64_sme, s)) { 148f0984d40SFabiano Rosas return false; 149f0984d40SFabiano Rosas } 150f0984d40SFabiano Rosas if (!sme_smza_enabled_check(s)) { 151f0984d40SFabiano Rosas return true; 152f0984d40SFabiano Rosas } 153f0984d40SFabiano Rosas 154f0984d40SFabiano Rosas t_za = get_tile_rowcol(s, a->esz, a->rs, a->za_imm, a->v); 155f0984d40SFabiano Rosas t_zr = vec_full_reg_ptr(s, a->zr); 156f0984d40SFabiano Rosas t_pg = pred_full_reg_ptr(s, a->pg); 157f0984d40SFabiano Rosas 158f0984d40SFabiano Rosas svl = streaming_vec_reg_size(s); 159f0984d40SFabiano Rosas t_desc = tcg_constant_i32(simd_desc(svl, svl, 0)); 160f0984d40SFabiano Rosas 161f0984d40SFabiano Rosas if (a->v) { 162f0984d40SFabiano Rosas /* Vertical slice -- use sme mova helpers. */ 163f0984d40SFabiano Rosas if (a->to_vec) { 164f0984d40SFabiano Rosas zc_fns[a->esz](t_zr, t_za, t_pg, t_desc); 165f0984d40SFabiano Rosas } else { 166f0984d40SFabiano Rosas cz_fns[a->esz](t_za, t_zr, t_pg, t_desc); 167f0984d40SFabiano Rosas } 168f0984d40SFabiano Rosas } else { 169f0984d40SFabiano Rosas /* Horizontal slice -- reuse sve sel helpers. */ 170f0984d40SFabiano Rosas if (a->to_vec) { 171f0984d40SFabiano Rosas h_fns[a->esz](t_zr, t_za, t_zr, t_pg, t_desc); 172f0984d40SFabiano Rosas } else { 173f0984d40SFabiano Rosas h_fns[a->esz](t_za, t_zr, t_za, t_pg, t_desc); 174f0984d40SFabiano Rosas } 175f0984d40SFabiano Rosas } 176f0984d40SFabiano Rosas return true; 177f0984d40SFabiano Rosas } 178f0984d40SFabiano Rosas 179f0984d40SFabiano Rosas static bool trans_LDST1(DisasContext *s, arg_LDST1 *a) 180f0984d40SFabiano Rosas { 181f0984d40SFabiano Rosas typedef void GenLdSt1(TCGv_env, TCGv_ptr, TCGv_ptr, TCGv, TCGv_i32); 182f0984d40SFabiano Rosas 183f0984d40SFabiano Rosas /* 184f0984d40SFabiano Rosas * Indexed by [esz][be][v][mte][st], which is (except for load/store) 185f0984d40SFabiano Rosas * also the order in which the elements appear in the function names, 186f0984d40SFabiano Rosas * and so how we must concatenate the pieces. 187f0984d40SFabiano Rosas */ 188f0984d40SFabiano Rosas 189f0984d40SFabiano Rosas #define FN_LS(F) { gen_helper_sme_ld1##F, gen_helper_sme_st1##F } 190f0984d40SFabiano Rosas #define FN_MTE(F) { FN_LS(F), FN_LS(F##_mte) } 191f0984d40SFabiano Rosas #define FN_HV(F) { FN_MTE(F##_h), FN_MTE(F##_v) } 192f0984d40SFabiano Rosas #define FN_END(L, B) { FN_HV(L), FN_HV(B) } 193f0984d40SFabiano Rosas 194f0984d40SFabiano Rosas static GenLdSt1 * const fns[5][2][2][2][2] = { 195f0984d40SFabiano Rosas FN_END(b, b), 196f0984d40SFabiano Rosas FN_END(h_le, h_be), 197f0984d40SFabiano Rosas FN_END(s_le, s_be), 198f0984d40SFabiano Rosas FN_END(d_le, d_be), 199f0984d40SFabiano Rosas FN_END(q_le, q_be), 200f0984d40SFabiano Rosas }; 201f0984d40SFabiano Rosas 202f0984d40SFabiano Rosas #undef FN_LS 203f0984d40SFabiano Rosas #undef FN_MTE 204f0984d40SFabiano Rosas #undef FN_HV 205f0984d40SFabiano Rosas #undef FN_END 206f0984d40SFabiano Rosas 207f0984d40SFabiano Rosas TCGv_ptr t_za, t_pg; 208f0984d40SFabiano Rosas TCGv_i64 addr; 209f0984d40SFabiano Rosas int svl, desc = 0; 210f0984d40SFabiano Rosas bool be = s->be_data == MO_BE; 211f0984d40SFabiano Rosas bool mte = s->mte_active[0]; 212f0984d40SFabiano Rosas 213f0984d40SFabiano Rosas if (!dc_isar_feature(aa64_sme, s)) { 214f0984d40SFabiano Rosas return false; 215f0984d40SFabiano Rosas } 216f0984d40SFabiano Rosas if (!sme_smza_enabled_check(s)) { 217f0984d40SFabiano Rosas return true; 218f0984d40SFabiano Rosas } 219f0984d40SFabiano Rosas 220f0984d40SFabiano Rosas t_za = get_tile_rowcol(s, a->esz, a->rs, a->za_imm, a->v); 221f0984d40SFabiano Rosas t_pg = pred_full_reg_ptr(s, a->pg); 222f0984d40SFabiano Rosas addr = tcg_temp_new_i64(); 223f0984d40SFabiano Rosas 224f0984d40SFabiano Rosas tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), a->esz); 225f0984d40SFabiano Rosas tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn)); 226f0984d40SFabiano Rosas 227f0984d40SFabiano Rosas if (mte) { 228f0984d40SFabiano Rosas desc = FIELD_DP32(desc, MTEDESC, MIDX, get_mem_index(s)); 229f0984d40SFabiano Rosas desc = FIELD_DP32(desc, MTEDESC, TBI, s->tbid); 230f0984d40SFabiano Rosas desc = FIELD_DP32(desc, MTEDESC, TCMA, s->tcma); 231f0984d40SFabiano Rosas desc = FIELD_DP32(desc, MTEDESC, WRITE, a->st); 232f0984d40SFabiano Rosas desc = FIELD_DP32(desc, MTEDESC, SIZEM1, (1 << a->esz) - 1); 233f0984d40SFabiano Rosas desc <<= SVE_MTEDESC_SHIFT; 234f0984d40SFabiano Rosas } else { 235f0984d40SFabiano Rosas addr = clean_data_tbi(s, addr); 236f0984d40SFabiano Rosas } 237f0984d40SFabiano Rosas svl = streaming_vec_reg_size(s); 238f0984d40SFabiano Rosas desc = simd_desc(svl, svl, desc); 239f0984d40SFabiano Rosas 240*ad75a51eSRichard Henderson fns[a->esz][be][a->v][mte][a->st](tcg_env, t_za, t_pg, addr, 241f0984d40SFabiano Rosas tcg_constant_i32(desc)); 242f0984d40SFabiano Rosas return true; 243f0984d40SFabiano Rosas } 244f0984d40SFabiano Rosas 245f0984d40SFabiano Rosas typedef void GenLdStR(DisasContext *, TCGv_ptr, int, int, int, int); 246f0984d40SFabiano Rosas 247f0984d40SFabiano Rosas static bool do_ldst_r(DisasContext *s, arg_ldstr *a, GenLdStR *fn) 248f0984d40SFabiano Rosas { 249f0984d40SFabiano Rosas int svl = streaming_vec_reg_size(s); 250f0984d40SFabiano Rosas int imm = a->imm; 251f0984d40SFabiano Rosas TCGv_ptr base; 252f0984d40SFabiano Rosas 253f0984d40SFabiano Rosas if (!sme_za_enabled_check(s)) { 254f0984d40SFabiano Rosas return true; 255f0984d40SFabiano Rosas } 256f0984d40SFabiano Rosas 257f0984d40SFabiano Rosas /* ZA[n] equates to ZA0H.B[n]. */ 258f0984d40SFabiano Rosas base = get_tile_rowcol(s, MO_8, a->rv, imm, false); 259f0984d40SFabiano Rosas 260f0984d40SFabiano Rosas fn(s, base, 0, svl, a->rn, imm * svl); 261f0984d40SFabiano Rosas return true; 262f0984d40SFabiano Rosas } 263f0984d40SFabiano Rosas 264f0984d40SFabiano Rosas TRANS_FEAT(LDR, aa64_sme, do_ldst_r, a, gen_sve_ldr) 265f0984d40SFabiano Rosas TRANS_FEAT(STR, aa64_sme, do_ldst_r, a, gen_sve_str) 266f0984d40SFabiano Rosas 267f0984d40SFabiano Rosas static bool do_adda(DisasContext *s, arg_adda *a, MemOp esz, 268f0984d40SFabiano Rosas gen_helper_gvec_4 *fn) 269f0984d40SFabiano Rosas { 270f0984d40SFabiano Rosas int svl = streaming_vec_reg_size(s); 271f0984d40SFabiano Rosas uint32_t desc = simd_desc(svl, svl, 0); 272f0984d40SFabiano Rosas TCGv_ptr za, zn, pn, pm; 273f0984d40SFabiano Rosas 274f0984d40SFabiano Rosas if (!sme_smza_enabled_check(s)) { 275f0984d40SFabiano Rosas return true; 276f0984d40SFabiano Rosas } 277f0984d40SFabiano Rosas 2781f51573fSRichard Henderson za = get_tile(s, esz, a->zad); 279f0984d40SFabiano Rosas zn = vec_full_reg_ptr(s, a->zn); 280f0984d40SFabiano Rosas pn = pred_full_reg_ptr(s, a->pn); 281f0984d40SFabiano Rosas pm = pred_full_reg_ptr(s, a->pm); 282f0984d40SFabiano Rosas 283f0984d40SFabiano Rosas fn(za, zn, pn, pm, tcg_constant_i32(desc)); 284f0984d40SFabiano Rosas return true; 285f0984d40SFabiano Rosas } 286f0984d40SFabiano Rosas 287f0984d40SFabiano Rosas TRANS_FEAT(ADDHA_s, aa64_sme, do_adda, a, MO_32, gen_helper_sme_addha_s) 288f0984d40SFabiano Rosas TRANS_FEAT(ADDVA_s, aa64_sme, do_adda, a, MO_32, gen_helper_sme_addva_s) 289f0984d40SFabiano Rosas TRANS_FEAT(ADDHA_d, aa64_sme_i16i64, do_adda, a, MO_64, gen_helper_sme_addha_d) 290f0984d40SFabiano Rosas TRANS_FEAT(ADDVA_d, aa64_sme_i16i64, do_adda, a, MO_64, gen_helper_sme_addva_d) 291f0984d40SFabiano Rosas 292f0984d40SFabiano Rosas static bool do_outprod(DisasContext *s, arg_op *a, MemOp esz, 293f0984d40SFabiano Rosas gen_helper_gvec_5 *fn) 294f0984d40SFabiano Rosas { 295f0984d40SFabiano Rosas int svl = streaming_vec_reg_size(s); 296f0984d40SFabiano Rosas uint32_t desc = simd_desc(svl, svl, a->sub); 297f0984d40SFabiano Rosas TCGv_ptr za, zn, zm, pn, pm; 298f0984d40SFabiano Rosas 299f0984d40SFabiano Rosas if (!sme_smza_enabled_check(s)) { 300f0984d40SFabiano Rosas return true; 301f0984d40SFabiano Rosas } 302f0984d40SFabiano Rosas 3031f51573fSRichard Henderson za = get_tile(s, esz, a->zad); 304f0984d40SFabiano Rosas zn = vec_full_reg_ptr(s, a->zn); 305f0984d40SFabiano Rosas zm = vec_full_reg_ptr(s, a->zm); 306f0984d40SFabiano Rosas pn = pred_full_reg_ptr(s, a->pn); 307f0984d40SFabiano Rosas pm = pred_full_reg_ptr(s, a->pm); 308f0984d40SFabiano Rosas 309f0984d40SFabiano Rosas fn(za, zn, zm, pn, pm, tcg_constant_i32(desc)); 310f0984d40SFabiano Rosas return true; 311f0984d40SFabiano Rosas } 312f0984d40SFabiano Rosas 313f0984d40SFabiano Rosas static bool do_outprod_fpst(DisasContext *s, arg_op *a, MemOp esz, 314f0984d40SFabiano Rosas gen_helper_gvec_5_ptr *fn) 315f0984d40SFabiano Rosas { 316f0984d40SFabiano Rosas int svl = streaming_vec_reg_size(s); 317f0984d40SFabiano Rosas uint32_t desc = simd_desc(svl, svl, a->sub); 318f0984d40SFabiano Rosas TCGv_ptr za, zn, zm, pn, pm, fpst; 319f0984d40SFabiano Rosas 320f0984d40SFabiano Rosas if (!sme_smza_enabled_check(s)) { 321f0984d40SFabiano Rosas return true; 322f0984d40SFabiano Rosas } 323f0984d40SFabiano Rosas 3241f51573fSRichard Henderson za = get_tile(s, esz, a->zad); 325f0984d40SFabiano Rosas zn = vec_full_reg_ptr(s, a->zn); 326f0984d40SFabiano Rosas zm = vec_full_reg_ptr(s, a->zm); 327f0984d40SFabiano Rosas pn = pred_full_reg_ptr(s, a->pn); 328f0984d40SFabiano Rosas pm = pred_full_reg_ptr(s, a->pm); 329f0984d40SFabiano Rosas fpst = fpstatus_ptr(FPST_FPCR); 330f0984d40SFabiano Rosas 331f0984d40SFabiano Rosas fn(za, zn, zm, pn, pm, fpst, tcg_constant_i32(desc)); 332f0984d40SFabiano Rosas return true; 333f0984d40SFabiano Rosas } 334f0984d40SFabiano Rosas 335f0984d40SFabiano Rosas TRANS_FEAT(FMOPA_h, aa64_sme, do_outprod_fpst, a, MO_32, gen_helper_sme_fmopa_h) 336f0984d40SFabiano Rosas TRANS_FEAT(FMOPA_s, aa64_sme, do_outprod_fpst, a, MO_32, gen_helper_sme_fmopa_s) 337f0984d40SFabiano Rosas TRANS_FEAT(FMOPA_d, aa64_sme_f64f64, do_outprod_fpst, a, MO_64, gen_helper_sme_fmopa_d) 338f0984d40SFabiano Rosas 339f0984d40SFabiano Rosas /* TODO: FEAT_EBF16 */ 340f0984d40SFabiano Rosas TRANS_FEAT(BFMOPA, aa64_sme, do_outprod, a, MO_32, gen_helper_sme_bfmopa) 341f0984d40SFabiano Rosas 342f0984d40SFabiano Rosas TRANS_FEAT(SMOPA_s, aa64_sme, do_outprod, a, MO_32, gen_helper_sme_smopa_s) 343f0984d40SFabiano Rosas TRANS_FEAT(UMOPA_s, aa64_sme, do_outprod, a, MO_32, gen_helper_sme_umopa_s) 344f0984d40SFabiano Rosas TRANS_FEAT(SUMOPA_s, aa64_sme, do_outprod, a, MO_32, gen_helper_sme_sumopa_s) 345f0984d40SFabiano Rosas TRANS_FEAT(USMOPA_s, aa64_sme, do_outprod, a, MO_32, gen_helper_sme_usmopa_s) 346f0984d40SFabiano Rosas 347f0984d40SFabiano Rosas TRANS_FEAT(SMOPA_d, aa64_sme_i16i64, do_outprod, a, MO_64, gen_helper_sme_smopa_d) 348f0984d40SFabiano Rosas TRANS_FEAT(UMOPA_d, aa64_sme_i16i64, do_outprod, a, MO_64, gen_helper_sme_umopa_d) 349f0984d40SFabiano Rosas TRANS_FEAT(SUMOPA_d, aa64_sme_i16i64, do_outprod, a, MO_64, gen_helper_sme_sumopa_d) 350f0984d40SFabiano Rosas TRANS_FEAT(USMOPA_d, aa64_sme_i16i64, do_outprod, a, MO_64, gen_helper_sme_usmopa_d) 351