106c3fb27SDimitry Andric//===--- arm_sme.td - ARM SME compiler interface ------------------------===// 206c3fb27SDimitry Andric// 306c3fb27SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 406c3fb27SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 506c3fb27SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 606c3fb27SDimitry Andric// 706c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 806c3fb27SDimitry Andric// 906c3fb27SDimitry Andric// This file defines the TableGen definitions from which the ARM SME header 1006c3fb27SDimitry Andric// file will be generated. See: 1106c3fb27SDimitry Andric// 1206c3fb27SDimitry Andric// https://developer.arm.com/architectures/system-architectures/software-standards/acle 1306c3fb27SDimitry Andric// 1406c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 1506c3fb27SDimitry Andric 1606c3fb27SDimitry Andricinclude "arm_sve_sme_incl.td" 1706c3fb27SDimitry Andric 18*0fca6ea1SDimitry Andriclet SVETargetGuard = InvalidMode in { 19*0fca6ea1SDimitry Andric 2006c3fb27SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 2106c3fb27SDimitry Andric// Loads 2206c3fb27SDimitry Andric 2306c3fb27SDimitry Andricmulticlass ZALoad<string n_suffix, string t, string i_prefix, list<ImmCheck> ch> { 24*0fca6ea1SDimitry Andric let SMETargetGuard = "sme" in { 255f757f3fSDimitry Andric def NAME # _H : MInst<"svld1_hor_" # n_suffix, "vimPQ", t, 267a6dacacSDimitry Andric [IsLoad, IsOverloadNone, IsStreaming, IsInOutZA], 2706c3fb27SDimitry Andric MemEltTyDefault, i_prefix # "_horiz", ch>; 2806c3fb27SDimitry Andric 295f757f3fSDimitry Andric def NAME # _H_VNUM : MInst<"svld1_hor_vnum_" # n_suffix, "vimPQl", t, 307a6dacacSDimitry Andric [IsLoad, IsOverloadNone, IsStreaming, IsInOutZA], 3106c3fb27SDimitry Andric MemEltTyDefault, i_prefix # "_horiz", ch>; 3206c3fb27SDimitry Andric 335f757f3fSDimitry Andric def NAME # _V : MInst<"svld1_ver_" # n_suffix, "vimPQ", t, 347a6dacacSDimitry Andric [IsLoad, IsOverloadNone, IsStreaming, IsInOutZA], 3506c3fb27SDimitry Andric MemEltTyDefault, i_prefix # "_vert", ch>; 3606c3fb27SDimitry Andric 375f757f3fSDimitry Andric def NAME # _V_VNUM : MInst<"svld1_ver_vnum_" # n_suffix, "vimPQl", t, 387a6dacacSDimitry Andric [IsLoad, IsOverloadNone, IsStreaming, IsInOutZA], 3906c3fb27SDimitry Andric MemEltTyDefault, i_prefix # "_vert", ch>; 4006c3fb27SDimitry Andric } 4106c3fb27SDimitry Andric} 4206c3fb27SDimitry Andric 435f757f3fSDimitry Andricdefm SVLD1_ZA8 : ZALoad<"za8", "c", "aarch64_sme_ld1b", [ImmCheck<0, ImmCheck0_0>]>; 445f757f3fSDimitry Andricdefm SVLD1_ZA16 : ZALoad<"za16", "s", "aarch64_sme_ld1h", [ImmCheck<0, ImmCheck0_1>]>; 455f757f3fSDimitry Andricdefm SVLD1_ZA32 : ZALoad<"za32", "i", "aarch64_sme_ld1w", [ImmCheck<0, ImmCheck0_3>]>; 465f757f3fSDimitry Andricdefm SVLD1_ZA64 : ZALoad<"za64", "l", "aarch64_sme_ld1d", [ImmCheck<0, ImmCheck0_7>]>; 475f757f3fSDimitry Andricdefm SVLD1_ZA128 : ZALoad<"za128", "q", "aarch64_sme_ld1q", [ImmCheck<0, ImmCheck0_15>]>; 4806c3fb27SDimitry Andric 49*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme" in { 505f757f3fSDimitry Andricdef SVLDR_VNUM_ZA : MInst<"svldr_vnum_za", "vmQl", "", 517a6dacacSDimitry Andric [IsOverloadNone, IsStreamingCompatible, IsInOutZA], 525f757f3fSDimitry Andric MemEltTyDefault, "aarch64_sme_ldr">; 535f757f3fSDimitry Andric 545f757f3fSDimitry Andricdef SVLDR_ZA : MInst<"svldr_za", "vmQ", "", 557a6dacacSDimitry Andric [IsOverloadNone, IsStreamingCompatible, IsInOutZA], 565f757f3fSDimitry Andric MemEltTyDefault, "aarch64_sme_ldr", []>; 5774626c16SDimitry Andric} 5806c3fb27SDimitry Andric 5906c3fb27SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 6006c3fb27SDimitry Andric// Stores 6106c3fb27SDimitry Andric 6206c3fb27SDimitry Andricmulticlass ZAStore<string n_suffix, string t, string i_prefix, list<ImmCheck> ch> { 63*0fca6ea1SDimitry Andric let SMETargetGuard = "sme" in { 645f757f3fSDimitry Andric def NAME # _H : MInst<"svst1_hor_" # n_suffix, "vimP%", t, 657a6dacacSDimitry Andric [IsStore, IsOverloadNone, IsStreaming, IsInZA], 6606c3fb27SDimitry Andric MemEltTyDefault, i_prefix # "_horiz", ch>; 6706c3fb27SDimitry Andric 685f757f3fSDimitry Andric def NAME # _H_VNUM : MInst<"svst1_hor_vnum_" # n_suffix, "vimP%l", t, 697a6dacacSDimitry Andric [IsStore, IsOverloadNone, IsStreaming, IsInZA], 7006c3fb27SDimitry Andric MemEltTyDefault, i_prefix # "_horiz", ch>; 7106c3fb27SDimitry Andric 725f757f3fSDimitry Andric def NAME # _V : MInst<"svst1_ver_" # n_suffix, "vimP%", t, 737a6dacacSDimitry Andric [IsStore, IsOverloadNone, IsStreaming, IsInZA], 7406c3fb27SDimitry Andric MemEltTyDefault, i_prefix # "_vert", ch>; 7506c3fb27SDimitry Andric 765f757f3fSDimitry Andric def NAME # _V_VNUM : MInst<"svst1_ver_vnum_" # n_suffix, "vimP%l", t, 777a6dacacSDimitry Andric [IsStore, IsOverloadNone, IsStreaming, IsInZA], 7806c3fb27SDimitry Andric MemEltTyDefault, i_prefix # "_vert", ch>; 7906c3fb27SDimitry Andric } 8006c3fb27SDimitry Andric} 8106c3fb27SDimitry Andric 825f757f3fSDimitry Andricdefm SVST1_ZA8 : ZAStore<"za8", "c", "aarch64_sme_st1b", [ImmCheck<0, ImmCheck0_0>]>; 835f757f3fSDimitry Andricdefm SVST1_ZA16 : ZAStore<"za16", "s", "aarch64_sme_st1h", [ImmCheck<0, ImmCheck0_1>]>; 845f757f3fSDimitry Andricdefm SVST1_ZA32 : ZAStore<"za32", "i", "aarch64_sme_st1w", [ImmCheck<0, ImmCheck0_3>]>; 855f757f3fSDimitry Andricdefm SVST1_ZA64 : ZAStore<"za64", "l", "aarch64_sme_st1d", [ImmCheck<0, ImmCheck0_7>]>; 865f757f3fSDimitry Andricdefm SVST1_ZA128 : ZAStore<"za128", "q", "aarch64_sme_st1q", [ImmCheck<0, ImmCheck0_15>]>; 8706c3fb27SDimitry Andric 88*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme" in { 895f757f3fSDimitry Andricdef SVSTR_VNUM_ZA : MInst<"svstr_vnum_za", "vm%l", "", 907a6dacacSDimitry Andric [IsOverloadNone, IsStreamingCompatible, IsInZA], 915f757f3fSDimitry Andric MemEltTyDefault, "aarch64_sme_str">; 925f757f3fSDimitry Andric 935f757f3fSDimitry Andricdef SVSTR_ZA : MInst<"svstr_za", "vm%", "", 947a6dacacSDimitry Andric [IsOverloadNone, IsStreamingCompatible, IsInZA], 955f757f3fSDimitry Andric MemEltTyDefault, "aarch64_sme_str", []>; 9674626c16SDimitry Andric} 9706c3fb27SDimitry Andric 9806c3fb27SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 9906c3fb27SDimitry Andric// Read horizontal/vertical ZA slices 10006c3fb27SDimitry Andric 10106c3fb27SDimitry Andricmulticlass ZARead<string n_suffix, string t, string i_prefix, list<ImmCheck> ch> { 102*0fca6ea1SDimitry Andric let SMETargetGuard = "sme" in { 1035f757f3fSDimitry Andric def NAME # _H : SInst<"svread_hor_" # n_suffix # "[_{d}]", "ddPim", t, 10406c3fb27SDimitry Andric MergeOp1, i_prefix # "_horiz", 1057a6dacacSDimitry Andric [IsReadZA, IsStreaming, IsInZA], ch>; 10606c3fb27SDimitry Andric 1075f757f3fSDimitry Andric def NAME # _V : SInst<"svread_ver_" # n_suffix # "[_{d}]", "ddPim", t, 10806c3fb27SDimitry Andric MergeOp1, i_prefix # "_vert", 1097a6dacacSDimitry Andric [IsReadZA, IsStreaming, IsInZA], ch>; 11006c3fb27SDimitry Andric } 11106c3fb27SDimitry Andric} 11206c3fb27SDimitry Andric 1135f757f3fSDimitry Andricdefm SVREAD_ZA8 : ZARead<"za8", "cUc", "aarch64_sme_read", [ImmCheck<2, ImmCheck0_0>]>; 1145f757f3fSDimitry Andricdefm SVREAD_ZA16 : ZARead<"za16", "sUshb", "aarch64_sme_read", [ImmCheck<2, ImmCheck0_1>]>; 1155f757f3fSDimitry Andricdefm SVREAD_ZA32 : ZARead<"za32", "iUif", "aarch64_sme_read", [ImmCheck<2, ImmCheck0_3>]>; 1165f757f3fSDimitry Andricdefm SVREAD_ZA64 : ZARead<"za64", "lUld", "aarch64_sme_read", [ImmCheck<2, ImmCheck0_7>]>; 1175f757f3fSDimitry Andricdefm SVREAD_ZA128 : ZARead<"za128", "csilUcUsUiUlhbfd", "aarch64_sme_readq", [ImmCheck<2, ImmCheck0_15>]>; 11806c3fb27SDimitry Andric 11906c3fb27SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 12006c3fb27SDimitry Andric// Write horizontal/vertical ZA slices 12106c3fb27SDimitry Andric 12206c3fb27SDimitry Andricmulticlass ZAWrite<string n_suffix, string t, string i_prefix, list<ImmCheck> ch> { 123*0fca6ea1SDimitry Andric let SMETargetGuard = "sme" in { 1245f757f3fSDimitry Andric def NAME # _H : SInst<"svwrite_hor_" # n_suffix # "[_{d}]", "vimPd", t, 12506c3fb27SDimitry Andric MergeOp1, i_prefix # "_horiz", 1267a6dacacSDimitry Andric [IsWriteZA, IsStreaming, IsInOutZA], ch>; 12706c3fb27SDimitry Andric 1285f757f3fSDimitry Andric def NAME # _V : SInst<"svwrite_ver_" # n_suffix # "[_{d}]", "vimPd", t, 12906c3fb27SDimitry Andric MergeOp1, i_prefix # "_vert", 1307a6dacacSDimitry Andric [IsWriteZA, IsStreaming, IsInOutZA], ch>; 13106c3fb27SDimitry Andric } 13206c3fb27SDimitry Andric} 13306c3fb27SDimitry Andric 1345f757f3fSDimitry Andricdefm SVWRITE_ZA8 : ZAWrite<"za8", "cUc", "aarch64_sme_write", [ImmCheck<0, ImmCheck0_0>]>; 1355f757f3fSDimitry Andricdefm SVWRITE_ZA16 : ZAWrite<"za16", "sUshb", "aarch64_sme_write", [ImmCheck<0, ImmCheck0_1>]>; 1365f757f3fSDimitry Andricdefm SVWRITE_ZA32 : ZAWrite<"za32", "iUif", "aarch64_sme_write", [ImmCheck<0, ImmCheck0_3>]>; 1375f757f3fSDimitry Andricdefm SVWRITE_ZA64 : ZAWrite<"za64", "lUld", "aarch64_sme_write", [ImmCheck<0, ImmCheck0_7>]>; 1385f757f3fSDimitry Andricdefm SVWRITE_ZA128 : ZAWrite<"za128", "csilUcUsUiUlhbfd", "aarch64_sme_writeq", [ImmCheck<0, ImmCheck0_15>]>; 13906c3fb27SDimitry Andric 14006c3fb27SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 14106c3fb27SDimitry Andric// SME - Zero 14206c3fb27SDimitry Andric 143*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme" in { 14406c3fb27SDimitry Andric def SVZERO_MASK_ZA : SInst<"svzero_mask_za", "vi", "", MergeNone, "aarch64_sme_zero", 1457a6dacacSDimitry Andric [IsOverloadNone, IsStreamingCompatible, IsInOutZA], 14606c3fb27SDimitry Andric [ImmCheck<0, ImmCheck0_255>]>; 147*0fca6ea1SDimitry Andric def SVZERO_ZA : SInst<"svzero_za", "vv", "", MergeNone, "aarch64_sme_zero", 1487a6dacacSDimitry Andric [IsOverloadNone, IsStreamingCompatible, IsOutZA]>; 14906c3fb27SDimitry Andric} 15006c3fb27SDimitry Andric 151*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2p1" in { 152*0fca6ea1SDimitry Andric def SVZERO_ZA64_VG1x2 : SInst<"svzero_za64_vg1x2", "vm", "", MergeNone, "aarch64_sme_zero_za64_vg1x2", 153*0fca6ea1SDimitry Andric [IsOverloadNone, IsStreaming, IsInOutZA]>; 154*0fca6ea1SDimitry Andric def SVZERO_ZA64_VG1x4 : SInst<"svzero_za64_vg1x4", "vm", "", MergeNone, "aarch64_sme_zero_za64_vg1x4", 155*0fca6ea1SDimitry Andric [IsOverloadNone, IsStreaming, IsInOutZA]>; 156*0fca6ea1SDimitry Andric def SVZERO_ZA64_VG2x1 : SInst<"svzero_za64_vg2x1", "vm", "", MergeNone, "aarch64_sme_zero_za64_vg2x1", 157*0fca6ea1SDimitry Andric [IsOverloadNone, IsStreaming, IsInOutZA]>; 158*0fca6ea1SDimitry Andric def SVZERO_ZA64_VG2x2 : SInst<"svzero_za64_vg2x2", "vm", "", MergeNone, "aarch64_sme_zero_za64_vg2x2", 159*0fca6ea1SDimitry Andric [IsOverloadNone, IsStreaming, IsInOutZA]>; 160*0fca6ea1SDimitry Andric def SVZERO_ZA64_VG2x4 : SInst<"svzero_za64_vg2x4", "vm", "", MergeNone, "aarch64_sme_zero_za64_vg2x4", 161*0fca6ea1SDimitry Andric [IsOverloadNone, IsStreaming, IsInOutZA]>; 162*0fca6ea1SDimitry Andric def SVZERO_ZA64_VG4x1 : SInst<"svzero_za64_vg4x1", "vm", "", MergeNone, "aarch64_sme_zero_za64_vg4x1", 163*0fca6ea1SDimitry Andric [IsOverloadNone, IsStreaming, IsInOutZA]>; 164*0fca6ea1SDimitry Andric def SVZERO_ZA64_VG4x2 : SInst<"svzero_za64_vg4x2", "vm", "", MergeNone, "aarch64_sme_zero_za64_vg4x2", 165*0fca6ea1SDimitry Andric [IsOverloadNone, IsStreaming, IsInOutZA]>; 166*0fca6ea1SDimitry Andric def SVZERO_ZA64_VG4x4 : SInst<"svzero_za64_vg4x4", "vm", "", MergeNone, "aarch64_sme_zero_za64_vg4x4", 167*0fca6ea1SDimitry Andric [IsOverloadNone, IsStreaming, IsInOutZA]>; 168*0fca6ea1SDimitry Andric} 169*0fca6ea1SDimitry Andric 17006c3fb27SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 17106c3fb27SDimitry Andric// SME - Counting elements in a streaming vector 17206c3fb27SDimitry Andric 17306c3fb27SDimitry Andricmulticlass ZACount<string n_suffix> { 174*0fca6ea1SDimitry Andric let SMETargetGuard = "sme" in { 17506c3fb27SDimitry Andric def NAME : SInst<"sv" # n_suffix, "nv", "", MergeNone, 17606c3fb27SDimitry Andric "aarch64_sme_" # n_suffix, 1777a6dacacSDimitry Andric [IsOverloadNone, IsStreamingCompatible]>; 17806c3fb27SDimitry Andric } 17906c3fb27SDimitry Andric} 18006c3fb27SDimitry Andric 18106c3fb27SDimitry Andricdefm SVCNTSB : ZACount<"cntsb">; 18206c3fb27SDimitry Andricdefm SVCNTSH : ZACount<"cntsh">; 18306c3fb27SDimitry Andricdefm SVCNTSW : ZACount<"cntsw">; 18406c3fb27SDimitry Andricdefm SVCNTSD : ZACount<"cntsd">; 18506c3fb27SDimitry Andric 18606c3fb27SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 18706c3fb27SDimitry Andric// SME - ADDHA/ADDVA 18806c3fb27SDimitry Andric 18906c3fb27SDimitry Andricmulticlass ZAAdd<string n_suffix> { 190*0fca6ea1SDimitry Andric let SMETargetGuard = "sme" in { 19106c3fb27SDimitry Andric def NAME # _ZA32: SInst<"sv" # n_suffix # "_za32[_{d}]", "viPPd", "iUi", MergeOp1, 1927a6dacacSDimitry Andric "aarch64_sme_" # n_suffix, [IsStreaming, IsInOutZA], 19306c3fb27SDimitry Andric [ImmCheck<0, ImmCheck0_3>]>; 19406c3fb27SDimitry Andric } 19506c3fb27SDimitry Andric 196*0fca6ea1SDimitry Andric let SMETargetGuard = "sme-i16i64" in { 19706c3fb27SDimitry Andric def NAME # _ZA64: SInst<"sv" # n_suffix # "_za64[_{d}]", "viPPd", "lUl", MergeOp1, 1987a6dacacSDimitry Andric "aarch64_sme_" # n_suffix, [IsStreaming, IsInOutZA], 19906c3fb27SDimitry Andric [ImmCheck<0, ImmCheck0_7>]>; 20006c3fb27SDimitry Andric } 20106c3fb27SDimitry Andric} 20206c3fb27SDimitry Andric 20306c3fb27SDimitry Andricdefm SVADDHA : ZAAdd<"addha">; 20406c3fb27SDimitry Andricdefm SVADDVA : ZAAdd<"addva">; 20506c3fb27SDimitry Andric 20606c3fb27SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 20706c3fb27SDimitry Andric// SME - SMOPA, SMOPS, UMOPA, UMOPS 20806c3fb27SDimitry Andric 20906c3fb27SDimitry Andricmulticlass ZAIntOuterProd<string n_suffix1, string n_suffix2> { 210*0fca6ea1SDimitry Andric let SMETargetGuard = "sme" in { 21106c3fb27SDimitry Andric def NAME # _ZA32_B: SInst<"sv" # n_suffix2 # "_za32[_{d}]", 21206c3fb27SDimitry Andric "viPPdd", !cond(!eq(n_suffix1, "s") : "", true: "U") # "c", 21306c3fb27SDimitry Andric MergeOp1, "aarch64_sme_" # n_suffix1 # n_suffix2 # "_wide", 2147a6dacacSDimitry Andric [IsStreaming, IsInOutZA], 21506c3fb27SDimitry Andric [ImmCheck<0, ImmCheck0_3>]>; 21606c3fb27SDimitry Andric } 21706c3fb27SDimitry Andric 218*0fca6ea1SDimitry Andric let SMETargetGuard = "sme-i16i64" in { 21906c3fb27SDimitry Andric def NAME # _ZA64_H: SInst<"sv" # n_suffix2 # "_za64[_{d}]", 22006c3fb27SDimitry Andric "viPPdd", !cond(!eq(n_suffix1, "s") : "", true: "U") # "s", 22106c3fb27SDimitry Andric MergeOp1, "aarch64_sme_" # n_suffix1 # n_suffix2 # "_wide", 2227a6dacacSDimitry Andric [IsStreaming, IsInOutZA], 22306c3fb27SDimitry Andric [ImmCheck<0, ImmCheck0_7>]>; 22406c3fb27SDimitry Andric } 22506c3fb27SDimitry Andric} 22606c3fb27SDimitry Andric 22706c3fb27SDimitry Andricdefm SVSMOPA : ZAIntOuterProd<"s", "mopa">; 22806c3fb27SDimitry Andricdefm SVSMOPS : ZAIntOuterProd<"s", "mops">; 22906c3fb27SDimitry Andricdefm SVUMOPA : ZAIntOuterProd<"u", "mopa">; 23006c3fb27SDimitry Andricdefm SVUMOPS : ZAIntOuterProd<"u", "mops">; 23106c3fb27SDimitry Andric 23206c3fb27SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 23306c3fb27SDimitry Andric// SME - SUMOPA, SUMOPS, USMOPA, USMOPS 23406c3fb27SDimitry Andric 23506c3fb27SDimitry Andricmulticlass ZAIntOuterProdMixedSigns<string n_suffix1, string n_suffix2> { 236*0fca6ea1SDimitry Andric let SMETargetGuard = "sme" in { 23706c3fb27SDimitry Andric def NAME # _ZA32_B: SInst<"sv" # n_suffix1 # n_suffix2 # "_za32[_{d}]", 23806c3fb27SDimitry Andric "viPPd" # !cond(!eq(n_suffix1, "su") : "u", true: "x"), 23906c3fb27SDimitry Andric !cond(!eq(n_suffix1, "su") : "", true: "U") # "c", 24006c3fb27SDimitry Andric MergeOp1, "aarch64_sme_" # n_suffix1 # n_suffix2 # "_wide", 2417a6dacacSDimitry Andric [IsStreaming, IsInOutZA], 24206c3fb27SDimitry Andric [ImmCheck<0, ImmCheck0_3>]>; 24306c3fb27SDimitry Andric } 24406c3fb27SDimitry Andric 245*0fca6ea1SDimitry Andric let SMETargetGuard = "sme-i16i64" in { 24606c3fb27SDimitry Andric def NAME # _ZA64_H: SInst<"sv" # n_suffix1 # n_suffix2 # "_za64[_{d}]", 24706c3fb27SDimitry Andric "viPPd" # !cond(!eq(n_suffix1, "su") : "u", true: "x"), 24806c3fb27SDimitry Andric !cond(!eq(n_suffix1, "su") : "", true: "U") # "s", 24906c3fb27SDimitry Andric MergeOp1, "aarch64_sme_" # n_suffix1 # n_suffix2 # "_wide", 2507a6dacacSDimitry Andric [IsStreaming, IsInOutZA], 25106c3fb27SDimitry Andric [ImmCheck<0, ImmCheck0_7>]>; 25206c3fb27SDimitry Andric } 25306c3fb27SDimitry Andric} 25406c3fb27SDimitry Andric 25506c3fb27SDimitry Andricdefm SVSUMOPA : ZAIntOuterProdMixedSigns<"su", "mopa">; 25606c3fb27SDimitry Andricdefm SVSUMOPS : ZAIntOuterProdMixedSigns<"su", "mops">; 25706c3fb27SDimitry Andricdefm SVUSMOPA : ZAIntOuterProdMixedSigns<"us", "mopa">; 25806c3fb27SDimitry Andricdefm SVUSMOPS : ZAIntOuterProdMixedSigns<"us", "mops">; 25906c3fb27SDimitry Andric 26006c3fb27SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 26106c3fb27SDimitry Andric// SME - FMOPA, FMOPS 26206c3fb27SDimitry Andric 26306c3fb27SDimitry Andricmulticlass ZAFPOuterProd<string n_suffix> { 264*0fca6ea1SDimitry Andric let SMETargetGuard = "sme" in { 26506c3fb27SDimitry Andric def NAME # _ZA32_B: SInst<"sv" # n_suffix # "_za32[_{d}]", "viPPdd", "h", 26606c3fb27SDimitry Andric MergeOp1, "aarch64_sme_" # n_suffix # "_wide", 2677a6dacacSDimitry Andric [IsStreaming, IsInOutZA], 26806c3fb27SDimitry Andric [ImmCheck<0, ImmCheck0_3>]>; 26906c3fb27SDimitry Andric 27006c3fb27SDimitry Andric def NAME # _ZA32_H: SInst<"sv" # n_suffix # "_za32[_{d}]", "viPPdd", "b", 27106c3fb27SDimitry Andric MergeOp1, "aarch64_sme_" # n_suffix # "_wide", 2727a6dacacSDimitry Andric [IsStreaming, IsInOutZA], 27306c3fb27SDimitry Andric [ImmCheck<0, ImmCheck0_3>]>; 27406c3fb27SDimitry Andric 27506c3fb27SDimitry Andric def NAME # _ZA32_S: SInst<"sv" # n_suffix # "_za32[_{d}]", "viPPdd", "f", 27606c3fb27SDimitry Andric MergeOp1, "aarch64_sme_" # n_suffix, 2777a6dacacSDimitry Andric [IsStreaming, IsInOutZA], 27806c3fb27SDimitry Andric [ImmCheck<0, ImmCheck0_3>]>; 27906c3fb27SDimitry Andric } 28006c3fb27SDimitry Andric 281*0fca6ea1SDimitry Andric let SMETargetGuard = "sme-f64f64" in { 28206c3fb27SDimitry Andric def NAME # _ZA64_D: SInst<"sv" # n_suffix # "_za64[_{d}]", "viPPdd", "d", 28306c3fb27SDimitry Andric MergeOp1, "aarch64_sme_" # n_suffix, 2847a6dacacSDimitry Andric [IsStreaming, IsInOutZA], 2855f757f3fSDimitry Andric [ImmCheck<0, ImmCheck0_7>]>; 28606c3fb27SDimitry Andric } 28706c3fb27SDimitry Andric} 28806c3fb27SDimitry Andric 28906c3fb27SDimitry Andricdefm SVMOPA : ZAFPOuterProd<"mopa">; 29006c3fb27SDimitry Andricdefm SVMOPS : ZAFPOuterProd<"mops">; 2915f757f3fSDimitry Andric 2925f757f3fSDimitry Andric//////////////////////////////////////////////////////////////////////////////// 2935f757f3fSDimitry Andric// SME2 - ADD, SUB 2945f757f3fSDimitry Andric 2955f757f3fSDimitry Andricmulticlass ZAAddSub<string n_suffix> { 296*0fca6ea1SDimitry Andric let SMETargetGuard = "sme2" in { 2977a6dacacSDimitry Andric def NAME # _WRITE_SINGLE_ZA32_VG1X2_I32 : Inst<"sv" # n_suffix # "_write[_single]_za32[_{d}]_vg1x2", "vm2d", "iUi", MergeNone, "aarch64_sme_" # n_suffix # "_write_single_za_vg1x2", [IsStreaming, IsInOutZA], []>; 2987a6dacacSDimitry Andric def NAME # _WRITE_SINGLE_ZA32_VG1X4_I32 : Inst<"sv" # n_suffix # "_write[_single]_za32[_{d}]_vg1x4", "vm4d", "iUi", MergeNone, "aarch64_sme_" # n_suffix # "_write_single_za_vg1x4", [IsStreaming, IsInOutZA], []>; 2995f757f3fSDimitry Andric 3007a6dacacSDimitry Andric def NAME # _WRITE_ZA32_VG1X2_I32 : Inst<"sv" # n_suffix # "_write_za32[_{d}]_vg1x2", "vm22", "iUi", MergeNone, "aarch64_sme_" # n_suffix # "_write_za_vg1x2", [IsStreaming, IsInOutZA], []>; 3017a6dacacSDimitry Andric def NAME # _WRITE_ZA32_VG1X4_I32 : Inst<"sv" # n_suffix # "_write_za32[_{d}]_vg1x4", "vm44", "iUi", MergeNone, "aarch64_sme_" # n_suffix # "_write_za_vg1x4", [IsStreaming, IsInOutZA], []>; 3025f757f3fSDimitry Andric 3037a6dacacSDimitry Andric def NAME # _ZA32_VG1x2_I32 : Inst<"sv" # n_suffix # "_za32[_{d}]_vg1x2", "vm2", "iUif", MergeNone, "aarch64_sme_" # n_suffix # "_za32_vg1x2", [IsStreaming, IsInOutZA], []>; 3047a6dacacSDimitry Andric def NAME # _ZA32_VG1X4_I32 : Inst<"sv" # n_suffix # "_za32[_{d}]_vg1x4", "vm4", "iUif", MergeNone, "aarch64_sme_" # n_suffix # "_za32_vg1x4", [IsStreaming, IsInOutZA], []>; 30574626c16SDimitry Andric } 3065f757f3fSDimitry Andric 307*0fca6ea1SDimitry Andric let SMETargetGuard = "sme2,sme-i16i64" in { 3087a6dacacSDimitry Andric def NAME # _WRITE_SINGLE_ZA64_VG1X2_I64 : Inst<"sv" # n_suffix # "_write[_single]_za64[_{d}]_vg1x2", "vm2d", "lUl", MergeNone, "aarch64_sme_" # n_suffix # "_write_single_za_vg1x2", [IsStreaming, IsInOutZA], []>; 3097a6dacacSDimitry Andric def NAME # _WRITE_SINGLE_ZA64_VG1X4_I64 : Inst<"sv" # n_suffix # "_write[_single]_za64[_{d}]_vg1x4", "vm4d", "lUl", MergeNone, "aarch64_sme_" # n_suffix # "_write_single_za_vg1x4", [IsStreaming, IsInOutZA], []>; 3105f757f3fSDimitry Andric 3117a6dacacSDimitry Andric def NAME # _WRITE_ZA64_VG1x2_I64 : Inst<"sv" # n_suffix # "_write_za64[_{d}]_vg1x2", "vm22", "lUl", MergeNone, "aarch64_sme_" # n_suffix # "_write_za_vg1x2", [IsStreaming, IsInOutZA], []>; 3127a6dacacSDimitry Andric def NAME # _WRITE_ZA64_VG1x4_I64 : Inst<"sv" # n_suffix # "_write_za64[_{d}]_vg1x4", "vm44", "lUl", MergeNone, "aarch64_sme_" # n_suffix # "_write_za_vg1x4", [IsStreaming, IsInOutZA], []>; 3135f757f3fSDimitry Andric 3147a6dacacSDimitry Andric def NAME # _ZA64_VG1X2_I64 : Inst<"sv" # n_suffix # "_za64[_{d}]_vg1x2", "vm2", "lUl", MergeNone, "aarch64_sme_" # n_suffix # "_za64_vg1x2", [IsStreaming, IsInOutZA], []>; 3157a6dacacSDimitry Andric def NAME # _ZA64_VG1X4_I64 : Inst<"sv" # n_suffix # "_za64[_{d}]_vg1x4", "vm4", "lUl", MergeNone, "aarch64_sme_" # n_suffix # "_za64_vg1x4", [IsStreaming, IsInOutZA], []>; 3165f757f3fSDimitry Andric } 3175f757f3fSDimitry Andric 318*0fca6ea1SDimitry Andric let SMETargetGuard = "sme2,sme-f64f64" in { 3197a6dacacSDimitry Andric def NAME # _ZA64_VG1X2_F64 : Inst<"sv" # n_suffix # "_za64[_{d}]_vg1x2", "vm2", "d", MergeNone, "aarch64_sme_" # n_suffix # "_za64_vg1x2", [IsStreaming, IsInOutZA], []>; 3207a6dacacSDimitry Andric def NAME # _ZA64_VG1X4_F64 : Inst<"sv" # n_suffix # "_za64[_{d}]_vg1x4", "vm4", "d", MergeNone, "aarch64_sme_" # n_suffix # "_za64_vg1x4", [IsStreaming, IsInOutZA], []>; 3215f757f3fSDimitry Andric } 322*0fca6ea1SDimitry Andric 323*0fca6ea1SDimitry Andric let SMETargetGuard = "sme-f16f16|sme-f8f16" in { 324*0fca6ea1SDimitry Andric def NAME # _ZA16_VG1X2_F16 : Inst<"sv" # n_suffix # "_za16[_{d}]_vg1x2", "vm2", "h", MergeNone, "aarch64_sme_" # n_suffix # "_za16_vg1x2", [IsStreaming, IsInOutZA], []>; 325*0fca6ea1SDimitry Andric def NAME # _ZA16_VG1X4_F16 : Inst<"sv" # n_suffix # "_za16[_{d}]_vg1x4", "vm4", "h", MergeNone, "aarch64_sme_" # n_suffix # "_za16_vg1x4", [IsStreaming, IsInOutZA], []>; 326*0fca6ea1SDimitry Andric } 327*0fca6ea1SDimitry Andric 328*0fca6ea1SDimitry Andric let SMETargetGuard = "sme2,b16b16" in { 329*0fca6ea1SDimitry Andric def NAME # _ZA16_VG1X2_BF16 : Inst<"sv" # n_suffix # "_za16[_{d}]_vg1x2", "vm2", "b", MergeNone, "aarch64_sme_" # n_suffix # "_za16_vg1x2", [IsStreaming, IsInOutZA], []>; 330*0fca6ea1SDimitry Andric def NAME # _ZA16_VG1X4_BF16 : Inst<"sv" # n_suffix # "_za16[_{d}]_vg1x4", "vm4", "b", MergeNone, "aarch64_sme_" # n_suffix # "_za16_vg1x4", [IsStreaming, IsInOutZA], []>; 331*0fca6ea1SDimitry Andric } 3325f757f3fSDimitry Andric} 3335f757f3fSDimitry Andric 3345f757f3fSDimitry Andricdefm SVADD : ZAAddSub<"add">; 3355f757f3fSDimitry Andricdefm SVSUB : ZAAddSub<"sub">; 3365f757f3fSDimitry Andric 337cb14a3feSDimitry Andric// SME2 - MOVA 338cb14a3feSDimitry Andric 339cb14a3feSDimitry Andric// 340cb14a3feSDimitry Andric// Single, 2 and 4 vector-group read/write intrinsics. 341cb14a3feSDimitry Andric// 342cb14a3feSDimitry Andric 343cb14a3feSDimitry Andricmulticlass ZAWrite_VG<string n, string t, string i, list<ImmCheck> checks> { 3447a6dacacSDimitry Andric def NAME # _VG2_H : Inst<"svwrite_hor_" # n # "[_{d}]_vg2", "vim2", t, MergeNone, i # "_hor_vg2", [IsInOutZA, IsStreaming], checks>; 3457a6dacacSDimitry Andric def NAME # _VG2_V : Inst<"svwrite_ver_" # n # "[_{d}]_vg2", "vim2", t, MergeNone, i # "_ver_vg2", [IsInOutZA, IsStreaming], checks>; 3467a6dacacSDimitry Andric def NAME # _VG4_H : Inst<"svwrite_hor_" # n # "[_{d}]_vg4", "vim4", t, MergeNone, i # "_hor_vg4", [IsInOutZA, IsStreaming], checks>; 3477a6dacacSDimitry Andric def NAME # _VG4_V : Inst<"svwrite_ver_" # n # "[_{d}]_vg4", "vim4", t, MergeNone, i # "_ver_vg4", [IsInOutZA, IsStreaming], checks>; 3487a6dacacSDimitry Andric def NAME # _VG1x2 : Inst<"svwrite_" # n # "[_{d}]_vg1x2", "vm2", t, MergeNone, i # "_vg1x2", [IsInOutZA, IsStreaming], []>; 3497a6dacacSDimitry Andric def NAME # _VG1x4 : Inst<"svwrite_" # n # "[_{d}]_vg1x4", "vm4", t, MergeNone, i # "_vg1x4", [IsInOutZA, IsStreaming], []>; 350cb14a3feSDimitry Andric} 351cb14a3feSDimitry Andric 352*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2" in { 353cb14a3feSDimitry Andric defm SVWRITE_ZA8 : ZAWrite_VG<"za8", "cUc", "aarch64_sme_write", [ImmCheck<0, ImmCheck0_0>]>; 354cb14a3feSDimitry Andric defm SVWRITE_ZA16 : ZAWrite_VG<"za16", "sUshb", "aarch64_sme_write", [ImmCheck<0, ImmCheck0_1>]>; 355cb14a3feSDimitry Andric defm SVWRITE_ZA32 : ZAWrite_VG<"za32", "iUif", "aarch64_sme_write", [ImmCheck<0, ImmCheck0_3>]>; 356cb14a3feSDimitry Andric defm SVWRITE_ZA64 : ZAWrite_VG<"za64", "lUld", "aarch64_sme_write", [ImmCheck<0, ImmCheck0_7>]>; 357cb14a3feSDimitry Andric} 358cb14a3feSDimitry Andric 359cb14a3feSDimitry Andricmulticlass ZARead_VG<string n, string t, string i, list<ImmCheck> checks> { 3607a6dacacSDimitry Andric def NAME # _VG2_H : Inst<"svread_hor_" # n # "_{d}_vg2", "2im", t, MergeNone, i # "_hor_vg2", [IsInZA, IsStreaming], checks>; 3617a6dacacSDimitry Andric def NAME # _VG2_V : Inst<"svread_ver_" # n # "_{d}_vg2", "2im", t, MergeNone, i # "_ver_vg2", [IsInZA, IsStreaming], checks>; 3627a6dacacSDimitry Andric def NAME # _VG4_H : Inst<"svread_hor_" # n # "_{d}_vg4", "4im", t, MergeNone, i # "_hor_vg4", [IsInZA, IsStreaming], checks>; 3637a6dacacSDimitry Andric def NAME # _VG4_V : Inst<"svread_ver_" # n # "_{d}_vg4", "4im", t, MergeNone, i # "_ver_vg4", [IsInZA, IsStreaming], checks>; 3647a6dacacSDimitry Andric def NAME # _VG1x2 : Inst<"svread_" # n # "_{d}_vg1x2", "2m", t, MergeNone, i # "_vg1x2", [IsInZA, IsStreaming], []>; 3657a6dacacSDimitry Andric def NAME # _VG1x4 : Inst<"svread_" # n # "_{d}_vg1x4", "4m", t, MergeNone, i # "_vg1x4", [IsInZA, IsStreaming], []>; 366cb14a3feSDimitry Andric} 367cb14a3feSDimitry Andric 368*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2" in { 369cb14a3feSDimitry Andric defm SVREAD_ZA8 : ZARead_VG<"za8", "cUc", "aarch64_sme_read", [ImmCheck<0, ImmCheck0_0>]>; 370cb14a3feSDimitry Andric defm SVREAD_ZA16 : ZARead_VG<"za16", "sUshb", "aarch64_sme_read", [ImmCheck<0, ImmCheck0_1>]>; 371cb14a3feSDimitry Andric defm SVREAD_ZA32 : ZARead_VG<"za32", "iUif", "aarch64_sme_read", [ImmCheck<0, ImmCheck0_3>]>; 372cb14a3feSDimitry Andric defm SVREAD_ZA64 : ZARead_VG<"za64", "lUld", "aarch64_sme_read", [ImmCheck<0, ImmCheck0_7>]>; 373cb14a3feSDimitry Andric} 374cb14a3feSDimitry Andric 3755f757f3fSDimitry Andric// 3765f757f3fSDimitry Andric// Outer product and accumulate/subtract 3775f757f3fSDimitry Andric// 3785f757f3fSDimitry Andric 379*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2" in { 3807a6dacacSDimitry Andric def SVSMOPA : Inst<"svmopa_za32[_{d}]_m", "viPPdd", "s", MergeNone, "aarch64_sme_smopa_za32", [IsInOutZA, IsStreaming], [ImmCheck<0, ImmCheck0_3>]>; 3817a6dacacSDimitry Andric def SVUSMOPA : Inst<"svmopa_za32[_{d}]_m", "viPPdd", "Us", MergeNone, "aarch64_sme_umopa_za32", [IsInOutZA, IsStreaming], [ImmCheck<0, ImmCheck0_3>]>; 3825f757f3fSDimitry Andric 3837a6dacacSDimitry Andric def SVSMOPS : Inst<"svmops_za32[_{d}]_m", "viPPdd", "s", MergeNone, "aarch64_sme_smops_za32", [IsInOutZA, IsStreaming], [ImmCheck<0, ImmCheck0_3>]>; 3847a6dacacSDimitry Andric def SVUSMOPS : Inst<"svmops_za32[_{d}]_m", "viPPdd", "Us", MergeNone, "aarch64_sme_umops_za32", [IsInOutZA, IsStreaming], [ImmCheck<0, ImmCheck0_3>]>; 3855f757f3fSDimitry Andric 3867a6dacacSDimitry Andric def SVBMOPA : Inst<"svbmopa_za32[_{d}]_m", "viPPdd", "iUi", MergeNone, "aarch64_sme_bmopa_za32", [IsInOutZA, IsStreaming], [ImmCheck<0, ImmCheck0_3>]>; 3875f757f3fSDimitry Andric 3887a6dacacSDimitry Andric def SVBMOPS : Inst<"svbmops_za32[_{d}]_m", "viPPdd", "iUi", MergeNone, "aarch64_sme_bmops_za32", [IsInOutZA, IsStreaming], [ImmCheck<0, ImmCheck0_3>]>; 389cb14a3feSDimitry Andric 390cb14a3feSDimitry Andric // VERTICAL DOT-PRODUCT 3917a6dacacSDimitry Andric def SVVDOT_LANE_ZA32_VG1x2_S : Inst<"svvdot_lane_za32[_{d}]_vg1x2", "vm2di", "s", MergeNone, "aarch64_sme_svdot_lane_za32_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 3927a6dacacSDimitry Andric def SVVDOT_LANE_ZA32_VG1x4_S : Inst<"svvdot_lane_za32[_{d}]_vg1x4", "vm4di", "c", MergeNone, "aarch64_sme_svdot_lane_za32_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 3937a6dacacSDimitry Andric def SVVDOT_LANE_ZA32_VG1x2_U : Inst<"svvdot_lane_za32[_{d}]_vg1x2", "vm2di", "Us", MergeNone, "aarch64_sme_uvdot_lane_za32_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 3947a6dacacSDimitry Andric def SVVDOT_LANE_ZA32_VG1x4_U : Inst<"svvdot_lane_za32[_{d}]_vg1x4", "vm4di", "Uc", MergeNone, "aarch64_sme_uvdot_lane_za32_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 3957a6dacacSDimitry Andric def SVVDOT_LANE_ZA32_VG1x2_F : Inst<"svvdot_lane_za32[_{d}]_vg1x2", "vm2di", "hb", MergeNone, "aarch64_sme_fvdot_lane_za32_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 3967a6dacacSDimitry Andric def SVSUVDOT_LANE_ZA32_VG1x4 : Inst<"svsuvdot_lane_za32[_{d}]_vg1x4", "vm4di", "c", MergeNone, "aarch64_sme_suvdot_lane_za32_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 3977a6dacacSDimitry Andric def SVUSVDOT_LANE_ZA32_VG1x4 : Inst<"svusvdot_lane_za32[_{d}]_vg1x4", "vm4di", "Uc", MergeNone, "aarch64_sme_usvdot_lane_za32_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 398cb14a3feSDimitry Andric 399cb14a3feSDimitry Andric // Multi-vector signed & unsigned integer dot-product 4007a6dacacSDimitry Andric def SVDOT_MULTI_ZA32_VG1x2_S : Inst<"svdot_za32[_{d}]_vg1x2", "vm22", "cs", MergeNone, "aarch64_sme_sdot_za32_vg1x2", [IsStreaming, IsInOutZA], []>; 4017a6dacacSDimitry Andric def SVDOT_MULTI_ZA32_VG1x4_S : Inst<"svdot_za32[_{d}]_vg1x4", "vm44", "cs", MergeNone, "aarch64_sme_sdot_za32_vg1x4", [IsStreaming, IsInOutZA], []>; 4027a6dacacSDimitry Andric def SVDOT_MULTI_ZA32_VG1x2_U : Inst<"svdot_za32[_{d}]_vg1x2", "vm22", "UcUs", MergeNone, "aarch64_sme_udot_za32_vg1x2", [IsStreaming, IsInOutZA], []>; 4037a6dacacSDimitry Andric def SVDOT_MULTI_ZA32_VG1x4_U : Inst<"svdot_za32[_{d}]_vg1x4", "vm44", "UcUs", MergeNone, "aarch64_sme_udot_za32_vg1x4", [IsStreaming, IsInOutZA], []>; 4047a6dacacSDimitry Andric def SVDOT_SINGLE_ZA32_VG1x2_S : Inst<"svdot[_single]_za32[_{d}]_vg1x2", "vm2d", "cs", MergeNone, "aarch64_sme_sdot_single_za32_vg1x2", [IsStreaming, IsInOutZA], []>; 4057a6dacacSDimitry Andric def SVDOT_SINGLE_ZA32_VG1x4_S : Inst<"svdot[_single]_za32[_{d}]_vg1x4", "vm4d", "cs", MergeNone, "aarch64_sme_sdot_single_za32_vg1x4", [IsStreaming, IsInOutZA], []>; 4067a6dacacSDimitry Andric def SVDOT_SINGLE_ZA32_VG1x2_U : Inst<"svdot[_single]_za32[_{d}]_vg1x2", "vm2d", "UcUs", MergeNone, "aarch64_sme_udot_single_za32_vg1x2", [IsStreaming, IsInOutZA], []>; 4077a6dacacSDimitry Andric def SVDOT_SINGLE_ZA32_VG1x4_U : Inst<"svdot[_single]_za32[_{d}]_vg1x4", "vm4d", "UcUs", MergeNone, "aarch64_sme_udot_single_za32_vg1x4", [IsStreaming, IsInOutZA], []>; 4087a6dacacSDimitry Andric def SVDOT_LANE_ZA32_VG1x2_S : Inst<"svdot_lane_za32[_{d}]_vg1x2", "vm2di", "cs", MergeNone, "aarch64_sme_sdot_lane_za32_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 4097a6dacacSDimitry Andric def SVDOT_LANE_ZA32_VG1x4_S : Inst<"svdot_lane_za32[_{d}]_vg1x4", "vm4di", "cs", MergeNone, "aarch64_sme_sdot_lane_za32_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 4107a6dacacSDimitry Andric def SVDOT_LANE_ZA32_VG1x2_U : Inst<"svdot_lane_za32[_{d}]_vg1x2", "vm2di", "UcUs", MergeNone, "aarch64_sme_udot_lane_za32_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 4117a6dacacSDimitry Andric def SVDOT_LANE_ZA32_VG1x4_U : Inst<"svdot_lane_za32[_{d}]_vg1x4", "vm4di", "UcUs", MergeNone, "aarch64_sme_udot_lane_za32_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 412cb14a3feSDimitry Andric 4137a6dacacSDimitry Andric def SVUSDOT_SINGLE_ZA32_VG1x2 : Inst<"svusdot[_single]_za32[_{d}]_vg1x2", "vm2.dx", "Uc", MergeNone, "aarch64_sme_usdot_single_za32_vg1x2", [IsStreaming, IsInOutZA], []>; 4147a6dacacSDimitry Andric def SVUSDOT_SINGLE_ZA32_VG1x4 : Inst<"svusdot[_single]_za32[_{d}]_vg1x4", "vm4.dx", "Uc", MergeNone, "aarch64_sme_usdot_single_za32_vg1x4", [IsStreaming, IsInOutZA], []>; 4157a6dacacSDimitry Andric def SVUSDOT_MULTI_ZA32_VG1x2 : Inst<"svusdot_za32[_{d}]_vg1x2", "vm2.d2.x", "Uc", MergeNone, "aarch64_sme_usdot_za32_vg1x2", [IsStreaming, IsInOutZA], []>; 4167a6dacacSDimitry Andric def SVUSDOT_MULTI_ZA32_VG1x4 : Inst<"svusdot_za32[_{d}]_vg1x4", "vm4.d4.x", "Uc", MergeNone, "aarch64_sme_usdot_za32_vg1x4", [IsStreaming, IsInOutZA], []>; 4177a6dacacSDimitry Andric def SVUSDOT_LANE_ZA32_VG1x2 : Inst<"svusdot_lane_za32[_{d}]_vg1x2", "vm2.dxi", "Uc", MergeNone, "aarch64_sme_usdot_lane_za32_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 4187a6dacacSDimitry Andric def SVUSDOT_LANE_ZA32_VG1x4 : Inst<"svusdot_lane_za32[_{d}]_vg1x4", "vm4.dxi", "Uc", MergeNone, "aarch64_sme_usdot_lane_za32_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 419cb14a3feSDimitry Andric 4207a6dacacSDimitry Andric def SVSUDOT_SINGLE_ZA32_VG1x2 : Inst<"svsudot[_single]_za32[_{d}]_vg1x2", "vm2.du", "c", MergeNone, "aarch64_sme_sudot_single_za32_vg1x2", [IsStreaming, IsInOutZA], []>; 4217a6dacacSDimitry Andric def SVSUDOT_SINGLE_ZA32_VG1x4 : Inst<"svsudot[_single]_za32[_{d}]_vg1x4", "vm4.du", "c", MergeNone, "aarch64_sme_sudot_single_za32_vg1x4", [IsStreaming, IsInOutZA], []>; 422cb14a3feSDimitry Andric 423cb14a3feSDimitry Andric // Multi-multi sudot builtins are mapped to usdot, with zn & zm operands swapped 4247a6dacacSDimitry Andric def SVSUDOT_MULTI_ZA32_VG1x2 : Inst<"svsudot_za32[_{d}]_vg1x2", "vm2.d2.u", "c", MergeNone, "aarch64_sme_usdot_za32_vg1x2", [IsStreaming, IsInOutZA], []>; 4257a6dacacSDimitry Andric def SVSUDOT_MULTI_ZA32_VG1x4 : Inst<"svsudot_za32[_{d}]_vg1x4", "vm4.d4.u", "c", MergeNone, "aarch64_sme_usdot_za32_vg1x4", [IsStreaming, IsInOutZA], []>; 426cb14a3feSDimitry Andric 4277a6dacacSDimitry Andric def SVSUDOT_LANE_ZA32_VG1x2 : Inst<"svsudot_lane_za32[_{d}]_vg1x2", "vm2.dui", "c", MergeNone, "aarch64_sme_sudot_lane_za32_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 4287a6dacacSDimitry Andric def SVSUDOT_LANE_ZA32_VG1x4 : Inst<"svsudot_lane_za32[_{d}]_vg1x4", "vm4.dui", "c", MergeNone, "aarch64_sme_sudot_lane_za32_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 429cb14a3feSDimitry Andric 430cb14a3feSDimitry Andric // Multi-vector half-precision/BFloat16 floating-point dot-product 4317a6dacacSDimitry Andric def SVDOT_MULTI_ZA32_VG1x2_F16 : Inst<"svdot_za32[_{d}]_vg1x2", "vm22", "bh", MergeNone, "aarch64_sme_fdot_za32_vg1x2", [IsStreaming, IsInOutZA], []>; 4327a6dacacSDimitry Andric def SVDOT_MULTI_ZA32_VG1x4_F16 : Inst<"svdot_za32[_{d}]_vg1x4", "vm44", "bh", MergeNone, "aarch64_sme_fdot_za32_vg1x4", [IsStreaming, IsInOutZA], []>; 4337a6dacacSDimitry Andric def SVDOT_SINGLE_ZA32_VG1x2_F16 : Inst<"svdot[_single]_za32[_{d}]_vg1x2", "vm2d", "bh", MergeNone, "aarch64_sme_fdot_single_za32_vg1x2", [IsStreaming, IsInOutZA], []>; 4347a6dacacSDimitry Andric def SVDOT_SINGLE_ZA32_VG1x4_F16 : Inst<"svdot[_single]_za32[_{d}]_vg1x4", "vm4d", "bh", MergeNone, "aarch64_sme_fdot_single_za32_vg1x4", [IsStreaming, IsInOutZA], []>; 4357a6dacacSDimitry Andric def SVDOT_LANE_ZA32_VG1x2_F16 : Inst<"svdot_lane_za32[_{d}]_vg1x2", "vm2di", "bh", MergeNone, "aarch64_sme_fdot_lane_za32_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 4367a6dacacSDimitry Andric def SVDOT_LANE_ZA32_VG1x4_F16 : Inst<"svdot_lane_za32[_{d}]_vg1x4", "vm4di", "bh", MergeNone, "aarch64_sme_fdot_lane_za32_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 437cb14a3feSDimitry Andric} 438cb14a3feSDimitry Andric 439*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2,sme-i16i64" in { 4407a6dacacSDimitry Andric def SVVDOT_LANE_ZA64_VG1x4_S : Inst<"svvdot_lane_za64[_{d}]_vg1x4", "vm4di", "s", MergeNone, "aarch64_sme_svdot_lane_za64_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_1>]>; 4417a6dacacSDimitry Andric def SVVDOT_LANE_ZA64_VG1x4_U : Inst<"svvdot_lane_za64[_{d}]_vg1x4", "vm4di", "Us", MergeNone, "aarch64_sme_uvdot_lane_za64_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_1>]>; 442cb14a3feSDimitry Andric 4437a6dacacSDimitry Andric def SVDOT_MULTI_ZA64_VG1x2_S16 : Inst<"svdot_za64[_{d}]_vg1x2", "vm22", "s", MergeNone, "aarch64_sme_sdot_za64_vg1x2", [IsStreaming, IsInOutZA], []>; 4447a6dacacSDimitry Andric def SVDOT_MULTI_ZA64_VG1x4_S16 : Inst<"svdot_za64[_{d}]_vg1x4", "vm44", "s", MergeNone, "aarch64_sme_sdot_za64_vg1x4", [IsStreaming, IsInOutZA], []>; 4457a6dacacSDimitry Andric def SVDOT_MULTI_ZA64_VG1x2_U16 : Inst<"svdot_za64[_{d}]_vg1x2", "vm22", "Us", MergeNone, "aarch64_sme_udot_za64_vg1x2", [IsStreaming, IsInOutZA], []>; 4467a6dacacSDimitry Andric def SVDOT_MULTI_ZA64_VG1x4_U16 : Inst<"svdot_za64[_{d}]_vg1x4", "vm44", "Us", MergeNone, "aarch64_sme_udot_za64_vg1x4", [IsStreaming, IsInOutZA], []>; 4477a6dacacSDimitry Andric def SVDOT_SINGLE_ZA64_VG1x2_S16 : Inst<"svdot[_single]_za64[_{d}]_vg1x2", "vm2d", "s", MergeNone, "aarch64_sme_sdot_single_za64_vg1x2", [IsStreaming, IsInOutZA], []>; 4487a6dacacSDimitry Andric def SVDOT_SINGLE_ZA64_VG1x4_S16 : Inst<"svdot[_single]_za64[_{d}]_vg1x4", "vm4d", "s", MergeNone, "aarch64_sme_sdot_single_za64_vg1x4", [IsStreaming, IsInOutZA], []>; 4497a6dacacSDimitry Andric def SVDOT_SINGLE_ZA64_VG1x2_U16 : Inst<"svdot[_single]_za64[_{d}]_vg1x2", "vm2d", "Us", MergeNone, "aarch64_sme_udot_single_za64_vg1x2", [IsStreaming, IsInOutZA], []>; 4507a6dacacSDimitry Andric def SVDOT_SINGLE_ZA64_VG1x4_U16 : Inst<"svdot[_single]_za64[_{d}]_vg1x4", "vm4d", "Us", MergeNone, "aarch64_sme_udot_single_za64_vg1x4", [IsStreaming, IsInOutZA], []>; 4517a6dacacSDimitry Andric def SVDOT_LANE_ZA64_VG1x2_S16 : Inst<"svdot_lane_za64[_{d}]_vg1x2", "vm2di", "s", MergeNone, "aarch64_sme_sdot_lane_za64_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_1>]>; 4527a6dacacSDimitry Andric def SVDOT_LANE_ZA64_VG1x4_S16 : Inst<"svdot_lane_za64[_{d}]_vg1x4", "vm4di", "s", MergeNone, "aarch64_sme_sdot_lane_za64_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_1>]>; 4537a6dacacSDimitry Andric def SVDOT_LANE_ZA64_VG1x2_U16 : Inst<"svdot_lane_za64[_{d}]_vg1x2", "vm2di", "Us", MergeNone, "aarch64_sme_udot_lane_za64_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_1>]>; 4547a6dacacSDimitry Andric def SVDOT_LANE_ZA64_VG1x4_U16 : Inst<"svdot_lane_za64[_{d}]_vg1x4", "vm4di", "Us", MergeNone, "aarch64_sme_udot_lane_za64_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_1>]>; 455cb14a3feSDimitry Andric} 456cb14a3feSDimitry Andric 457cb14a3feSDimitry Andric// FMLA/FMLS 458*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2" in { 4597a6dacacSDimitry Andric def SVMLA_MULTI_VG1x2_F32 : Inst<"svmla_za32[_{d}]_vg1x2", "vm22", "f", MergeNone, "aarch64_sme_fmla_vg1x2", [IsStreaming, IsInOutZA], []>; 4607a6dacacSDimitry Andric def SVMLA_MULTI_VG1x4_F32 : Inst<"svmla_za32[_{d}]_vg1x4", "vm44", "f", MergeNone, "aarch64_sme_fmla_vg1x4", [IsStreaming, IsInOutZA], []>; 4617a6dacacSDimitry Andric def SVMLS_MULTI_VG1x2_F32 : Inst<"svmls_za32[_{d}]_vg1x2", "vm22", "f", MergeNone, "aarch64_sme_fmls_vg1x2", [IsStreaming, IsInOutZA], []>; 4627a6dacacSDimitry Andric def SVMLS_MULTI_VG1x4_F32 : Inst<"svmls_za32[_{d}]_vg1x4", "vm44", "f", MergeNone, "aarch64_sme_fmls_vg1x4", [IsStreaming, IsInOutZA], []>; 463cb14a3feSDimitry Andric 4647a6dacacSDimitry Andric def SVMLA_SINGLE_VG1x2_F32 : Inst<"svmla[_single]_za32[_{d}]_vg1x2", "vm2d", "f", MergeNone, "aarch64_sme_fmla_single_vg1x2", [IsStreaming, IsInOutZA], []>; 4657a6dacacSDimitry Andric def SVMLA_SINGLE_VG1x4_F32 : Inst<"svmla[_single]_za32[_{d}]_vg1x4", "vm4d", "f", MergeNone, "aarch64_sme_fmla_single_vg1x4", [IsStreaming, IsInOutZA], []>; 4667a6dacacSDimitry Andric def SVMLS_SINGLE_VG1x2_F32 : Inst<"svmls[_single]_za32[_{d}]_vg1x2", "vm2d", "f", MergeNone, "aarch64_sme_fmls_single_vg1x2", [IsStreaming, IsInOutZA], []>; 4677a6dacacSDimitry Andric def SVMLS_SINGLE_VG1x4_F32 : Inst<"svmls[_single]_za32[_{d}]_vg1x4", "vm4d", "f", MergeNone, "aarch64_sme_fmls_single_vg1x4", [IsStreaming, IsInOutZA], []>; 468cb14a3feSDimitry Andric 4697a6dacacSDimitry Andric def SVMLA_LANE_VG1x2_F32 : Inst<"svmla_lane_za32[_{d}]_vg1x2", "vm2di", "f", MergeNone, "aarch64_sme_fmla_lane_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 4707a6dacacSDimitry Andric def SVMLA_LANE_VG1x4_F32 : Inst<"svmla_lane_za32[_{d}]_vg1x4", "vm4di", "f", MergeNone, "aarch64_sme_fmla_lane_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 4717a6dacacSDimitry Andric def SVMLS_LANE_VG1x2_F32 : Inst<"svmls_lane_za32[_{d}]_vg1x2", "vm2di", "f", MergeNone, "aarch64_sme_fmls_lane_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 4727a6dacacSDimitry Andric def SVMLS_LANE_VG1x4_F32 : Inst<"svmls_lane_za32[_{d}]_vg1x4", "vm4di", "f", MergeNone, "aarch64_sme_fmls_lane_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_3>]>; 473cb14a3feSDimitry Andric} 474cb14a3feSDimitry Andric 475*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2,sme-f64f64" in { 4767a6dacacSDimitry Andric def SVMLA_MULTI_VG1x2_F64 : Inst<"svmla_za64[_{d}]_vg1x2", "vm22", "d", MergeNone, "aarch64_sme_fmla_vg1x2", [IsStreaming, IsInOutZA], []>; 4777a6dacacSDimitry Andric def SVMLA_MULTI_VG1x4_F64 : Inst<"svmla_za64[_{d}]_vg1x4", "vm44", "d", MergeNone, "aarch64_sme_fmla_vg1x4", [IsStreaming, IsInOutZA], []>; 4787a6dacacSDimitry Andric def SVMLS_MULTI_VG1x2_F64 : Inst<"svmls_za64[_{d}]_vg1x2", "vm22", "d", MergeNone, "aarch64_sme_fmls_vg1x2", [IsStreaming, IsInOutZA], []>; 4797a6dacacSDimitry Andric def SVMLS_MULTI_VG1x4_F64 : Inst<"svmls_za64[_{d}]_vg1x4", "vm44", "d", MergeNone, "aarch64_sme_fmls_vg1x4", [IsStreaming, IsInOutZA], []>; 480cb14a3feSDimitry Andric 4817a6dacacSDimitry Andric def SVMLA_SINGLE_VG1x2_F64 : Inst<"svmla[_single]_za64[_{d}]_vg1x2", "vm2d", "d", MergeNone, "aarch64_sme_fmla_single_vg1x2", [IsStreaming, IsInOutZA], []>; 4827a6dacacSDimitry Andric def SVMLA_SINGLE_VG1x4_F64 : Inst<"svmla[_single]_za64[_{d}]_vg1x4", "vm4d", "d", MergeNone, "aarch64_sme_fmla_single_vg1x4", [IsStreaming, IsInOutZA], []>; 4837a6dacacSDimitry Andric def SVMLS_SINGLE_VG1x2_F64 : Inst<"svmls[_single]_za64[_{d}]_vg1x2", "vm2d", "d", MergeNone, "aarch64_sme_fmls_single_vg1x2", [IsStreaming, IsInOutZA], []>; 4847a6dacacSDimitry Andric def SVMLS_SINGLE_VG1x4_F64 : Inst<"svmls[_single]_za64[_{d}]_vg1x4", "vm4d", "d", MergeNone, "aarch64_sme_fmls_single_vg1x4", [IsStreaming, IsInOutZA], []>; 485cb14a3feSDimitry Andric 4867a6dacacSDimitry Andric def SVMLA_LANE_VG1x2_F64 : Inst<"svmla_lane_za64[_{d}]_vg1x2", "vm2di", "d", MergeNone, "aarch64_sme_fmla_lane_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_1>]>; 4877a6dacacSDimitry Andric def SVMLA_LANE_VG1x4_F64 : Inst<"svmla_lane_za64[_{d}]_vg1x4", "vm4di", "d", MergeNone, "aarch64_sme_fmla_lane_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_1>]>; 4887a6dacacSDimitry Andric def SVMLS_LANE_VG1x2_F64 : Inst<"svmls_lane_za64[_{d}]_vg1x2", "vm2di", "d", MergeNone, "aarch64_sme_fmls_lane_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_1>]>; 4897a6dacacSDimitry Andric def SVMLS_LANE_VG1x4_F64 : Inst<"svmls_lane_za64[_{d}]_vg1x4", "vm4di", "d", MergeNone, "aarch64_sme_fmls_lane_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_1>]>; 490cb14a3feSDimitry Andric} 491cb14a3feSDimitry Andric 492*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme-f16f16" in { 493*0fca6ea1SDimitry Andric def SVMLA_MULTI_VG1x2_F16 : Inst<"svmla_za16[_f16]_vg1x2", "vm22", "h", MergeNone, "aarch64_sme_fmla_vg1x2", [IsStreaming, IsInOutZA], []>; 494*0fca6ea1SDimitry Andric def SVMLA_MULTI_VG1x4_F16 : Inst<"svmla_za16[_f16]_vg1x4", "vm44", "h", MergeNone, "aarch64_sme_fmla_vg1x4", [IsStreaming, IsInOutZA], []>; 495*0fca6ea1SDimitry Andric def SVMLS_MULTI_VG1x2_F16 : Inst<"svmls_za16[_f16]_vg1x2", "vm22", "h", MergeNone, "aarch64_sme_fmls_vg1x2", [IsStreaming, IsInOutZA], []>; 496*0fca6ea1SDimitry Andric def SVMLS_MULTI_VG1x4_F16 : Inst<"svmls_za16[_f16]_vg1x4", "vm44", "h", MergeNone, "aarch64_sme_fmls_vg1x4", [IsStreaming, IsInOutZA], []>; 497*0fca6ea1SDimitry Andric 498*0fca6ea1SDimitry Andric def SVMLA_SINGLE_VG1x2_F16 : Inst<"svmla[_single]_za16[_f16]_vg1x2", "vm2d", "h", MergeNone, "aarch64_sme_fmla_single_vg1x2", [IsStreaming, IsInOutZA], []>; 499*0fca6ea1SDimitry Andric def SVMLA_SINGLE_VG1x4_F16 : Inst<"svmla[_single]_za16[_f16]_vg1x4", "vm4d", "h", MergeNone, "aarch64_sme_fmla_single_vg1x4", [IsStreaming, IsInOutZA], []>; 500*0fca6ea1SDimitry Andric def SVMLS_SINGLE_VG1x2_F16 : Inst<"svmls[_single]_za16[_f16]_vg1x2", "vm2d", "h", MergeNone, "aarch64_sme_fmls_single_vg1x2", [IsStreaming, IsInOutZA], []>; 501*0fca6ea1SDimitry Andric def SVMLS_SINGLE_VG1x4_F16 : Inst<"svmls[_single]_za16[_f16]_vg1x4", "vm4d", "h", MergeNone, "aarch64_sme_fmls_single_vg1x4", [IsStreaming, IsInOutZA], []>; 502*0fca6ea1SDimitry Andric 503*0fca6ea1SDimitry Andric def SVMLA_LANE_VG1x2_F16 : Inst<"svmla_lane_za16[_f16]_vg1x2", "vm2di", "h", MergeNone, "aarch64_sme_fmla_lane_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 504*0fca6ea1SDimitry Andric def SVMLA_LANE_VG1x4_F16 : Inst<"svmla_lane_za16[_f16]_vg1x4", "vm4di", "h", MergeNone, "aarch64_sme_fmla_lane_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 505*0fca6ea1SDimitry Andric def SVMLS_LANE_VG1x2_F16 : Inst<"svmls_lane_za16[_f16]_vg1x2", "vm2di", "h", MergeNone, "aarch64_sme_fmls_lane_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 506*0fca6ea1SDimitry Andric def SVMLS_LANE_VG1x4_F16 : Inst<"svmls_lane_za16[_f16]_vg1x4", "vm4di", "h", MergeNone, "aarch64_sme_fmls_lane_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 507*0fca6ea1SDimitry Andric} 508*0fca6ea1SDimitry Andric 509*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2,b16b16" in { 510*0fca6ea1SDimitry Andric def SVMLA_MULTI_VG1x2_BF16 : Inst<"svmla_za16[_bf16]_vg1x2", "vm22", "b", MergeNone, "aarch64_sme_fmla_vg1x2", [IsStreaming, IsInOutZA], []>; 511*0fca6ea1SDimitry Andric def SVMLA_MULTI_VG1x4_BF16 : Inst<"svmla_za16[_bf16]_vg1x4", "vm44", "b", MergeNone, "aarch64_sme_fmla_vg1x4", [IsStreaming, IsInOutZA], []>; 512*0fca6ea1SDimitry Andric def SVMLS_MULTI_VG1x2_BF16 : Inst<"svmls_za16[_bf16]_vg1x2", "vm22", "b", MergeNone, "aarch64_sme_fmls_vg1x2", [IsStreaming, IsInOutZA], []>; 513*0fca6ea1SDimitry Andric def SVMLS_MULTI_VG1x4_BF16 : Inst<"svmls_za16[_bf16]_vg1x4", "vm44", "b", MergeNone, "aarch64_sme_fmls_vg1x4", [IsStreaming, IsInOutZA], []>; 514*0fca6ea1SDimitry Andric 515*0fca6ea1SDimitry Andric def SVMLA_SINGLE_VG1x2_BF16 : Inst<"svmla[_single]_za16[_bf16]_vg1x2", "vm2d", "b", MergeNone, "aarch64_sme_fmla_single_vg1x2", [IsStreaming, IsInOutZA], []>; 516*0fca6ea1SDimitry Andric def SVMLA_SINGLE_VG1x4_BF16 : Inst<"svmla[_single]_za16[_bf16]_vg1x4", "vm4d", "b", MergeNone, "aarch64_sme_fmla_single_vg1x4", [IsStreaming, IsInOutZA], []>; 517*0fca6ea1SDimitry Andric def SVMLS_SINGLE_VG1x2_BF16 : Inst<"svmls[_single]_za16[_bf16]_vg1x2", "vm2d", "b", MergeNone, "aarch64_sme_fmls_single_vg1x2", [IsStreaming, IsInOutZA], []>; 518*0fca6ea1SDimitry Andric def SVMLS_SINGLE_VG1x4_BF16 : Inst<"svmls[_single]_za16[_bf16]_vg1x4", "vm4d", "b", MergeNone, "aarch64_sme_fmls_single_vg1x4", [IsStreaming, IsInOutZA], []>; 519*0fca6ea1SDimitry Andric 520*0fca6ea1SDimitry Andric def SVMLA_LANE_VG1x2_BF16 : Inst<"svmla_lane_za16[_bf16]_vg1x2", "vm2di", "b", MergeNone, "aarch64_sme_fmla_lane_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 521*0fca6ea1SDimitry Andric def SVMLA_LANE_VG1x4_BF16 : Inst<"svmla_lane_za16[_bf16]_vg1x4", "vm4di", "b", MergeNone, "aarch64_sme_fmla_lane_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 522*0fca6ea1SDimitry Andric def SVMLS_LANE_VG1x2_BF16 : Inst<"svmls_lane_za16[_bf16]_vg1x2", "vm2di", "b", MergeNone, "aarch64_sme_fmls_lane_vg1x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 523*0fca6ea1SDimitry Andric def SVMLS_LANE_VG1x4_BF16 : Inst<"svmls_lane_za16[_bf16]_vg1x4", "vm4di", "b", MergeNone, "aarch64_sme_fmls_lane_vg1x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 524*0fca6ea1SDimitry Andric} 525*0fca6ea1SDimitry Andric 526cb14a3feSDimitry Andric// FMLAL/FMLSL/UMLAL/SMLAL 527cb14a3feSDimitry Andric// SMLALL/UMLALL/USMLALL/SUMLALL 528*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2" in { 529cb14a3feSDimitry Andric // MULTI MLAL 5307a6dacacSDimitry Andric def SVMLAL_MULTI_VG2x2_F16 : Inst<"svmla_za32[_{d}]_vg2x2", "vm22", "bh", MergeNone, "aarch64_sme_fmlal_vg2x2", [IsStreaming, IsInOutZA], []>; 5317a6dacacSDimitry Andric def SVMLAL_MULTI_VG2x4_F16 : Inst<"svmla_za32[_{d}]_vg2x4", "vm44", "bh", MergeNone, "aarch64_sme_fmlal_vg2x4", [IsStreaming, IsInOutZA], []>; 5327a6dacacSDimitry Andric def SVMLAL_MULTI_VG2x2_S16 : Inst<"svmla_za32[_{d}]_vg2x2", "vm22", "s", MergeNone, "aarch64_sme_smlal_vg2x2", [IsStreaming, IsInOutZA], []>; 5337a6dacacSDimitry Andric def SVMLAL_MULTI_VG2x4_S16 : Inst<"svmla_za32[_{d}]_vg2x4", "vm44", "s", MergeNone, "aarch64_sme_smlal_vg2x4", [IsStreaming, IsInOutZA], []>; 5347a6dacacSDimitry Andric def SVMLAL_MULTI_VG2x2_U16 : Inst<"svmla_za32[_{d}]_vg2x2", "vm22", "Us", MergeNone, "aarch64_sme_umlal_vg2x2", [IsStreaming, IsInOutZA], []>; 5357a6dacacSDimitry Andric def SVMLAL_MULTI_VG2x4_U16 : Inst<"svmla_za32[_{d}]_vg2x4", "vm44", "Us", MergeNone, "aarch64_sme_umlal_vg2x4", [IsStreaming, IsInOutZA], []>; 536cb14a3feSDimitry Andric 5377a6dacacSDimitry Andric def SVMLAL_MULTI_VG4x2_S8 : Inst<"svmla_za32[_{d}]_vg4x2", "vm22", "c", MergeNone, "aarch64_sme_smla_za32_vg4x2", [IsStreaming, IsInOutZA], []>; 5387a6dacacSDimitry Andric def SVMLAL_MULTI_VG4x2_U8 : Inst<"svmla_za32[_{d}]_vg4x2", "vm22", "Uc", MergeNone, "aarch64_sme_umla_za32_vg4x2", [IsStreaming, IsInOutZA], []>; 5397a6dacacSDimitry Andric def SVMLAL_MULTI_VG4x4_S8 : Inst<"svmla_za32[_{d}]_vg4x4", "vm44", "c", MergeNone, "aarch64_sme_smla_za32_vg4x4", [IsStreaming, IsInOutZA], []>; 5407a6dacacSDimitry Andric def SVMLAL_MULTI_VG4x4_U8 : Inst<"svmla_za32[_{d}]_vg4x4", "vm44", "Uc", MergeNone, "aarch64_sme_umla_za32_vg4x4", [IsStreaming, IsInOutZA], []>; 541cb14a3feSDimitry Andric 542cb14a3feSDimitry Andric // MULTI MLSL 5437a6dacacSDimitry Andric def SVMLSL_MULTI_VG2x2_F16 : Inst<"svmls_za32[_{d}]_vg2x2", "vm22", "bh", MergeNone, "aarch64_sme_fmlsl_vg2x2", [IsStreaming, IsInOutZA], []>; 5447a6dacacSDimitry Andric def SVMLSL_MULTI_VG2x4_F16 : Inst<"svmls_za32[_{d}]_vg2x4", "vm44", "bh", MergeNone, "aarch64_sme_fmlsl_vg2x4", [IsStreaming, IsInOutZA], []>; 5457a6dacacSDimitry Andric def SVMLSL_MULTI_VG2x2_S16 : Inst<"svmls_za32[_{d}]_vg2x2", "vm22", "s", MergeNone, "aarch64_sme_smlsl_vg2x2", [IsStreaming, IsInOutZA], []>; 5467a6dacacSDimitry Andric def SVMLSL_MULTI_VG2x4_S16 : Inst<"svmls_za32[_{d}]_vg2x4", "vm44", "s", MergeNone, "aarch64_sme_smlsl_vg2x4", [IsStreaming, IsInOutZA], []>; 5477a6dacacSDimitry Andric def SVMLSL_MULTI_VG2x2_U16 : Inst<"svmls_za32[_{d}]_vg2x2", "vm22", "Us", MergeNone, "aarch64_sme_umlsl_vg2x2", [IsStreaming, IsInOutZA], []>; 5487a6dacacSDimitry Andric def SVMLSL_MULTI_VG2x4_U16 : Inst<"svmls_za32[_{d}]_vg2x4", "vm44", "Us", MergeNone, "aarch64_sme_umlsl_vg2x4", [IsStreaming, IsInOutZA], []>; 549cb14a3feSDimitry Andric 5507a6dacacSDimitry Andric def SVMLSL_MULTI_VG4x2_S8 : Inst<"svmls_za32[_{d}]_vg4x2", "vm22", "c", MergeNone, "aarch64_sme_smls_za32_vg4x2", [IsStreaming, IsInOutZA], []>; 5517a6dacacSDimitry Andric def SVMLSL_MULTI_VG4x2_U8 : Inst<"svmls_za32[_{d}]_vg4x2", "vm22", "Uc", MergeNone, "aarch64_sme_umls_za32_vg4x2", [IsStreaming, IsInOutZA], []>; 5527a6dacacSDimitry Andric def SVMLSL_MULTI_VG4x4_S8 : Inst<"svmls_za32[_{d}]_vg4x4", "vm44", "c", MergeNone, "aarch64_sme_smls_za32_vg4x4", [IsStreaming, IsInOutZA], []>; 5537a6dacacSDimitry Andric def SVMLSL_MULTI_VG4x4_U8 : Inst<"svmls_za32[_{d}]_vg4x4", "vm44", "Uc", MergeNone, "aarch64_sme_umls_za32_vg4x4", [IsStreaming, IsInOutZA], []>; 554cb14a3feSDimitry Andric 555cb14a3feSDimitry Andric // SINGLE MLAL 5567a6dacacSDimitry Andric def SVMLAL_SINGLE_VG2x1_F16 : Inst<"svmla_za32[_{d}]_vg2x1", "vmdd", "bh", MergeNone, "aarch64_sme_fmlal_single_vg2x1", [IsStreaming, IsInOutZA], []>; 5577a6dacacSDimitry Andric def SVMLAL_SINGLE_VG2x2_F16 : Inst<"svmla[_single]_za32[_{d}]_vg2x2", "vm2d", "bh", MergeNone, "aarch64_sme_fmlal_single_vg2x2", [IsStreaming, IsInOutZA], []>; 5587a6dacacSDimitry Andric def SVMLAL_SINGLE_VG2x4_F16 : Inst<"svmla[_single]_za32[_{d}]_vg2x4", "vm4d", "bh", MergeNone, "aarch64_sme_fmlal_single_vg2x4", [IsStreaming, IsInOutZA], []>; 5597a6dacacSDimitry Andric def SVMLAL_SINGLE_VG2x1_S16 : Inst<"svmla_za32[_{d}]_vg2x1", "vmdd", "s", MergeNone, "aarch64_sme_smlal_single_vg2x1", [IsStreaming, IsInOutZA], []>; 5607a6dacacSDimitry Andric def SVMLAL_SINGLE_VG2x2_S16 : Inst<"svmla[_single]_za32[_{d}]_vg2x2", "vm2d", "s", MergeNone, "aarch64_sme_smlal_single_vg2x2", [IsStreaming, IsInOutZA], []>; 5617a6dacacSDimitry Andric def SVMLAL_SINGLE_VG2x4_S16 : Inst<"svmla[_single]_za32[_{d}]_vg2x4", "vm4d", "s", MergeNone, "aarch64_sme_smlal_single_vg2x4", [IsStreaming, IsInOutZA], []>; 5627a6dacacSDimitry Andric def SVMLAL_SINGLE_VG2x1_U16 : Inst<"svmla_za32[_{d}]_vg2x1", "vmdd", "Us", MergeNone, "aarch64_sme_umlal_single_vg2x1", [IsStreaming, IsInOutZA], []>; 5637a6dacacSDimitry Andric def SVMLAL_SINGLE_VG2x2_U16 : Inst<"svmla[_single]_za32[_{d}]_vg2x2", "vm2d", "Us", MergeNone, "aarch64_sme_umlal_single_vg2x2", [IsStreaming, IsInOutZA], []>; 5647a6dacacSDimitry Andric def SVMLAL_SINGLE_VG2x4_U16 : Inst<"svmla[_single]_za32[_{d}]_vg2x4", "vm4d", "Us", MergeNone, "aarch64_sme_umlal_single_vg2x4", [IsStreaming, IsInOutZA], []>; 565cb14a3feSDimitry Andric 5667a6dacacSDimitry Andric def SVMLAL_SINGLE_VG4x1_S8 : Inst<"svmla_za32[_{d}]_vg4x1", "vmdd", "c", MergeNone, "aarch64_sme_smla_za32_single_vg4x1", [IsStreaming, IsInOutZA], []>; 5677a6dacacSDimitry Andric def SVMLAL_SINGLE_VG4x1_U8 : Inst<"svmla_za32[_{d}]_vg4x1", "vmdd", "Uc", MergeNone, "aarch64_sme_umla_za32_single_vg4x1", [IsStreaming, IsInOutZA], []>; 5687a6dacacSDimitry Andric def SVMLAL_SINGLE_VG4x2_S8 : Inst<"svmla[_single]_za32[_{d}]_vg4x2", "vm2d", "c", MergeNone, "aarch64_sme_smla_za32_single_vg4x2", [IsStreaming, IsInOutZA], []>; 5697a6dacacSDimitry Andric def SVMLAL_SINGLE_VG4x2_U8 : Inst<"svmla[_single]_za32[_{d}]_vg4x2", "vm2d", "Uc", MergeNone, "aarch64_sme_umla_za32_single_vg4x2", [IsStreaming, IsInOutZA], []>; 5707a6dacacSDimitry Andric def SVMLAL_SINGLE_VG4x4_S8 : Inst<"svmla[_single]_za32[_{d}]_vg4x4", "vm4d", "c", MergeNone, "aarch64_sme_smla_za32_single_vg4x4", [IsStreaming, IsInOutZA], []>; 5717a6dacacSDimitry Andric def SVMLAL_SINGLE_VG4x4_U8 : Inst<"svmla[_single]_za32[_{d}]_vg4x4", "vm4d", "Uc", MergeNone, "aarch64_sme_umla_za32_single_vg4x4", [IsStreaming, IsInOutZA], []>; 572cb14a3feSDimitry Andric 573cb14a3feSDimitry Andric // SINGLE MLSL 5747a6dacacSDimitry Andric def SVMLSL_SINGLE_VG2x1_F16 : Inst<"svmls_za32[_{d}]_vg2x1", "vmdd", "bh", MergeNone, "aarch64_sme_fmlsl_single_vg2x1", [IsStreaming, IsInOutZA], []>; 5757a6dacacSDimitry Andric def SVMLSL_SINGLE_VG2x2_F16 : Inst<"svmls[_single]_za32[_{d}]_vg2x2", "vm2d", "bh", MergeNone, "aarch64_sme_fmlsl_single_vg2x2", [IsStreaming, IsInOutZA], []>; 5767a6dacacSDimitry Andric def SVMLSL_SINGLE_VG2x4_F16 : Inst<"svmls[_single]_za32[_{d}]_vg2x4", "vm4d", "bh", MergeNone, "aarch64_sme_fmlsl_single_vg2x4", [IsStreaming, IsInOutZA], []>; 5777a6dacacSDimitry Andric def SVMLSL_SINGLE_VG2x1_S16 : Inst<"svmls_za32[_{d}]_vg2x1", "vmdd", "s", MergeNone, "aarch64_sme_smlsl_single_vg2x1", [IsStreaming, IsInOutZA], []>; 5787a6dacacSDimitry Andric def SVMLSL_SINGLE_VG2x2_S16 : Inst<"svmls[_single]_za32[_{d}]_vg2x2", "vm2d", "s", MergeNone, "aarch64_sme_smlsl_single_vg2x2", [IsStreaming, IsInOutZA], []>; 5797a6dacacSDimitry Andric def SVMLSL_SINGLE_VG2x4_S16 : Inst<"svmls[_single]_za32[_{d}]_vg2x4", "vm4d", "s", MergeNone, "aarch64_sme_smlsl_single_vg2x4", [IsStreaming, IsInOutZA], []>; 5807a6dacacSDimitry Andric def SVMLSL_SINGLE_VG2x1_U16 : Inst<"svmls_za32[_{d}]_vg2x1", "vmdd", "Us", MergeNone, "aarch64_sme_umlsl_single_vg2x1", [IsStreaming, IsInOutZA], []>; 5817a6dacacSDimitry Andric def SVMLSL_SINGLE_VG2x2_U16 : Inst<"svmls[_single]_za32[_{d}]_vg2x2", "vm2d", "Us", MergeNone, "aarch64_sme_umlsl_single_vg2x2", [IsStreaming, IsInOutZA], []>; 5827a6dacacSDimitry Andric def SVMLSL_SINGLE_VG2x4_U16 : Inst<"svmls[_single]_za32[_{d}]_vg2x4", "vm4d", "Us", MergeNone, "aarch64_sme_umlsl_single_vg2x4", [IsStreaming, IsInOutZA], []>; 583cb14a3feSDimitry Andric 5847a6dacacSDimitry Andric def SVMLSL_SINGLE_VG4x1_S8 : Inst<"svmls_za32[_{d}]_vg4x1", "vmdd", "c", MergeNone, "aarch64_sme_smls_za32_single_vg4x1", [IsStreaming, IsInOutZA], []>; 5857a6dacacSDimitry Andric def SVMLSL_SINGLE_VG4x1_U8 : Inst<"svmls_za32[_{d}]_vg4x1", "vmdd", "Uc", MergeNone, "aarch64_sme_umls_za32_single_vg4x1", [IsStreaming, IsInOutZA], []>; 5867a6dacacSDimitry Andric def SVMLSL_SINGLE_VG4x2_S8 : Inst<"svmls[_single]_za32[_{d}]_vg4x2", "vm2d", "c", MergeNone, "aarch64_sme_smls_za32_single_vg4x2", [IsStreaming, IsInOutZA], []>; 5877a6dacacSDimitry Andric def SVMLSL_SINGLE_VG4x2_U8 : Inst<"svmls[_single]_za32[_{d}]_vg4x2", "vm2d", "Uc", MergeNone, "aarch64_sme_umls_za32_single_vg4x2", [IsStreaming, IsInOutZA], []>; 5887a6dacacSDimitry Andric def SVMLSL_SINGLE_VG4x4_S8 : Inst<"svmls[_single]_za32[_{d}]_vg4x4", "vm4d", "c", MergeNone, "aarch64_sme_smls_za32_single_vg4x4", [IsStreaming, IsInOutZA], []>; 5897a6dacacSDimitry Andric def SVMLSL_SINGLE_VG4x4_U8 : Inst<"svmls[_single]_za32[_{d}]_vg4x4", "vm4d", "Uc", MergeNone, "aarch64_sme_umls_za32_single_vg4x4", [IsStreaming, IsInOutZA], []>; 590cb14a3feSDimitry Andric 591cb14a3feSDimitry Andric // INDEXED MLAL 5927a6dacacSDimitry Andric def SVMLAL_LANE_VG2x1_F16 : Inst<"svmla_lane_za32[_{d}]_vg2x1", "vmddi", "bh", MergeNone, "aarch64_sme_fmlal_lane_vg2x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 5937a6dacacSDimitry Andric def SVMLAL_LANE_VG2x2_F16 : Inst<"svmla_lane_za32[_{d}]_vg2x2", "vm2di", "bh", MergeNone, "aarch64_sme_fmlal_lane_vg2x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 5947a6dacacSDimitry Andric def SVMLAL_LANE_VG2x4_F16 : Inst<"svmla_lane_za32[_{d}]_vg2x4", "vm4di", "bh", MergeNone, "aarch64_sme_fmlal_lane_vg2x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 5957a6dacacSDimitry Andric def SVMLAL_LANE_VG2x1_S16 : Inst<"svmla_lane_za32[_{d}]_vg2x1", "vmddi", "s", MergeNone, "aarch64_sme_smlal_lane_vg2x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 5967a6dacacSDimitry Andric def SVMLAL_LANE_VG2x2_S16 : Inst<"svmla_lane_za32[_{d}]_vg2x2", "vm2di", "s", MergeNone, "aarch64_sme_smlal_lane_vg2x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 5977a6dacacSDimitry Andric def SVMLAL_LANE_VG2x4_S16 : Inst<"svmla_lane_za32[_{d}]_vg2x4", "vm4di", "s", MergeNone, "aarch64_sme_smlal_lane_vg2x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 5987a6dacacSDimitry Andric def SVMLAL_LANE_VG2x1_U16 : Inst<"svmla_lane_za32[_{d}]_vg2x1", "vmddi", "Us", MergeNone, "aarch64_sme_umlal_lane_vg2x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 5997a6dacacSDimitry Andric def SVMLAL_LANE_VG2x2_U16 : Inst<"svmla_lane_za32[_{d}]_vg2x2", "vm2di", "Us", MergeNone, "aarch64_sme_umlal_lane_vg2x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6007a6dacacSDimitry Andric def SVMLAL_LANE_VG2x4_U16 : Inst<"svmla_lane_za32[_{d}]_vg2x4", "vm4di", "Us", MergeNone, "aarch64_sme_umlal_lane_vg2x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 601cb14a3feSDimitry Andric 6027a6dacacSDimitry Andric def SVMLAL_LANE_VG4x1_S8 : Inst<"svmla_lane_za32[_{d}]_vg4x1", "vmddi", "c", MergeNone, "aarch64_sme_smla_za32_lane_vg4x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6037a6dacacSDimitry Andric def SVMLAL_LANE_VG4x1_U8 : Inst<"svmla_lane_za32[_{d}]_vg4x1", "vmddi", "Uc", MergeNone, "aarch64_sme_umla_za32_lane_vg4x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6047a6dacacSDimitry Andric def SVMLAL_LANE_VG4x2_S8 : Inst<"svmla_lane_za32[_{d}]_vg4x2", "vm2di", "c", MergeNone, "aarch64_sme_smla_za32_lane_vg4x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6057a6dacacSDimitry Andric def SVMLAL_LANE_VG4x2_U8 : Inst<"svmla_lane_za32[_{d}]_vg4x2", "vm2di", "Uc", MergeNone, "aarch64_sme_umla_za32_lane_vg4x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6067a6dacacSDimitry Andric def SVMLAL_LANE_VG4x4_S8 : Inst<"svmla_lane_za32[_{d}]_vg4x4", "vm4di", "c", MergeNone, "aarch64_sme_smla_za32_lane_vg4x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6077a6dacacSDimitry Andric def SVMLAL_LANE_VG4x4_U8 : Inst<"svmla_lane_za32[_{d}]_vg4x4", "vm4di", "Uc", MergeNone, "aarch64_sme_umla_za32_lane_vg4x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 608cb14a3feSDimitry Andric 609cb14a3feSDimitry Andric // INDEXED MLSL 6107a6dacacSDimitry Andric def SVMLSL_LANE_VG2x1_F16 : Inst<"svmls_lane_za32[_{d}]_vg2x1", "vmddi", "bh", MergeNone, "aarch64_sme_fmlsl_lane_vg2x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6117a6dacacSDimitry Andric def SVMLSL_LANE_VG2x2_F16 : Inst<"svmls_lane_za32[_{d}]_vg2x2", "vm2di", "bh", MergeNone, "aarch64_sme_fmlsl_lane_vg2x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6127a6dacacSDimitry Andric def SVMLSL_LANE_VG2x4_F16 : Inst<"svmls_lane_za32[_{d}]_vg2x4", "vm4di", "bh", MergeNone, "aarch64_sme_fmlsl_lane_vg2x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6137a6dacacSDimitry Andric def SVMLSL_LANE_VG2x1_S16 : Inst<"svmls_lane_za32[_{d}]_vg2x1", "vmddi", "s", MergeNone, "aarch64_sme_smlsl_lane_vg2x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6147a6dacacSDimitry Andric def SVMLSL_LANE_VG2x2_S16 : Inst<"svmls_lane_za32[_{d}]_vg2x2", "vm2di", "s", MergeNone, "aarch64_sme_smlsl_lane_vg2x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6157a6dacacSDimitry Andric def SVMLSL_LANE_VG2x4_S16 : Inst<"svmls_lane_za32[_{d}]_vg2x4", "vm4di", "s", MergeNone, "aarch64_sme_smlsl_lane_vg2x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6167a6dacacSDimitry Andric def SVMLSL_LANE_VG2x1_U16 : Inst<"svmls_lane_za32[_{d}]_vg2x1", "vmddi", "Us", MergeNone, "aarch64_sme_umlsl_lane_vg2x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6177a6dacacSDimitry Andric def SVMLSL_LANE_VG2x2_U16 : Inst<"svmls_lane_za32[_{d}]_vg2x2", "vm2di", "Us", MergeNone, "aarch64_sme_umlsl_lane_vg2x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6187a6dacacSDimitry Andric def SVMLSL_LANE_VG2x4_U16 : Inst<"svmls_lane_za32[_{d}]_vg2x4", "vm4di", "Us", MergeNone, "aarch64_sme_umlsl_lane_vg2x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 619cb14a3feSDimitry Andric 6207a6dacacSDimitry Andric def SVMLSL_LANE_VG4x1_S8 : Inst<"svmls_lane_za32[_{d}]_vg4x1", "vmddi", "c", MergeNone, "aarch64_sme_smls_za32_lane_vg4x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6217a6dacacSDimitry Andric def SVMLSL_LANE_VG4x1_U8 : Inst<"svmls_lane_za32[_{d}]_vg4x1", "vmddi", "Uc", MergeNone, "aarch64_sme_umls_za32_lane_vg4x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6227a6dacacSDimitry Andric def SVMLSL_LANE_VG4x2_S8 : Inst<"svmls_lane_za32[_{d}]_vg4x2", "vm2di", "c", MergeNone, "aarch64_sme_smls_za32_lane_vg4x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6237a6dacacSDimitry Andric def SVMLSL_LANE_VG4x2_U8 : Inst<"svmls_lane_za32[_{d}]_vg4x2", "vm2di", "Uc", MergeNone, "aarch64_sme_umls_za32_lane_vg4x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6247a6dacacSDimitry Andric def SVMLSL_LANE_VG4x4_S8 : Inst<"svmls_lane_za32[_{d}]_vg4x4", "vm4di", "c", MergeNone, "aarch64_sme_smls_za32_lane_vg4x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6257a6dacacSDimitry Andric def SVMLSL_LANE_VG4x4_U8 : Inst<"svmls_lane_za32[_{d}]_vg4x4", "vm4di", "Uc", MergeNone, "aarch64_sme_umls_za32_lane_vg4x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 626cb14a3feSDimitry Andric 627cb14a3feSDimitry Andric // SINGLE SUMLALL 628cb14a3feSDimitry Andric // Single sumla maps to usmla, with zn & zm operands swapped 6297a6dacacSDimitry Andric def SVSUMLALL_SINGLE_VG4x1 : Inst<"svsumla_za32[_{d}]_vg4x1", "vmdu", "c", MergeNone, "aarch64_sme_usmla_za32_single_vg4x1", [IsStreaming, IsInOutZA], []>; 630cb14a3feSDimitry Andric 6317a6dacacSDimitry Andric def SVSUMLALL_SINGLE_VG4x2 : Inst<"svsumla[_single]_za32[_{d}]_vg4x2", "vm2.du", "c", MergeNone, "aarch64_sme_sumla_za32_single_vg4x2", [IsStreaming, IsInOutZA], []>; 6327a6dacacSDimitry Andric def SVSUMLALL_SINGLE_VG4x4 : Inst<"svsumla[_single]_za32[_{d}]_vg4x4", "vm4.du", "c", MergeNone, "aarch64_sme_sumla_za32_single_vg4x4", [IsStreaming, IsInOutZA], []>; 633cb14a3feSDimitry Andric 634cb14a3feSDimitry Andric // Multi-multi sumla builtins are mapped to usmla, with zn & zm operands swapped 6357a6dacacSDimitry Andric def SVSUMLALL_MULTI_VG4x2 : Inst<"svsumla_za32[_{d}]_vg4x2", "vm2.d2.u", "c", MergeNone, "aarch64_sme_usmla_za32_vg4x2", [IsStreaming, IsInOutZA], []>; 6367a6dacacSDimitry Andric def SVSUMLALL_MULTI_VG4x4 : Inst<"svsumla_za32[_{d}]_vg4x4", "vm4.d4.u", "c", MergeNone, "aarch64_sme_usmla_za32_vg4x4", [IsStreaming, IsInOutZA], []>; 637cb14a3feSDimitry Andric 638cb14a3feSDimitry Andric // INDEXED SUMLALL 6397a6dacacSDimitry Andric def SVSUMLALL_LANE_VG4x1 : Inst<"svsumla_lane_za32[_{d}]_vg4x1", "vmdui", "c", MergeNone, "aarch64_sme_sumla_za32_lane_vg4x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6407a6dacacSDimitry Andric def SVSUMLALL_LANE_VG4x2 : Inst<"svsumla_lane_za32[_{d}]_vg4x2", "vm2ui", "c", MergeNone, "aarch64_sme_sumla_za32_lane_vg4x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6417a6dacacSDimitry Andric def SVSUMLALL_LANE_VG4x4 : Inst<"svsumla_lane_za32[_{d}]_vg4x4", "vm4ui", "c", MergeNone, "aarch64_sme_sumla_za32_lane_vg4x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 642cb14a3feSDimitry Andric 643cb14a3feSDimitry Andric // SINGLE USMLALL 6447a6dacacSDimitry Andric def SVUSMLALL_SINGLE_VG4x1 : Inst<"svusmla_za32[_{d}]_vg4x1", "vmdx", "Uc", MergeNone, "aarch64_sme_usmla_za32_single_vg4x1", [IsStreaming, IsInOutZA], []>; 6457a6dacacSDimitry Andric def SVUSMLALL_SINGLE_VG4x2 : Inst<"svusmla[_single]_za32[_{d}]_vg4x2", "vm2.dx", "Uc", MergeNone, "aarch64_sme_usmla_za32_single_vg4x2", [IsStreaming, IsInOutZA], []>; 6467a6dacacSDimitry Andric def SVUSMLALL_SINGLE_VG4x4 : Inst<"svusmla[_single]_za32[_{d}]_vg4x4", "vm4.dx", "Uc", MergeNone, "aarch64_sme_usmla_za32_single_vg4x4", [IsStreaming, IsInOutZA], []>; 647cb14a3feSDimitry Andric 648cb14a3feSDimitry Andric // MULTI USMLALL 6497a6dacacSDimitry Andric def SVUSMLALL_MULTI_VG4x2 : Inst<"svusmla_za32[_{d}]_vg4x2", "vm2.d2.x", "Uc", MergeNone, "aarch64_sme_usmla_za32_vg4x2", [IsStreaming, IsInOutZA], []>; 6507a6dacacSDimitry Andric def SVUSMLALL_MULTI_VG4x4 : Inst<"svusmla_za32[_{d}]_vg4x4", "vm4.d4.x", "Uc", MergeNone, "aarch64_sme_usmla_za32_vg4x4", [IsStreaming, IsInOutZA], []>; 651cb14a3feSDimitry Andric 652cb14a3feSDimitry Andric // INDEXED USMLALL 6537a6dacacSDimitry Andric def SVUSMLALL_LANE_VG4x1 : Inst<"svusmla_lane_za32[_{d}]_vg4x1", "vmdxi", "Uc", MergeNone, "aarch64_sme_usmla_za32_lane_vg4x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6547a6dacacSDimitry Andric def SVUSMLALL_LANE_VG4x2 : Inst<"svusmla_lane_za32[_{d}]_vg4x2", "vm2xi", "Uc", MergeNone, "aarch64_sme_usmla_za32_lane_vg4x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 6557a6dacacSDimitry Andric def SVUSMLALL_LANE_VG4x4 : Inst<"svusmla_lane_za32[_{d}]_vg4x4", "vm4xi", "Uc", MergeNone, "aarch64_sme_usmla_za32_lane_vg4x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_15>]>; 656cb14a3feSDimitry Andric} 657cb14a3feSDimitry Andric 658*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2,sme-i16i64" in { 659cb14a3feSDimitry Andric // MULTI MLAL 6607a6dacacSDimitry Andric def SVMLAL_MULTI_VG4x2_S16 : Inst<"svmla_za64[_{d}]_vg4x2", "vm22", "s", MergeNone, "aarch64_sme_smla_za64_vg4x2", [IsStreaming, IsInOutZA], []>; 6617a6dacacSDimitry Andric def SVMLAL_MULTI_VG4x2_U16 : Inst<"svmla_za64[_{d}]_vg4x2", "vm22", "Us", MergeNone, "aarch64_sme_umla_za64_vg4x2", [IsStreaming, IsInOutZA], []>; 6627a6dacacSDimitry Andric def SVMLAL_MULTI_VG4x4_S16 : Inst<"svmla_za64[_{d}]_vg4x4", "vm44", "s", MergeNone, "aarch64_sme_smla_za64_vg4x4", [IsStreaming, IsInOutZA], []>; 6637a6dacacSDimitry Andric def SVMLAL_MULTI_VG4x4_U16 : Inst<"svmla_za64[_{d}]_vg4x4", "vm44", "Us", MergeNone, "aarch64_sme_umla_za64_vg4x4", [IsStreaming, IsInOutZA], []>; 664cb14a3feSDimitry Andric 665cb14a3feSDimitry Andric // MULTI MLSL 6667a6dacacSDimitry Andric def SVMLSL_MULTI_VG4x2_S16 : Inst<"svmls_za64[_{d}]_vg4x2", "vm22", "s", MergeNone, "aarch64_sme_smls_za64_vg4x2", [IsStreaming, IsInOutZA], []>; 6677a6dacacSDimitry Andric def SVMLSL_MULTI_VG4x2_U16 : Inst<"svmls_za64[_{d}]_vg4x2", "vm22", "Us", MergeNone, "aarch64_sme_umls_za64_vg4x2", [IsStreaming, IsInOutZA], []>; 6687a6dacacSDimitry Andric def SVMLSL_MULTI_VG4x4_S16 : Inst<"svmls_za64[_{d}]_vg4x4", "vm44", "s", MergeNone, "aarch64_sme_smls_za64_vg4x4", [IsStreaming, IsInOutZA], []>; 6697a6dacacSDimitry Andric def SVMLSL_MULTI_VG4x4_U16 : Inst<"svmls_za64[_{d}]_vg4x4", "vm44", "Us", MergeNone, "aarch64_sme_umls_za64_vg4x4", [IsStreaming, IsInOutZA], []>; 670cb14a3feSDimitry Andric 671cb14a3feSDimitry Andric // SINGLE MLAL 6727a6dacacSDimitry Andric def SVMLAL_SINGLE_VG4x1_S16 : Inst<"svmla_za64[_{d}]_vg4x1", "vmdd", "s", MergeNone, "aarch64_sme_smla_za64_single_vg4x1", [IsStreaming, IsInOutZA], []>; 6737a6dacacSDimitry Andric def SVMLAL_SINGLE_VG4x1_U16 : Inst<"svmla_za64[_{d}]_vg4x1", "vmdd", "Us", MergeNone, "aarch64_sme_umla_za64_single_vg4x1", [IsStreaming, IsInOutZA], []>; 6747a6dacacSDimitry Andric def SVMLAL_SINGLE_VG4x2_S16 : Inst<"svmla[_single]_za64[_{d}]_vg4x2", "vm2d", "s", MergeNone, "aarch64_sme_smla_za64_single_vg4x2", [IsStreaming, IsInOutZA], []>; 6757a6dacacSDimitry Andric def SVMLAL_SINGLE_VG4x2_U16 : Inst<"svmla[_single]_za64[_{d}]_vg4x2", "vm2d", "Us", MergeNone, "aarch64_sme_umla_za64_single_vg4x2", [IsStreaming, IsInOutZA], []>; 6767a6dacacSDimitry Andric def SVMLAL_SINGLE_VG4x4_S16 : Inst<"svmla[_single]_za64[_{d}]_vg4x4", "vm4d", "s", MergeNone, "aarch64_sme_smla_za64_single_vg4x4", [IsStreaming, IsInOutZA], []>; 6777a6dacacSDimitry Andric def SVMLAL_SINGLE_VG4x4_U16 : Inst<"svmla[_single]_za64[_{d}]_vg4x4", "vm4d", "Us", MergeNone, "aarch64_sme_umla_za64_single_vg4x4", [IsStreaming, IsInOutZA], []>; 678cb14a3feSDimitry Andric 679cb14a3feSDimitry Andric // SINGLE MLSL 6807a6dacacSDimitry Andric def SVMLSL_SINGLE_VG4x1_S16 : Inst<"svmls_za64[_{d}]_vg4x1", "vmdd", "s", MergeNone, "aarch64_sme_smls_za64_single_vg4x1", [IsStreaming, IsInOutZA], []>; 6817a6dacacSDimitry Andric def SVMLSL_SINGLE_VG4x1_U16 : Inst<"svmls_za64[_{d}]_vg4x1", "vmdd", "Us", MergeNone, "aarch64_sme_umls_za64_single_vg4x1", [IsStreaming, IsInOutZA], []>; 6827a6dacacSDimitry Andric def SVMLSL_SINGLE_VG4x2_S16 : Inst<"svmls[_single]_za64[_{d}]_vg4x2", "vm2d", "s", MergeNone, "aarch64_sme_smls_za64_single_vg4x2", [IsStreaming, IsInOutZA], []>; 6837a6dacacSDimitry Andric def SVMLSL_SINGLE_VG4x2_U16 : Inst<"svmls[_single]_za64[_{d}]_vg4x2", "vm2d", "Us", MergeNone, "aarch64_sme_umls_za64_single_vg4x2", [IsStreaming, IsInOutZA], []>; 6847a6dacacSDimitry Andric def SVMLSL_SINGLE_VG4x4_S16 : Inst<"svmls[_single]_za64[_{d}]_vg4x4", "vm4d", "s", MergeNone, "aarch64_sme_smls_za64_single_vg4x4", [IsStreaming, IsInOutZA], []>; 6857a6dacacSDimitry Andric def SVMLSL_SINGLE_VG4x4_U16 : Inst<"svmls[_single]_za64[_{d}]_vg4x4", "vm4d", "Us", MergeNone, "aarch64_sme_umls_za64_single_vg4x4", [IsStreaming, IsInOutZA], []>; 686cb14a3feSDimitry Andric 687cb14a3feSDimitry Andric // INDEXED MLAL 6887a6dacacSDimitry Andric def SVMLAL_LANE_VG4x1_S16 : Inst<"svmla_lane_za64[_{d}]_vg4x1", "vmddi", "s", MergeNone, "aarch64_sme_smla_za64_lane_vg4x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6897a6dacacSDimitry Andric def SVMLAL_LANE_VG4x1_U16 : Inst<"svmla_lane_za64[_{d}]_vg4x1", "vmddi", "Us", MergeNone, "aarch64_sme_umla_za64_lane_vg4x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6907a6dacacSDimitry Andric def SVMLAL_LANE_VG4x2_S16 : Inst<"svmla_lane_za64[_{d}]_vg4x2", "vm2di", "s", MergeNone, "aarch64_sme_smla_za64_lane_vg4x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6917a6dacacSDimitry Andric def SVMLAL_LANE_VG4x2_U16 : Inst<"svmla_lane_za64[_{d}]_vg4x2", "vm2di", "Us", MergeNone, "aarch64_sme_umla_za64_lane_vg4x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6927a6dacacSDimitry Andric def SVMLAL_LANE_VG4x4_S16 : Inst<"svmla_lane_za64[_{d}]_vg4x4", "vm4di", "s", MergeNone, "aarch64_sme_smla_za64_lane_vg4x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6937a6dacacSDimitry Andric def SVMLAL_LANE_VG4x4_U16 : Inst<"svmla_lane_za64[_{d}]_vg4x4", "vm4di", "Us", MergeNone, "aarch64_sme_umla_za64_lane_vg4x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 694cb14a3feSDimitry Andric 695cb14a3feSDimitry Andric // INDEXED MLSL 6967a6dacacSDimitry Andric def SVMLSL_LANE_VG4x1_S16 : Inst<"svmls_lane_za64[_{d}]_vg4x1", "vmddi", "s", MergeNone, "aarch64_sme_smls_za64_lane_vg4x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6977a6dacacSDimitry Andric def SVMLSL_LANE_VG4x1_U16 : Inst<"svmls_lane_za64[_{d}]_vg4x1", "vmddi", "Us", MergeNone, "aarch64_sme_umls_za64_lane_vg4x1", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6987a6dacacSDimitry Andric def SVMLSL_LANE_VG4x2_S16 : Inst<"svmls_lane_za64[_{d}]_vg4x2", "vm2di", "s", MergeNone, "aarch64_sme_smls_za64_lane_vg4x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 6997a6dacacSDimitry Andric def SVMLSL_LANE_VG4x2_U16 : Inst<"svmls_lane_za64[_{d}]_vg4x2", "vm2di", "Us", MergeNone, "aarch64_sme_umls_za64_lane_vg4x2", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 7007a6dacacSDimitry Andric def SVMLSL_LANE_VG4x4_S16 : Inst<"svmls_lane_za64[_{d}]_vg4x4", "vm4di", "s", MergeNone, "aarch64_sme_smls_za64_lane_vg4x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 7017a6dacacSDimitry Andric def SVMLSL_LANE_VG4x4_U16 : Inst<"svmls_lane_za64[_{d}]_vg4x4", "vm4di", "Us", MergeNone, "aarch64_sme_umls_za64_lane_vg4x4", [IsStreaming, IsInOutZA], [ImmCheck<3, ImmCheck0_7>]>; 7025f757f3fSDimitry Andric} 7035f757f3fSDimitry Andric 7045f757f3fSDimitry Andric// 7055f757f3fSDimitry Andric// Spill and fill of ZT0 7065f757f3fSDimitry Andric// 707*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2" in { 7087a6dacacSDimitry Andric def SVLDR_ZT : Inst<"svldr_zt", "viQ", "", MergeNone, "aarch64_sme_ldr_zt", [IsOverloadNone, IsStreamingCompatible, IsInOutZT0], [ImmCheck<0, ImmCheck0_0>]>; 7097a6dacacSDimitry Andric def SVSTR_ZT : Inst<"svstr_zt", "vi%", "", MergeNone, "aarch64_sme_str_zt", [IsOverloadNone, IsStreamingCompatible, IsInZT0], [ImmCheck<0, ImmCheck0_0>]>; 7105f757f3fSDimitry Andric} 7115f757f3fSDimitry Andric 7125f757f3fSDimitry Andric// 7135f757f3fSDimitry Andric// Zero ZT0 7145f757f3fSDimitry Andric// 715*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2" in { 7167a6dacacSDimitry Andric def SVZERO_ZT : Inst<"svzero_zt", "vi", "", MergeNone, "aarch64_sme_zero_zt", [IsOverloadNone, IsStreamingCompatible, IsOutZT0], [ImmCheck<0, ImmCheck0_0>]>; 7175f757f3fSDimitry Andric} 7185f757f3fSDimitry Andric 7195f757f3fSDimitry Andric// 7205f757f3fSDimitry Andric// lookup table expand four contiguous registers 7215f757f3fSDimitry Andric// 722*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2" in { 7237a6dacacSDimitry Andric def SVLUTI2_LANE_ZT_X4 : Inst<"svluti2_lane_zt_{d}_x4", "4.di[i", "cUcsUsiUibhf", MergeNone, "aarch64_sme_luti2_lane_zt_x4", [IsStreaming, IsInZT0], [ImmCheck<0, ImmCheck0_0>, ImmCheck<2, ImmCheck0_3>]>; 7247a6dacacSDimitry Andric def SVLUTI4_LANE_ZT_X4 : Inst<"svluti4_lane_zt_{d}_x4", "4.di[i", "sUsiUibhf", MergeNone, "aarch64_sme_luti4_lane_zt_x4", [IsStreaming, IsInZT0], [ImmCheck<0, ImmCheck0_0>, ImmCheck<2, ImmCheck0_1>]>; 7255f757f3fSDimitry Andric} 7265f757f3fSDimitry Andric 7275f757f3fSDimitry Andric// 7285f757f3fSDimitry Andric// lookup table expand one register 7295f757f3fSDimitry Andric// 730*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2" in { 7317a6dacacSDimitry Andric def SVLUTI2_LANE_ZT : Inst<"svluti2_lane_zt_{d}", "di[i", "cUcsUsiUibhf", MergeNone, "aarch64_sme_luti2_lane_zt", [IsStreaming, IsInZT0], [ImmCheck<0, ImmCheck0_0>, ImmCheck<2, ImmCheck0_15>]>; 7327a6dacacSDimitry Andric def SVLUTI4_LANE_ZT : Inst<"svluti4_lane_zt_{d}", "di[i", "cUcsUsiUibhf", MergeNone, "aarch64_sme_luti4_lane_zt", [IsStreaming, IsInZT0], [ImmCheck<0, ImmCheck0_0>, ImmCheck<2, ImmCheck0_7>]>; 7335f757f3fSDimitry Andric} 7345f757f3fSDimitry Andric 7355f757f3fSDimitry Andric// 7365f757f3fSDimitry Andric// lookup table expand two contiguous registers 7375f757f3fSDimitry Andric// 738*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2" in { 7397a6dacacSDimitry Andric def SVLUTI2_LANE_ZT_X2 : Inst<"svluti2_lane_zt_{d}_x2", "2.di[i", "cUcsUsiUibhf", MergeNone, "aarch64_sme_luti2_lane_zt_x2", [IsStreaming, IsInZT0], [ImmCheck<0, ImmCheck0_0>, ImmCheck<2, ImmCheck0_7>]>; 7407a6dacacSDimitry Andric def SVLUTI4_LANE_ZT_X2 : Inst<"svluti4_lane_zt_{d}_x2", "2.di[i", "cUcsUsiUibhf", MergeNone, "aarch64_sme_luti4_lane_zt_x2", [IsStreaming, IsInZT0], [ImmCheck<0, ImmCheck0_0>, ImmCheck<2, ImmCheck0_3>]>; 7415f757f3fSDimitry Andric} 742*0fca6ea1SDimitry Andric 743*0fca6ea1SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 744*0fca6ea1SDimitry Andric// SME2p1 - FMOPA, FMOPS (non-widening) 745*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme2,b16b16" in { 746*0fca6ea1SDimitry Andric def SVMOPA_BF16_NW : SInst<"svmopa_za16[_bf16]_m", "viPPdd", "b", 747*0fca6ea1SDimitry Andric MergeNone, "aarch64_sme_mopa", 748*0fca6ea1SDimitry Andric [IsStreaming, IsInOutZA], 749*0fca6ea1SDimitry Andric [ImmCheck<0, ImmCheck0_1>]>; 750*0fca6ea1SDimitry Andric def SVMOPS_BF16_NW : SInst<"svmops_za16[_bf16]_m", "viPPdd", "b", 751*0fca6ea1SDimitry Andric MergeNone, "aarch64_sme_mops", 752*0fca6ea1SDimitry Andric [IsStreaming, IsInOutZA], 753*0fca6ea1SDimitry Andric [ImmCheck<0, ImmCheck0_1>]>; 754*0fca6ea1SDimitry Andric} 755*0fca6ea1SDimitry Andric 756*0fca6ea1SDimitry Andriclet SMETargetGuard = "sme-f16f16" in { 757*0fca6ea1SDimitry Andric def SVMOPA_F16_NW : SInst<"svmopa_za16[_f16]_m", "viPPdd", "h", 758*0fca6ea1SDimitry Andric MergeNone, "aarch64_sme_mopa", 759*0fca6ea1SDimitry Andric [IsStreaming, IsInOutZA], 760*0fca6ea1SDimitry Andric [ImmCheck<0, ImmCheck0_1>]>; 761*0fca6ea1SDimitry Andric def SVMOPS_F16_NW : SInst<"svmops_za16[_f16]_m", "viPPdd", "h", 762*0fca6ea1SDimitry Andric MergeNone, "aarch64_sme_mops", 763*0fca6ea1SDimitry Andric [IsStreaming, IsInOutZA], 764*0fca6ea1SDimitry Andric [ImmCheck<0, ImmCheck0_1>]>; 765*0fca6ea1SDimitry Andric} 766*0fca6ea1SDimitry Andric 767*0fca6ea1SDimitry Andric 768*0fca6ea1SDimitry Andricmulticlass ZAReadz<string n_suffix, string vg_num, string t, string i_prefix, list<ImmCheck> ch> { 769*0fca6ea1SDimitry Andric let SMETargetGuard = "sme2p1" in { 770*0fca6ea1SDimitry Andric def NAME # _H : SInst<"svreadz_hor_" # n_suffix # "_{d}_vg" # vg_num, vg_num # "im", t, 771*0fca6ea1SDimitry Andric MergeNone, i_prefix # "_horiz_x" # vg_num, 772*0fca6ea1SDimitry Andric [IsStreaming, IsInOutZA], ch>; 773*0fca6ea1SDimitry Andric 774*0fca6ea1SDimitry Andric def NAME # _V : SInst<"svreadz_ver_" # n_suffix # "_{d}_vg" # vg_num, vg_num # "im", t, 775*0fca6ea1SDimitry Andric MergeNone, i_prefix # "_vert_x" #vg_num, 776*0fca6ea1SDimitry Andric [IsStreaming, IsInOutZA], ch>; 777*0fca6ea1SDimitry Andric } 778*0fca6ea1SDimitry Andric} 779*0fca6ea1SDimitry Andric 780*0fca6ea1SDimitry Andricdefm SVREADZ_ZA8_X2 : ZAReadz<"za8", "2", "cUc", "aarch64_sme_readz", [ImmCheck<0, ImmCheck0_0>]>; 781*0fca6ea1SDimitry Andricdefm SVREADZ_ZA16_X2 : ZAReadz<"za16", "2", "sUshb", "aarch64_sme_readz", [ImmCheck<0, ImmCheck0_1>]>; 782*0fca6ea1SDimitry Andricdefm SVREADZ_ZA32_X2 : ZAReadz<"za32", "2", "iUif", "aarch64_sme_readz", [ImmCheck<0, ImmCheck0_3>]>; 783*0fca6ea1SDimitry Andricdefm SVREADZ_ZA64_X2 : ZAReadz<"za64", "2", "lUld", "aarch64_sme_readz", [ImmCheck<0, ImmCheck0_7>]>; 784*0fca6ea1SDimitry Andric 785*0fca6ea1SDimitry Andricdefm SVREADZ_ZA8_X4 : ZAReadz<"za8", "4", "cUc", "aarch64_sme_readz", [ImmCheck<0, ImmCheck0_0>]>; 786*0fca6ea1SDimitry Andricdefm SVREADZ_ZA16_X4 : ZAReadz<"za16", "4", "sUshb", "aarch64_sme_readz", [ImmCheck<0, ImmCheck0_1>]>; 787*0fca6ea1SDimitry Andricdefm SVREADZ_ZA32_X4 : ZAReadz<"za32", "4", "iUif", "aarch64_sme_readz", [ImmCheck<0, ImmCheck0_3>]>; 788*0fca6ea1SDimitry Andricdefm SVREADZ_ZA64_X4 : ZAReadz<"za64", "4", "lUld", "aarch64_sme_readz", [ImmCheck<0, ImmCheck0_7>]>; 789*0fca6ea1SDimitry Andric 790*0fca6ea1SDimitry Andric 791*0fca6ea1SDimitry Andricmulticlass ZAReadzSingle<string n_suffix, string t, string i_prefix, list<ImmCheck> ch> { 792*0fca6ea1SDimitry Andric let SMETargetGuard = "sme2p1" in { 793*0fca6ea1SDimitry Andric def NAME # _H : SInst<"svreadz_hor_" # n_suffix # "_{d}", "dim", t, 794*0fca6ea1SDimitry Andric MergeNone, i_prefix # "_horiz", 795*0fca6ea1SDimitry Andric [IsStreaming, IsInOutZA], ch>; 796*0fca6ea1SDimitry Andric 797*0fca6ea1SDimitry Andric def NAME # _V : SInst<"svreadz_ver_" # n_suffix # "_{d}", "dim", t, 798*0fca6ea1SDimitry Andric MergeNone, i_prefix # "_vert", 799*0fca6ea1SDimitry Andric [IsStreaming, IsInOutZA], ch>; 800*0fca6ea1SDimitry Andric } 801*0fca6ea1SDimitry Andric} 802*0fca6ea1SDimitry Andric 803*0fca6ea1SDimitry Andricdefm SVREADZ_ZA8 : ZAReadzSingle<"za8", "cUc", "aarch64_sme_readz", [ImmCheck<0, ImmCheck0_0>]>; 804*0fca6ea1SDimitry Andricdefm SVREADZ_ZA16 : ZAReadzSingle<"za16", "sUshb", "aarch64_sme_readz", [ImmCheck<0, ImmCheck0_1>]>; 805*0fca6ea1SDimitry Andricdefm SVREADZ_ZA32 : ZAReadzSingle<"za32", "iUif", "aarch64_sme_readz", [ImmCheck<0, ImmCheck0_3>]>; 806*0fca6ea1SDimitry Andricdefm SVREADZ_ZA64 : ZAReadzSingle<"za64", "lUld", "aarch64_sme_readz", [ImmCheck<0, ImmCheck0_7>]>; 807*0fca6ea1SDimitry Andricdefm SVREADZ_ZA128 : ZAReadzSingle<"za128", "csilUcUiUsUlbhfd", "aarch64_sme_readz_q", [ImmCheck<0, ImmCheck0_15>]>; 808*0fca6ea1SDimitry Andric 809*0fca6ea1SDimitry Andricmulticlass ZAReadzArray<string vg_num>{ 810*0fca6ea1SDimitry Andric let SMETargetGuard = "sme2p1" in { 811*0fca6ea1SDimitry Andric def NAME # _B : SInst<"svreadz_za8_{d}_vg1x" # vg_num, vg_num # "m", "cUc", MergeNone, "aarch64_sme_readz_x" # vg_num, [IsStreaming, IsInOutZA]>; 812*0fca6ea1SDimitry Andric def NAME # _H : SInst<"svreadz_za16_{d}_vg1x" # vg_num, vg_num # "m", "sUsbh", MergeNone, "aarch64_sme_readz_x" # vg_num, [IsStreaming, IsInOutZA]>; 813*0fca6ea1SDimitry Andric def NAME # _S : SInst<"svreadz_za32_{d}_vg1x" # vg_num, vg_num # "m", "iUif", MergeNone, "aarch64_sme_readz_x" # vg_num, [IsStreaming, IsInOutZA]>; 814*0fca6ea1SDimitry Andric def NAME # _D : SInst<"svreadz_za64_{d}_vg1x" # vg_num, vg_num # "m", "lUld", MergeNone, "aarch64_sme_readz_x" # vg_num, [IsStreaming, IsInOutZA]>; 815*0fca6ea1SDimitry Andric } 816*0fca6ea1SDimitry Andric} 817*0fca6ea1SDimitry Andric 818*0fca6ea1SDimitry Andricdefm SVREADZ_VG2 : ZAReadzArray<"2">; 819*0fca6ea1SDimitry Andricdefm SVREADZ_VG4 : ZAReadzArray<"4">; 820*0fca6ea1SDimitry Andric} // let SVETargetGuard = InvalidMode 821