xref: /freebsd/contrib/llvm-project/clang/include/clang/Basic/arm_sme.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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