xref: /freebsd/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCInstrMMA.td (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
181ad6265SDimitry Andric
281ad6265SDimitry Andric// Mask immediates for MMA instructions (2, 4 and 8 bits).
381ad6265SDimitry Andricdef Msk2Imm : ImmLeaf<i32, [{ return isUInt<2>(Imm); }]>;
481ad6265SDimitry Andricdef Msk4Imm : ImmLeaf<i32, [{ return isUInt<4>(Imm); }]>;
581ad6265SDimitry Andricdef Msk8Imm : ImmLeaf<i32, [{ return isUInt<8>(Imm); }]>;
681ad6265SDimitry Andric
781ad6265SDimitry Andricdef MMA : Predicate<"Subtarget->hasMMA()">;
881ad6265SDimitry Andric
981ad6265SDimitry Andric
1081ad6265SDimitry Andric// Multiclass definitions for MMA accumulator instructions.
1181ad6265SDimitry Andric// ----------------------------------------------------------------------------
1281ad6265SDimitry Andric
1381ad6265SDimitry Andric// Defines 2 unmasked instructions where the xo field for acc/non-acc version
1481ad6265SDimitry Andric// is even/odd.
1581ad6265SDimitry Andricmulticlass ACC_UM_XOEO<bits<6> opcode, bits<8> xo, dag IOL, string asmbase,
1681ad6265SDimitry Andric                       string asmstr> {
17bdd1243dSDimitry Andric  let Predicates = [MMA, IsNotISAFuture] in {
1881ad6265SDimitry Andric  def NAME :
1981ad6265SDimitry Andric    XX3Form_AT3_XAB6<opcode, !or(xo, 0x01), (outs acc:$AT), IOL,
2081ad6265SDimitry Andric                     !strconcat(asmbase#" ", asmstr), IIC_VecFP, []>,
2181ad6265SDimitry Andric    RegConstraint<"@earlyclobber $AT">;
2281ad6265SDimitry Andric  def PP :
2381ad6265SDimitry Andric    XX3Form_AT3_XAB6<opcode, xo, (outs acc:$AT), !con((ins acc:$ATi), IOL),
2481ad6265SDimitry Andric                     !strconcat(asmbase#"pp ", asmstr), IIC_VecFP, []>,
2581ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
2681ad6265SDimitry Andric  }
27bdd1243dSDimitry Andric  let Predicates = [MMA, IsISAFuture], isCodeGenOnly = 1 in {
28bdd1243dSDimitry Andric  def NAME#W :
29bdd1243dSDimitry Andric    XX3Form_AT3_XAB6<opcode, !or(xo, 0x01), (outs wacc:$AT), IOL,
30bdd1243dSDimitry Andric                     !strconcat(asmbase#" ", asmstr), IIC_VecFP, []>,
31bdd1243dSDimitry Andric    RegConstraint<"@earlyclobber $AT">;
32bdd1243dSDimitry Andric  def WPP :
33bdd1243dSDimitry Andric    XX3Form_AT3_XAB6<opcode, xo, (outs wacc:$AT), !con((ins wacc:$ATi), IOL),
34bdd1243dSDimitry Andric                     !strconcat(asmbase#"pp ", asmstr), IIC_VecFP, []>,
35bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
36bdd1243dSDimitry Andric  }
3781ad6265SDimitry Andric}
3881ad6265SDimitry Andric
3981ad6265SDimitry Andric// Defines 4 instructions, masked/unmasked with masks 8, 4, 4 bits.
4081ad6265SDimitry Andric// The XO field for acc/non-acc version is even/odd.
4181ad6265SDimitry Andricmulticlass ACC_UM_M844_XOEO<bits<6> opcode, bits<8> xo, dag IOL, string asmbase,
4281ad6265SDimitry Andric                            string asmstr> {
4381ad6265SDimitry Andric  defm NAME : ACC_UM_XOEO<opcode, xo, IOL, asmbase, asmstr>;
44bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsNotISAFuture] in {
4581ad6265SDimitry Andric  def PM#NAME :
4681ad6265SDimitry Andric    MMIRR_XX3Form_XY4P8_XAB6<
4781ad6265SDimitry Andric      opcode, !or(xo, 0x01), (outs acc:$AT),
4881ad6265SDimitry Andric      !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u8imm:$PMSK)),
4981ad6265SDimitry Andric      !strconcat("pm"#asmbase#" ", asmstr#", $XMSK, $YMSK, $PMSK"),
5081ad6265SDimitry Andric      IIC_VecFP, []>,
5181ad6265SDimitry Andric    RegConstraint<"@earlyclobber $AT">;
5281ad6265SDimitry Andric  def PM#NAME#PP :
5381ad6265SDimitry Andric    MMIRR_XX3Form_XY4P8_XAB6<
5481ad6265SDimitry Andric      opcode, xo, (outs acc:$AT),
5581ad6265SDimitry Andric      !con((ins acc:$ATi),
5681ad6265SDimitry Andric           !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u8imm:$PMSK))),
5781ad6265SDimitry Andric      !strconcat("pm"#asmbase#"pp ", asmstr#", $XMSK, $YMSK, $PMSK"),
5881ad6265SDimitry Andric      IIC_VecFP, []>,
5981ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
6081ad6265SDimitry Andric  }
61bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsISAFuture], isCodeGenOnly = 1 in {
62bdd1243dSDimitry Andric  def PM#NAME#W :
63bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4P8_XAB6<
64bdd1243dSDimitry Andric      opcode, !or(xo, 0x01), (outs wacc:$AT),
65bdd1243dSDimitry Andric      !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u8imm:$PMSK)),
66bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#" ", asmstr#", $XMSK, $YMSK, $PMSK"),
67bdd1243dSDimitry Andric      IIC_VecFP, []>,
68bdd1243dSDimitry Andric    RegConstraint<"@earlyclobber $AT">;
69bdd1243dSDimitry Andric  def PM#NAME#WPP :
70bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4P8_XAB6<
71bdd1243dSDimitry Andric      opcode, xo, (outs wacc:$AT),
72bdd1243dSDimitry Andric      !con((ins wacc:$ATi),
73bdd1243dSDimitry Andric           !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u8imm:$PMSK))),
74bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"pp ", asmstr#", $XMSK, $YMSK, $PMSK"),
75bdd1243dSDimitry Andric      IIC_VecFP, []>,
76bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
77bdd1243dSDimitry Andric  }
7881ad6265SDimitry Andric}
7981ad6265SDimitry Andric
8081ad6265SDimitry Andric// Defines 4 instructions, masked/unmasked with masks 4, 4, 4 bits.
8181ad6265SDimitry Andric// The XO field for acc/non-acc version is even/odd.
8281ad6265SDimitry Andricmulticlass ACC_UM_M444_XOEO<bits<6> opcode, bits<8> xo, dag IOL, string asmbase,
8381ad6265SDimitry Andric                            string asmstr> {
8481ad6265SDimitry Andric  defm NAME : ACC_UM_XOEO<opcode, xo, IOL, asmbase, asmstr>;
85bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsNotISAFuture] in {
8681ad6265SDimitry Andric  def PM#NAME :
8781ad6265SDimitry Andric    MMIRR_XX3Form_XYP4_XAB6<
8881ad6265SDimitry Andric      opcode, !or(xo, 0x01), (outs acc:$AT),
8981ad6265SDimitry Andric      !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u4imm:$PMSK)),
9081ad6265SDimitry Andric      !strconcat("pm"#asmbase#" ", asmstr#", $XMSK, $YMSK, $PMSK"),
9181ad6265SDimitry Andric      IIC_VecFP, []>,
9281ad6265SDimitry Andric    RegConstraint<"@earlyclobber $AT">;
9381ad6265SDimitry Andric  def PM#NAME#PP :
9481ad6265SDimitry Andric    MMIRR_XX3Form_XYP4_XAB6<
9581ad6265SDimitry Andric      opcode, xo, (outs acc:$AT),
9681ad6265SDimitry Andric      !con((ins acc:$ATi),
9781ad6265SDimitry Andric           !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u4imm:$PMSK))),
9881ad6265SDimitry Andric      !strconcat("pm"#asmbase#"pp ", asmstr#", $XMSK, $YMSK, $PMSK"),
9981ad6265SDimitry Andric      IIC_VecFP, []>,
10081ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
10181ad6265SDimitry Andric  }
102bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsISAFuture], isCodeGenOnly = 1 in {
103bdd1243dSDimitry Andric  def PM#NAME#W :
104bdd1243dSDimitry Andric    MMIRR_XX3Form_XYP4_XAB6<
105bdd1243dSDimitry Andric      opcode, !or(xo, 0x01), (outs wacc:$AT),
106bdd1243dSDimitry Andric      !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u4imm:$PMSK)),
107bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#" ", asmstr#", $XMSK, $YMSK, $PMSK"),
108bdd1243dSDimitry Andric      IIC_VecFP, []>,
109bdd1243dSDimitry Andric    RegConstraint<"@earlyclobber $AT">;
110bdd1243dSDimitry Andric  def PM#NAME#WPP :
111bdd1243dSDimitry Andric    MMIRR_XX3Form_XYP4_XAB6<
112bdd1243dSDimitry Andric      opcode, xo, (outs wacc:$AT),
113bdd1243dSDimitry Andric      !con((ins wacc:$ATi),
114bdd1243dSDimitry Andric           !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u4imm:$PMSK))),
115bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"pp ", asmstr#", $XMSK, $YMSK, $PMSK"),
116bdd1243dSDimitry Andric      IIC_VecFP, []>,
117bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
118bdd1243dSDimitry Andric  }
11981ad6265SDimitry Andric}
12081ad6265SDimitry Andric
12181ad6265SDimitry Andric// Defines 4 instructions, masked/unmasked with masks 2, 4, 4 bits.
12281ad6265SDimitry Andric// The XO field for acc/non-acc version is even/odd.
12381ad6265SDimitry Andricmulticlass ACC_UM_M244_XOEO<bits<6> opcode, bits<8> xo, dag IOL, string asmbase,
12481ad6265SDimitry Andric                            string asmstr> {
12581ad6265SDimitry Andric  defm NAME : ACC_UM_XOEO<opcode, xo, IOL, asmbase, asmstr>;
126bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsNotISAFuture] in {
12781ad6265SDimitry Andric  def PM#NAME :
12881ad6265SDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
12981ad6265SDimitry Andric      opcode, !or(xo, 0x01), (outs acc:$AT),
13081ad6265SDimitry Andric      !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK)),
13181ad6265SDimitry Andric      !strconcat("pm"#asmbase#" ", asmstr#", $XMSK, $YMSK, $PMSK"),
13281ad6265SDimitry Andric      IIC_VecFP, []>,
13381ad6265SDimitry Andric    RegConstraint<"@earlyclobber $AT">;
13481ad6265SDimitry Andric  def PM#NAME#PP :
13581ad6265SDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
13681ad6265SDimitry Andric      opcode, xo, (outs acc:$AT),
13781ad6265SDimitry Andric      !con((ins acc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK))),
13881ad6265SDimitry Andric      !strconcat("pm"#asmbase#"pp ", asmstr#", $XMSK, $YMSK, $PMSK"),
13981ad6265SDimitry Andric      IIC_VecFP, []>,
14081ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
14181ad6265SDimitry Andric  }
142bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsISAFuture], isCodeGenOnly = 1 in {
143bdd1243dSDimitry Andric  def PM#NAME#W :
144bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
145bdd1243dSDimitry Andric      opcode, !or(xo, 0x01), (outs wacc:$AT),
146bdd1243dSDimitry Andric      !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK)),
147bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#" ", asmstr#", $XMSK, $YMSK, $PMSK"),
148bdd1243dSDimitry Andric      IIC_VecFP, []>,
149bdd1243dSDimitry Andric    RegConstraint<"@earlyclobber $AT">;
150bdd1243dSDimitry Andric  def PM#NAME#WPP :
151bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
152bdd1243dSDimitry Andric      opcode, xo, (outs wacc:$AT),
153bdd1243dSDimitry Andric      !con((ins wacc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK))),
154bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"pp ", asmstr#", $XMSK, $YMSK, $PMSK"),
155bdd1243dSDimitry Andric      IIC_VecFP, []>,
156bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
157bdd1243dSDimitry Andric  }
15881ad6265SDimitry Andric}
15981ad6265SDimitry Andric
16081ad6265SDimitry Andric// Defines 4 instructions, masked/unmasked with masks 2, 4, 4 bits.
16181ad6265SDimitry Andric// Upper nibble of XO field for acc/non-acc version is 0x4/0x6.
16281ad6265SDimitry Andricmulticlass ACC_UM_M244_XO46<bits<6> opcode, bits<8> xo, dag IOL, string asmbase,
16381ad6265SDimitry Andric                            string asmstr> {
164bdd1243dSDimitry Andric  let Predicates = [MMA, IsNotISAFuture] in {
16581ad6265SDimitry Andric  def NAME :
16681ad6265SDimitry Andric    XX3Form_AT3_XAB6<opcode, xo, (outs acc:$AT), IOL,
16781ad6265SDimitry Andric                     !strconcat(asmbase#" ", asmstr), IIC_VecFP, []>,
16881ad6265SDimitry Andric    RegConstraint<"@earlyclobber $AT">;
16981ad6265SDimitry Andric  def PP :
17081ad6265SDimitry Andric    XX3Form_AT3_XAB6<
17181ad6265SDimitry Andric      opcode, !or(xo, 0x20), (outs acc:$AT), !con((ins acc:$ATi), IOL),
17281ad6265SDimitry Andric      !strconcat(asmbase#"pp ", asmstr), IIC_VecFP, []>,
17381ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
17481ad6265SDimitry Andric  }
175bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsNotISAFuture] in {
17681ad6265SDimitry Andric  def PM#NAME :
17781ad6265SDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
17881ad6265SDimitry Andric      opcode, xo, (outs acc:$AT),
17981ad6265SDimitry Andric      !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK)),
18081ad6265SDimitry Andric      !strconcat("pm"#asmbase#" ", asmstr#", $XMSK, $YMSK, $PMSK"),
18181ad6265SDimitry Andric      IIC_VecFP, []>,
18281ad6265SDimitry Andric    RegConstraint<"@earlyclobber $AT">;
18381ad6265SDimitry Andric  def PM#NAME#PP :
18481ad6265SDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
18581ad6265SDimitry Andric      opcode, !or(xo, 0x20), (outs acc:$AT),
18681ad6265SDimitry Andric      !con((ins acc:$ATi),
18781ad6265SDimitry Andric           !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK))),
18881ad6265SDimitry Andric      !strconcat("pm"#asmbase#"pp ", asmstr#", $XMSK, $YMSK, $PMSK"),
18981ad6265SDimitry Andric      IIC_VecFP, []>,
19081ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
19181ad6265SDimitry Andric  }
192bdd1243dSDimitry Andric  let Predicates = [MMA, IsISAFuture], isCodeGenOnly = 1 in {
193bdd1243dSDimitry Andric  def NAME#W :
194bdd1243dSDimitry Andric    XX3Form_AT3_XAB6<opcode, xo, (outs wacc:$AT), IOL,
195bdd1243dSDimitry Andric                     !strconcat(asmbase#" ", asmstr), IIC_VecFP, []>,
196bdd1243dSDimitry Andric    RegConstraint<"@earlyclobber $AT">;
197bdd1243dSDimitry Andric  def WPP :
198bdd1243dSDimitry Andric    XX3Form_AT3_XAB6<
199bdd1243dSDimitry Andric      opcode, !or(xo, 0x20), (outs wacc:$AT), !con((ins wacc:$ATi), IOL),
200bdd1243dSDimitry Andric      !strconcat(asmbase#"pp ", asmstr), IIC_VecFP, []>,
201bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
202bdd1243dSDimitry Andric  }
203bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsISAFuture], isCodeGenOnly = 1 in {
204bdd1243dSDimitry Andric  def PM#NAME#W :
205bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
206bdd1243dSDimitry Andric      opcode, xo, (outs wacc:$AT),
207bdd1243dSDimitry Andric      !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK)),
208bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#" ", asmstr#", $XMSK, $YMSK, $PMSK"),
209bdd1243dSDimitry Andric      IIC_VecFP, []>,
210bdd1243dSDimitry Andric    RegConstraint<"@earlyclobber $AT">;
211bdd1243dSDimitry Andric  def PM#NAME#WPP :
212bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
213bdd1243dSDimitry Andric      opcode, !or(xo, 0x20), (outs acc:$AT),
214bdd1243dSDimitry Andric      !con((ins wacc:$ATi),
215bdd1243dSDimitry Andric           !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK))),
216bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"pp ", asmstr#", $XMSK, $YMSK, $PMSK"),
217bdd1243dSDimitry Andric      IIC_VecFP, []>,
218bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
219bdd1243dSDimitry Andric  }
22081ad6265SDimitry Andric}
22181ad6265SDimitry Andric
22281ad6265SDimitry Andric// Defines 10 instructions, operand negating, unmasked, masked with 2, 4, 4
22381ad6265SDimitry Andric// bits. Upper nibble are masked with 0x8, 0x4, 0xC for negating operands.
22481ad6265SDimitry Andricmulticlass ACC_NEG_UM_M244_XOM84C<bits<6> opcode, bits<8> xo, dag IOL,
22581ad6265SDimitry Andric                                  string asmbase, string asmstr> {
22681ad6265SDimitry Andric  defm NAME : ACC_UM_M244_XOEO<opcode, xo, IOL, asmbase, asmstr>;
227bdd1243dSDimitry Andric  let Predicates = [MMA, IsNotISAFuture] in {
22881ad6265SDimitry Andric  def PN : XX3Form_AT3_XAB6<
22981ad6265SDimitry Andric             opcode, !or(xo, 0x80), (outs acc:$AT), !con((ins acc:$ATi), IOL),
23081ad6265SDimitry Andric             !strconcat(asmbase#"pn ", asmstr), IIC_VecFP, []>,
23181ad6265SDimitry Andric           RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
23281ad6265SDimitry Andric  def NP : XX3Form_AT3_XAB6<
23381ad6265SDimitry Andric             opcode, !or(xo, 0x40), (outs acc:$AT), !con((ins acc:$ATi), IOL),
23481ad6265SDimitry Andric             !strconcat(asmbase#"np ", asmstr), IIC_VecFP, []>,
23581ad6265SDimitry Andric           RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
23681ad6265SDimitry Andric  def NN : XX3Form_AT3_XAB6<
23781ad6265SDimitry Andric             opcode, !or(xo, 0xC0), (outs acc:$AT), !con((ins acc:$ATi), IOL),
23881ad6265SDimitry Andric             !strconcat(asmbase#"nn ", asmstr), IIC_VecFP, []>,
23981ad6265SDimitry Andric           RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
24081ad6265SDimitry Andric  }
241bdd1243dSDimitry Andric  let Predicates = [MMA, IsISAFuture], isCodeGenOnly = 1 in {
242bdd1243dSDimitry Andric  def WPN : XX3Form_AT3_XAB6<
243bdd1243dSDimitry Andric              opcode, !or(xo, 0x80), (outs wacc:$AT), !con((ins wacc:$ATi), IOL),
244bdd1243dSDimitry Andric              !strconcat(asmbase#"pn ", asmstr), IIC_VecFP, []>,
245bdd1243dSDimitry Andric           RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
246bdd1243dSDimitry Andric  def WNP : XX3Form_AT3_XAB6<
247bdd1243dSDimitry Andric              opcode, !or(xo, 0x40), (outs wacc:$AT), !con((ins wacc:$ATi), IOL),
248bdd1243dSDimitry Andric              !strconcat(asmbase#"np ", asmstr), IIC_VecFP, []>,
249bdd1243dSDimitry Andric           RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
250bdd1243dSDimitry Andric  def WNN : XX3Form_AT3_XAB6<
251bdd1243dSDimitry Andric              opcode, !or(xo, 0xC0), (outs wacc:$AT), !con((ins wacc:$ATi), IOL),
252bdd1243dSDimitry Andric              !strconcat(asmbase#"nn ", asmstr), IIC_VecFP, []>,
253bdd1243dSDimitry Andric           RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
254bdd1243dSDimitry Andric  }
255bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsNotISAFuture] in {
25681ad6265SDimitry Andric  def PM#NAME#PN :
25781ad6265SDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
25881ad6265SDimitry Andric      opcode, !or(xo, 0x80), (outs acc:$AT),
25981ad6265SDimitry Andric      !con((ins acc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK))),
26081ad6265SDimitry Andric      !strconcat("pm"#asmbase#"pn ", asmstr#", $XMSK, $YMSK, $PMSK"),
26181ad6265SDimitry Andric      IIC_VecFP, []>,
26281ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
26381ad6265SDimitry Andric  def PM#NAME#NP :
26481ad6265SDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
26581ad6265SDimitry Andric      opcode, !or(xo, 0x40), (outs acc:$AT),
26681ad6265SDimitry Andric      !con((ins acc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK))),
26781ad6265SDimitry Andric      !strconcat("pm"#asmbase#"np ", asmstr#", $XMSK, $YMSK, $PMSK"),
26881ad6265SDimitry Andric      IIC_VecFP, []>,
26981ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
27081ad6265SDimitry Andric  def PM#NAME#NN :
27181ad6265SDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
27281ad6265SDimitry Andric      opcode, !or(xo, 0xC0), (outs acc:$AT),
27381ad6265SDimitry Andric      !con((ins acc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK))),
27481ad6265SDimitry Andric      !strconcat("pm"#asmbase#"nn ", asmstr#", $XMSK, $YMSK, $PMSK"),
27581ad6265SDimitry Andric      IIC_VecFP, []>,
27681ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
27781ad6265SDimitry Andric  }
278bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsISAFuture], isCodeGenOnly = 1 in {
279bdd1243dSDimitry Andric  def PM#NAME#WPN :
280bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
281bdd1243dSDimitry Andric      opcode, !or(xo, 0x80), (outs wacc:$AT),
282bdd1243dSDimitry Andric      !con((ins wacc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK))),
283bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"pn ", asmstr#", $XMSK, $YMSK, $PMSK"),
284bdd1243dSDimitry Andric      IIC_VecFP, []>,
285bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
286bdd1243dSDimitry Andric  def PM#NAME#WNP :
287bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
288bdd1243dSDimitry Andric      opcode, !or(xo, 0x40), (outs wacc:$AT),
289bdd1243dSDimitry Andric      !con((ins wacc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK))),
290bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"np ", asmstr#", $XMSK, $YMSK, $PMSK"),
291bdd1243dSDimitry Andric      IIC_VecFP, []>,
292bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
293bdd1243dSDimitry Andric  def PM#NAME#WNN :
294bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4P2_XAB6<
295bdd1243dSDimitry Andric      opcode, !or(xo, 0xC0), (outs wacc:$AT),
296bdd1243dSDimitry Andric      !con((ins wacc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK, u2imm:$PMSK))),
297bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"nn ", asmstr#", $XMSK, $YMSK, $PMSK"),
298bdd1243dSDimitry Andric      IIC_VecFP, []>,
299bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
300bdd1243dSDimitry Andric  }
30181ad6265SDimitry Andric}
30281ad6265SDimitry Andric
30381ad6265SDimitry Andric// Defines 5 instructions, unmasked, operand negating.
30481ad6265SDimitry Andric// Upper nibble are masked with 0x8, 0x4, 0xC for negating operands.
30581ad6265SDimitry Andricmulticlass ACC_NEG_UM_XOM84C<bits<6> opcode, bits<8> xo, dag IOL,
30681ad6265SDimitry Andric                             string asmbase, string asmstr> {
30781ad6265SDimitry Andric  defm NAME : ACC_UM_XOEO<opcode, xo, IOL, asmbase, asmstr>;
308bdd1243dSDimitry Andric  let Predicates = [MMA, IsNotISAFuture] in {
30981ad6265SDimitry Andric  def PN : XX3Form_AT3_XAB6<opcode, !or(xo, 0x80), (outs acc:$AT),
31081ad6265SDimitry Andric                            !con((ins acc:$ATi), IOL),
31181ad6265SDimitry Andric                            !strconcat(asmbase#"pn ", asmstr), IIC_VecFP, []>,
31281ad6265SDimitry Andric           RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
31381ad6265SDimitry Andric  def NP : XX3Form_AT3_XAB6<opcode, !or(xo, 0x40), (outs acc:$AT),
31481ad6265SDimitry Andric                            !con((ins acc:$ATi), IOL),
31581ad6265SDimitry Andric                            !strconcat(asmbase#"np ", asmstr), IIC_VecFP, []>,
31681ad6265SDimitry Andric           RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
31781ad6265SDimitry Andric  def NN : XX3Form_AT3_XAB6<opcode, !or(xo, 0xC0), (outs acc:$AT),
31881ad6265SDimitry Andric                            !con((ins acc:$ATi), IOL),
31981ad6265SDimitry Andric                            !strconcat(asmbase#"nn ", asmstr), IIC_VecFP, []>,
32081ad6265SDimitry Andric           RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
32181ad6265SDimitry Andric  }
322bdd1243dSDimitry Andric  let Predicates = [MMA, IsISAFuture], isCodeGenOnly = 1 in {
323bdd1243dSDimitry Andric  def WPN : XX3Form_AT3_XAB6<opcode, !or(xo, 0x80), (outs wacc:$AT),
324bdd1243dSDimitry Andric                            !con((ins wacc:$ATi), IOL),
325bdd1243dSDimitry Andric                            !strconcat(asmbase#"pn ", asmstr), IIC_VecFP, []>,
326bdd1243dSDimitry Andric           RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
327bdd1243dSDimitry Andric  def WNP : XX3Form_AT3_XAB6<opcode, !or(xo, 0x40), (outs wacc:$AT),
328bdd1243dSDimitry Andric                            !con((ins wacc:$ATi), IOL),
329bdd1243dSDimitry Andric                            !strconcat(asmbase#"np ", asmstr), IIC_VecFP, []>,
330bdd1243dSDimitry Andric           RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
331bdd1243dSDimitry Andric  def WNN : XX3Form_AT3_XAB6<opcode, !or(xo, 0xC0), (outs wacc:$AT),
332bdd1243dSDimitry Andric                            !con((ins wacc:$ATi), IOL),
333bdd1243dSDimitry Andric                            !strconcat(asmbase#"nn ", asmstr), IIC_VecFP, []>,
334bdd1243dSDimitry Andric           RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
335bdd1243dSDimitry Andric  }
33681ad6265SDimitry Andric}
33781ad6265SDimitry Andric
33881ad6265SDimitry Andric// Defines 10 instructions, operand negating, unmasked, masked with 4, 4 bits.
33981ad6265SDimitry Andric// Upper nibble are masked with 0x8, 0x4, 0xC for negating operands.
34081ad6265SDimitry Andricmulticlass ACC_NEG_UM_M44_XOM84C<bits<6> opcode, bits<8> xo, dag IOL,
34181ad6265SDimitry Andric                                 string asmbase, string asmstr> {
34281ad6265SDimitry Andric  defm NAME : ACC_NEG_UM_XOM84C<opcode, xo, IOL, asmbase, asmstr>;
343bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsNotISAFuture] in {
34481ad6265SDimitry Andric  def PM#NAME :
34581ad6265SDimitry Andric    MMIRR_XX3Form_XY4_XAB6<
34681ad6265SDimitry Andric      opcode, !or(xo, 0x01), (outs acc:$AT),
34781ad6265SDimitry Andric      !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK)),
34881ad6265SDimitry Andric      !strconcat("pm"#asmbase#" ", asmstr#", $XMSK, $YMSK"),
34981ad6265SDimitry Andric      IIC_VecFP, []>,
35081ad6265SDimitry Andric    RegConstraint<"@earlyclobber $AT">;
35181ad6265SDimitry Andric  def PM#NAME#PP :
35281ad6265SDimitry Andric    MMIRR_XX3Form_XY4_XAB6<
35381ad6265SDimitry Andric      opcode, xo, (outs acc:$AT),
35481ad6265SDimitry Andric      !con((ins acc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK))),
35581ad6265SDimitry Andric      !strconcat("pm"#asmbase#"pp ", asmstr#", $XMSK, $YMSK"),
35681ad6265SDimitry Andric      IIC_VecFP, []>,
35781ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
35881ad6265SDimitry Andric  def PM#NAME#PN :
35981ad6265SDimitry Andric    MMIRR_XX3Form_XY4_XAB6<
36081ad6265SDimitry Andric      opcode, !or(xo, 0x80), (outs acc:$AT),
36181ad6265SDimitry Andric      !con((ins acc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK))),
36281ad6265SDimitry Andric      !strconcat("pm"#asmbase#"pn ", asmstr#", $XMSK, $YMSK"),
36381ad6265SDimitry Andric      IIC_VecFP, []>,
36481ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
36581ad6265SDimitry Andric  def PM#NAME#NP :
36681ad6265SDimitry Andric    MMIRR_XX3Form_XY4_XAB6<
36781ad6265SDimitry Andric      opcode, !or(xo, 0x40), (outs acc:$AT),
36881ad6265SDimitry Andric      !con((ins acc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK))),
36981ad6265SDimitry Andric      !strconcat("pm"#asmbase#"np ", asmstr#", $XMSK, $YMSK"),
37081ad6265SDimitry Andric      IIC_VecFP, []>,
37181ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
37281ad6265SDimitry Andric  def PM#NAME#NN :
37381ad6265SDimitry Andric    MMIRR_XX3Form_XY4_XAB6<
37481ad6265SDimitry Andric      opcode, !or(xo, 0xC0), (outs acc:$AT),
37581ad6265SDimitry Andric      !con((ins acc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK))),
37681ad6265SDimitry Andric      !strconcat("pm"#asmbase#"nn ", asmstr#", $XMSK, $YMSK"),
37781ad6265SDimitry Andric      IIC_VecFP, []>,
37881ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
37981ad6265SDimitry Andric  }
380bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsISAFuture], isCodeGenOnly = 1 in {
381bdd1243dSDimitry Andric  def PM#NAME#W :
382bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4_XAB6<
383bdd1243dSDimitry Andric      opcode, !or(xo, 0x01), (outs wacc:$AT),
384bdd1243dSDimitry Andric      !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK)),
385bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#" ", asmstr#", $XMSK, $YMSK"),
386bdd1243dSDimitry Andric      IIC_VecFP, []>,
387bdd1243dSDimitry Andric    RegConstraint<"@earlyclobber $AT">;
388bdd1243dSDimitry Andric  def PM#NAME#WPP :
389bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4_XAB6<
390bdd1243dSDimitry Andric      opcode, xo, (outs wacc:$AT),
391bdd1243dSDimitry Andric      !con((ins wacc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK))),
392bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"pp ", asmstr#", $XMSK, $YMSK"),
393bdd1243dSDimitry Andric      IIC_VecFP, []>,
394bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
395bdd1243dSDimitry Andric  def PM#NAME#WPN :
396bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4_XAB6<
397bdd1243dSDimitry Andric      opcode, !or(xo, 0x80), (outs wacc:$AT),
398bdd1243dSDimitry Andric      !con((ins wacc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK))),
399bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"pn ", asmstr#", $XMSK, $YMSK"),
400bdd1243dSDimitry Andric      IIC_VecFP, []>,
401bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
402bdd1243dSDimitry Andric  def PM#NAME#WNP :
403bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4_XAB6<
404bdd1243dSDimitry Andric      opcode, !or(xo, 0x40), (outs wacc:$AT),
405bdd1243dSDimitry Andric      !con((ins wacc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK))),
406bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"np ", asmstr#", $XMSK, $YMSK"),
407bdd1243dSDimitry Andric      IIC_VecFP, []>,
408bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
409bdd1243dSDimitry Andric  def PM#NAME#WNN :
410bdd1243dSDimitry Andric    MMIRR_XX3Form_XY4_XAB6<
411bdd1243dSDimitry Andric      opcode, !or(xo, 0xC0), (outs wacc:$AT),
412bdd1243dSDimitry Andric      !con((ins wacc:$ATi), !con(IOL, (ins u4imm:$XMSK, u4imm:$YMSK))),
413bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"nn ", asmstr#", $XMSK, $YMSK"),
414bdd1243dSDimitry Andric      IIC_VecFP, []>,
415bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
416bdd1243dSDimitry Andric  }
41781ad6265SDimitry Andric}
41881ad6265SDimitry Andric
41981ad6265SDimitry Andric// Defines 10 instructions, operand negating, unmasked, masked with 4, 2 bits.
42081ad6265SDimitry Andric// Upper nibble are masked with 0x8, 0x4, 0xC for negating operands.
42181ad6265SDimitry Andricmulticlass ACC_NEG_UM_M42_XOM84C<bits<6> opcode, bits<8> xo, dag IOL,
42281ad6265SDimitry Andric                                 string asmbase, string asmstr> {
42381ad6265SDimitry Andric  defm NAME : ACC_NEG_UM_XOM84C<opcode, xo, IOL, asmbase, asmstr>;
424bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsNotISAFuture] in {
42581ad6265SDimitry Andric  def PM#NAME :
42681ad6265SDimitry Andric    MMIRR_XX3Form_X4Y2_XAB6<
42781ad6265SDimitry Andric      opcode, !or(xo, 0x01), (outs acc:$AT),
42881ad6265SDimitry Andric      !con(IOL, (ins u4imm:$XMSK, u2imm:$YMSK)),
42981ad6265SDimitry Andric      !strconcat("pm"#asmbase#" ", asmstr#", $XMSK, $YMSK"),
43081ad6265SDimitry Andric      IIC_VecFP, []>,
43181ad6265SDimitry Andric    RegConstraint<"@earlyclobber $AT">;
43281ad6265SDimitry Andric  def PM#NAME#PP :
43381ad6265SDimitry Andric    MMIRR_XX3Form_X4Y2_XAB6<
43481ad6265SDimitry Andric      opcode, xo, (outs acc:$AT),
43581ad6265SDimitry Andric      !con((ins acc:$ATi), !con(IOL, (ins u4imm:$XMSK, u2imm:$YMSK))),
43681ad6265SDimitry Andric      !strconcat("pm"#asmbase#"pp ", asmstr#", $XMSK, $YMSK"),
43781ad6265SDimitry Andric      IIC_VecFP, []>,
43881ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
43981ad6265SDimitry Andric  def PM#NAME#PN :
44081ad6265SDimitry Andric    MMIRR_XX3Form_X4Y2_XAB6<
44181ad6265SDimitry Andric      opcode, !or(xo, 0x80), (outs acc:$AT),
44281ad6265SDimitry Andric      !con((ins acc:$ATi), !con(IOL, (ins u4imm:$XMSK, u2imm:$YMSK))),
44381ad6265SDimitry Andric      !strconcat("pm"#asmbase#"pn ", asmstr#", $XMSK, $YMSK"),
44481ad6265SDimitry Andric      IIC_VecFP, []>,
44581ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
44681ad6265SDimitry Andric  def PM#NAME#NP :
44781ad6265SDimitry Andric    MMIRR_XX3Form_X4Y2_XAB6<
44881ad6265SDimitry Andric      opcode, !or(xo, 0x40), (outs acc:$AT),
44981ad6265SDimitry Andric      !con((ins acc:$ATi), !con(IOL, (ins u4imm:$XMSK, u2imm:$YMSK))),
45081ad6265SDimitry Andric      !strconcat("pm"#asmbase#"np ", asmstr#", $XMSK, $YMSK"),
45181ad6265SDimitry Andric      IIC_VecFP, []>,
45281ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
45381ad6265SDimitry Andric  def PM#NAME#NN :
45481ad6265SDimitry Andric    MMIRR_XX3Form_X4Y2_XAB6<
45581ad6265SDimitry Andric      opcode, !or(xo, 0xC0), (outs acc:$AT),
45681ad6265SDimitry Andric      !con((ins acc:$ATi), !con(IOL, (ins u4imm:$XMSK, u2imm:$YMSK))),
45781ad6265SDimitry Andric      !strconcat("pm"#asmbase#"nn ", asmstr#", $XMSK, $YMSK"),
45881ad6265SDimitry Andric      IIC_VecFP, []>,
45981ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
46081ad6265SDimitry Andric  }
461bdd1243dSDimitry Andric  let Predicates = [MMA, PrefixInstrs, IsISAFuture], isCodeGenOnly = 1 in {
462bdd1243dSDimitry Andric  def PM#NAME#W :
463bdd1243dSDimitry Andric    MMIRR_XX3Form_X4Y2_XAB6<
464bdd1243dSDimitry Andric      opcode, !or(xo, 0x01), (outs wacc:$AT),
465bdd1243dSDimitry Andric      !con(IOL, (ins u4imm:$XMSK, u2imm:$YMSK)),
466bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#" ", asmstr#", $XMSK, $YMSK"),
467bdd1243dSDimitry Andric      IIC_VecFP, []>,
468bdd1243dSDimitry Andric    RegConstraint<"@earlyclobber $AT">;
469bdd1243dSDimitry Andric  def PM#NAME#WPP :
470bdd1243dSDimitry Andric    MMIRR_XX3Form_X4Y2_XAB6<
471bdd1243dSDimitry Andric      opcode, xo, (outs wacc:$AT),
472bdd1243dSDimitry Andric      !con((ins wacc:$ATi), !con(IOL, (ins u4imm:$XMSK, u2imm:$YMSK))),
473bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"pp ", asmstr#", $XMSK, $YMSK"),
474bdd1243dSDimitry Andric      IIC_VecFP, []>,
475bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
476bdd1243dSDimitry Andric  def PM#NAME#WPN :
477bdd1243dSDimitry Andric    MMIRR_XX3Form_X4Y2_XAB6<
478bdd1243dSDimitry Andric      opcode, !or(xo, 0x80), (outs wacc:$AT),
479bdd1243dSDimitry Andric      !con((ins wacc:$ATi), !con(IOL, (ins u4imm:$XMSK, u2imm:$YMSK))),
480bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"pn ", asmstr#", $XMSK, $YMSK"),
481bdd1243dSDimitry Andric      IIC_VecFP, []>,
482bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
483bdd1243dSDimitry Andric  def PM#NAME#WNP :
484bdd1243dSDimitry Andric    MMIRR_XX3Form_X4Y2_XAB6<
485bdd1243dSDimitry Andric      opcode, !or(xo, 0x40), (outs wacc:$AT),
486bdd1243dSDimitry Andric      !con((ins wacc:$ATi), !con(IOL, (ins u4imm:$XMSK, u2imm:$YMSK))),
487bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"np ", asmstr#", $XMSK, $YMSK"),
488bdd1243dSDimitry Andric      IIC_VecFP, []>,
489bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
490bdd1243dSDimitry Andric  def PM#NAME#WNN :
491bdd1243dSDimitry Andric    MMIRR_XX3Form_X4Y2_XAB6<
492bdd1243dSDimitry Andric      opcode, !or(xo, 0xC0), (outs wacc:$AT),
493bdd1243dSDimitry Andric      !con((ins wacc:$ATi), !con(IOL, (ins u4imm:$XMSK, u2imm:$YMSK))),
494bdd1243dSDimitry Andric      !strconcat("pm"#asmbase#"nn ", asmstr#", $XMSK, $YMSK"),
495bdd1243dSDimitry Andric      IIC_VecFP, []>,
496bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
497bdd1243dSDimitry Andric  }
49881ad6265SDimitry Andric}
49981ad6265SDimitry Andric
50081ad6265SDimitry Andric// End of class definitions.
50181ad6265SDimitry Andric//-----------------------------------------------------------------------------
50281ad6265SDimitry Andric
503bdd1243dSDimitry Andriclet Predicates = [MMA, IsNotISAFuture] in {
50481ad6265SDimitry Andric  def XXMFACC :
505*06c3fb27SDimitry Andric    XForm_AT3<31, 0, 177, (outs acc:$ATo), (ins acc:$AT), "xxmfacc $AT",
50681ad6265SDimitry Andric              IIC_VecGeneral,
507*06c3fb27SDimitry Andric              [(set v512i1:$ATo, (int_ppc_mma_xxmfacc v512i1:$AT))]>,
508*06c3fb27SDimitry Andric              RegConstraint<"$ATo = $AT">, NoEncode<"$ATo">;
50981ad6265SDimitry Andric  def XXMTACC :
51081ad6265SDimitry Andric    XForm_AT3<31, 1, 177, (outs acc:$AT), (ins acc:$ATi), "xxmtacc $AT",
51181ad6265SDimitry Andric              IIC_VecGeneral,
51281ad6265SDimitry Andric              [(set v512i1:$AT, (int_ppc_mma_xxmtacc v512i1:$ATi))]>,
51381ad6265SDimitry Andric              RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
51481ad6265SDimitry Andric  def KILL_PAIR : PPCPostRAExpPseudo<(outs vsrprc:$XTp), (ins vsrprc:$XSp),
51581ad6265SDimitry Andric                                      "#KILL_PAIR", []>,
51681ad6265SDimitry Andric                                      RegConstraint<"$XTp = $XSp">;
51781ad6265SDimitry Andric  def BUILD_UACC : PPCPostRAExpPseudo<(outs acc:$AT), (ins uacc:$AS),
51881ad6265SDimitry Andric                                      "#BUILD_UACC $AT, $AS", []>;
51981ad6265SDimitry Andric  // We define XXSETACCZ as rematerializable to undo CSE of that intrinsic in
52081ad6265SDimitry Andric  // the backend. We avoid CSE here because it generates a copy of the acc
52181ad6265SDimitry Andric  // register and this copy is more expensive than calling the intrinsic again.
52281ad6265SDimitry Andric  let isAsCheapAsAMove = 1, isReMaterializable = 1 in {
52381ad6265SDimitry Andric    def XXSETACCZ :
52481ad6265SDimitry Andric      XForm_AT3<31, 3, 177, (outs acc:$AT), (ins), "xxsetaccz $AT", IIC_VecGeneral,
52581ad6265SDimitry Andric                [(set v512i1:$AT, (int_ppc_mma_xxsetaccz))]>;
52681ad6265SDimitry Andric  }
52781ad6265SDimitry Andric  def XVI8GER4SPP :
52881ad6265SDimitry Andric    XX3Form_AT3_XAB6<59, 99, (outs acc:$AT), (ins acc:$ATi, vsrc:$XA, vsrc:$XB),
52981ad6265SDimitry Andric                     "xvi8ger4spp $AT, $XA, $XB", IIC_VecGeneral, []>,
53081ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
53181ad6265SDimitry Andric  let mayStore = 1 in {
53281ad6265SDimitry Andric    def SPILL_ACC: PPCEmitTimePseudo<(outs), (ins acc:$AT, memrix16:$dst),
53381ad6265SDimitry Andric                                     "#SPILL_ACC", []>;
53481ad6265SDimitry Andric    def SPILL_UACC: PPCEmitTimePseudo<(outs), (ins uacc:$AT, memrix16:$dst),
53581ad6265SDimitry Andric                                     "#SPILL_UACC", []>;
53681ad6265SDimitry Andric  }
53781ad6265SDimitry Andric  let mayLoad = 1, hasSideEffects = 0 in {
53881ad6265SDimitry Andric    def RESTORE_ACC: PPCEmitTimePseudo<(outs acc:$AT), (ins memrix16:$src),
53981ad6265SDimitry Andric                                       "#RESTORE_ACC", []>;
54081ad6265SDimitry Andric    def RESTORE_UACC: PPCEmitTimePseudo<(outs uacc:$AT), (ins memrix16:$src),
54181ad6265SDimitry Andric                                       "#RESTORE_UACC", []>;
54281ad6265SDimitry Andric  }
54381ad6265SDimitry Andric}
54481ad6265SDimitry Andric
545bdd1243dSDimitry Andriclet Predicates = [MMA, IsISAFuture], isCodeGenOnly = 1 in {
546bdd1243dSDimitry Andric  // For Future and up XXMFACCW and XXMTACCW will not have patterns.
547bdd1243dSDimitry Andric  // On Future CPU the wacc registers no longer overlap with the vsr registers
548bdd1243dSDimitry Andric  // and so register allocation would have to know to match 4 vsr registers
549bdd1243dSDimitry Andric  // with one wacc register.
550bdd1243dSDimitry Andric  // On top of that Future CPU has a more convenient way to move between vsrs
551bdd1243dSDimitry Andric  // and wacc registers using xxextfdmr512 and xxinstdmr512.
552bdd1243dSDimitry Andric  def XXMFACCW :
553*06c3fb27SDimitry Andric    XForm_AT3<31, 0, 177, (outs wacc:$ATo), (ins wacc:$AT), "xxmfacc $AT",
554bdd1243dSDimitry Andric              IIC_VecGeneral, []>,
555*06c3fb27SDimitry Andric              RegConstraint<"$ATo = $AT">, NoEncode<"$ATo">;
556bdd1243dSDimitry Andric  def XXMTACCW :
557bdd1243dSDimitry Andric    XForm_AT3<31, 1, 177, (outs wacc:$AT), (ins wacc:$ATi), "xxmtacc $AT",
558bdd1243dSDimitry Andric              IIC_VecGeneral, []>,
559bdd1243dSDimitry Andric              RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
560bdd1243dSDimitry Andric
561bdd1243dSDimitry Andric  let isAsCheapAsAMove = 1, isReMaterializable = 1 in {
562bdd1243dSDimitry Andric    def XXSETACCZW :
563bdd1243dSDimitry Andric      XForm_AT3<31, 3, 177, (outs wacc:$AT), (ins), "xxsetaccz $AT",
564bdd1243dSDimitry Andric                IIC_VecGeneral, [(set v512i1:$AT, (int_ppc_mma_xxsetaccz))]>;
565bdd1243dSDimitry Andric  }
566bdd1243dSDimitry Andric
567bdd1243dSDimitry Andric  def XVI8GER4WSPP :
568bdd1243dSDimitry Andric    XX3Form_AT3_XAB6<59, 99, (outs wacc:$AT),
569bdd1243dSDimitry Andric                     (ins wacc:$ATi, vsrc:$XA, vsrc:$XB),
570bdd1243dSDimitry Andric                     "xvi8ger4spp $AT, $XA, $XB", IIC_VecGeneral, []>,
571bdd1243dSDimitry Andric                     RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
572bdd1243dSDimitry Andric
573bdd1243dSDimitry Andric  let mayStore = 1 in {
574bdd1243dSDimitry Andric    def SPILL_WACC: PPCEmitTimePseudo<(outs), (ins wacc:$AT, memrix16:$dst),
575bdd1243dSDimitry Andric                                      "#SPILL_WACC", []>;
576bdd1243dSDimitry Andric  }
577bdd1243dSDimitry Andric  let mayLoad = 1, hasSideEffects = 0 in {
578bdd1243dSDimitry Andric    def RESTORE_WACC: PPCEmitTimePseudo<(outs wacc:$AT), (ins memrix16:$src),
579bdd1243dSDimitry Andric                                        "#RESTORE_WACC", []>;
580bdd1243dSDimitry Andric  }
581bdd1243dSDimitry Andric}
582bdd1243dSDimitry Andric
583bdd1243dSDimitry Andriclet Predicates = [MMA, PrefixInstrs, IsNotISAFuture] in {
58481ad6265SDimitry Andric  def PMXVI8GER4SPP :
58581ad6265SDimitry Andric    MMIRR_XX3Form_XYP4_XAB6<59, 99, (outs acc:$AT),
58681ad6265SDimitry Andric                            (ins acc:$ATi, vsrc:$XA,vsrc:$XB, u4imm:$XMSK,
58781ad6265SDimitry Andric                             u4imm:$YMSK, u4imm:$PMSK),
58881ad6265SDimitry Andric                            "pmxvi8ger4spp $AT, $XA, $XB, $XMSK, $YMSK, $PMSK",
58981ad6265SDimitry Andric                            IIC_VecGeneral, []>,
59081ad6265SDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
59181ad6265SDimitry Andric}
59281ad6265SDimitry Andric
593bdd1243dSDimitry Andriclet Predicates = [MMA, PrefixInstrs, IsISAFuture], isCodeGenOnly = 1 in {
594bdd1243dSDimitry Andric  def PMXVI8GER4WSPP :
595bdd1243dSDimitry Andric    MMIRR_XX3Form_XYP4_XAB6<59, 99, (outs wacc:$AT),
596bdd1243dSDimitry Andric                            (ins wacc:$ATi, vsrc:$XA,vsrc:$XB, u4imm:$XMSK,
597bdd1243dSDimitry Andric                             u4imm:$YMSK, u4imm:$PMSK),
598bdd1243dSDimitry Andric                            "pmxvi8ger4spp $AT, $XA, $XB, $XMSK, $YMSK, $PMSK",
599bdd1243dSDimitry Andric                            IIC_VecGeneral, []>,
600bdd1243dSDimitry Andric    RegConstraint<"$ATi = $AT">, NoEncode<"$ATi">;
601bdd1243dSDimitry Andric}
602bdd1243dSDimitry Andric
60381ad6265SDimitry Andric// MMA accumulating/non-accumulating instructions.
60481ad6265SDimitry Andric//------------------------------------------------------------------------------
60581ad6265SDimitry Andric
60681ad6265SDimitry Andric// XVBF16GER2, XVBF16GER2PP, XVBF16GER2PN, XVBF16GER2NP, XVBF16GER2NN
60781ad6265SDimitry Andric// PMXVBF16GER2, PMXVBF16GER2PP, PMXVBF16GER2PN, PMXVBF16GER2NP, PMXVBF16GER2NN
60881ad6265SDimitry Andricdefm XVBF16GER2 : ACC_NEG_UM_M244_XOM84C<59, 50, (ins vsrc:$XA, vsrc:$XB),
60981ad6265SDimitry Andric                                         "xvbf16ger2", "$AT, $XA, $XB">;
61081ad6265SDimitry Andric
61181ad6265SDimitry Andric// XVI4GER8, XVI4GER8PP, PMXVI4GER8,  PMXVI4GER8PP
61281ad6265SDimitry Andricdefm XVI4GER8 : ACC_UM_M844_XOEO<59, 34, (ins vsrc:$XA, vsrc:$XB),
61381ad6265SDimitry Andric                                 "xvi4ger8", "$AT, $XA, $XB">;
61481ad6265SDimitry Andric
61581ad6265SDimitry Andric// XVI8GER4, XVI8GER4PP, PMXVI8GER4, PMXVI8GER4PP
61681ad6265SDimitry Andricdefm XVI8GER4 : ACC_UM_M444_XOEO<59, 2, (ins vsrc:$XA, vsrc:$XB),
61781ad6265SDimitry Andric                                 "xvi8ger4", "$AT, $XA, $XB">;
61881ad6265SDimitry Andric
61981ad6265SDimitry Andric// XVI16GER2, XVI16GER2PP, PMXVI16GER2, PMXVI16GER2PP
62081ad6265SDimitry Andricdefm XVI16GER2 : ACC_UM_M244_XO46<59, 75, (ins vsrc:$XA, vsrc:$XB),
62181ad6265SDimitry Andric                                  "xvi16ger2", "$AT, $XA, $XB">;
62281ad6265SDimitry Andric
62381ad6265SDimitry Andric// XVI16GER2S, XVI16GER2SPP, PMXVI16GER2S, PMXVI16GER2SPP
62481ad6265SDimitry Andricdefm XVI16GER2S : ACC_UM_M244_XOEO<59, 42, (ins vsrc:$XA, vsrc:$XB),
62581ad6265SDimitry Andric                                   "xvi16ger2s", "$AT, $XA, $XB">;
62681ad6265SDimitry Andric
62781ad6265SDimitry Andric// XVF16GER2, XVF16GER2PP, XVF16GER2PN, XVF16GER2NP, XVF16GER2NN
62881ad6265SDimitry Andric// PMXVF16GER2, PMXVF16GER2PP, PMXVF16GER2PN, PMXVF16GER2NP, PMXVF16GER2NN
62981ad6265SDimitry Andricdefm XVF16GER2 : ACC_NEG_UM_M244_XOM84C<59, 18, (ins vsrc:$XA, vsrc:$XB),
63081ad6265SDimitry Andric                                        "xvf16ger2", "$AT, $XA, $XB">;
63181ad6265SDimitry Andric
63281ad6265SDimitry Andric// XVF32GER, XVF32GERPP, XVF32GERPN, XVF32GERNP, XVF32GERPP
63381ad6265SDimitry Andric// PMXVF32GER, PMXVF32GERPP, PMXVF32GERPN, PMXVF32GERNP, PMXVF32GERPP
63481ad6265SDimitry Andricdefm XVF32GER : ACC_NEG_UM_M44_XOM84C<59, 26, (ins vsrc:$XA, vsrc:$XB),
63581ad6265SDimitry Andric                                      "xvf32ger", "$AT, $XA, $XB">;
63681ad6265SDimitry Andric
63781ad6265SDimitry Andric// XVF64GER, XVF64GERPP, XVF64GERPN, XVF64GERNP, XVF64GERNN
63881ad6265SDimitry Andric// PMXVF64GER, PMXVF64GERPP, PMXVF64GERPN, PMXVF64GERNP, PMXVF64GERNN
63981ad6265SDimitry Andricdefm XVF64GER : ACC_NEG_UM_M42_XOM84C<59, 58, (ins vsrpevenrc:$XA, vsrc:$XB),
64081ad6265SDimitry Andric                                      "xvf64ger", "$AT, $XA, $XB">;
64181ad6265SDimitry Andric//------------------------------------------------------------------------------
64281ad6265SDimitry Andric
64381ad6265SDimitry Andric// MMA Intrinsics
644bdd1243dSDimitry Andriclet Predicates = [MMA, IsNotISAFuture] in {
64581ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi4ger8 v16i8:$XA, v16i8:$XB)),
64681ad6265SDimitry Andric            (XVI4GER8 RCCp.AToVSRC, RCCp.BToVSRC)>;
64781ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi4ger8pp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
64881ad6265SDimitry Andric            (XVI4GER8PP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
64981ad6265SDimitry Andric
65081ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi8ger4 v16i8:$XA, v16i8:$XB)),
65181ad6265SDimitry Andric            (XVI8GER4 RCCp.AToVSRC, RCCp.BToVSRC)>;
65281ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi8ger4pp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
65381ad6265SDimitry Andric            (XVI8GER4PP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
65481ad6265SDimitry Andric
65581ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi16ger2s v16i8:$XA, v16i8:$XB)),
65681ad6265SDimitry Andric            (XVI16GER2S RCCp.AToVSRC, RCCp.BToVSRC)>;
65781ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi16ger2spp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
65881ad6265SDimitry Andric            (XVI16GER2SPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
659bdd1243dSDimitry Andric}
66081ad6265SDimitry Andric
661bdd1243dSDimitry Andriclet Predicates = [MMA, IsISAFuture] in {
662bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi4ger8 v16i8:$XA, v16i8:$XB)),
663bdd1243dSDimitry Andric            (XVI4GER8W RCCp.AToVSRC, RCCp.BToVSRC)>;
664bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi4ger8pp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
665bdd1243dSDimitry Andric            (XVI4GER8WPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
666bdd1243dSDimitry Andric
667bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi8ger4 v16i8:$XA, v16i8:$XB)),
668bdd1243dSDimitry Andric            (XVI8GER4W RCCp.AToVSRC, RCCp.BToVSRC)>;
669bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi8ger4pp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
670bdd1243dSDimitry Andric            (XVI8GER4WPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
671bdd1243dSDimitry Andric
672bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi16ger2s v16i8:$XA, v16i8:$XB)),
673bdd1243dSDimitry Andric            (XVI16GER2SW RCCp.AToVSRC, RCCp.BToVSRC)>;
674bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi16ger2spp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
675bdd1243dSDimitry Andric            (XVI16GER2SWPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
676bdd1243dSDimitry Andric}
677bdd1243dSDimitry Andric
678bdd1243dSDimitry Andriclet Predicates = [MMA, IsNotISAFuture] in {
67981ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf16ger2 v16i8:$XA, v16i8:$XB)),
68081ad6265SDimitry Andric            (XVF16GER2 RCCp.AToVSRC, RCCp.BToVSRC)>;
68181ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf16ger2pp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
68281ad6265SDimitry Andric            (XVF16GER2PP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
68381ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf16ger2pn v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
68481ad6265SDimitry Andric            (XVF16GER2PN $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
68581ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf16ger2np v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
68681ad6265SDimitry Andric            (XVF16GER2NP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
68781ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf16ger2nn v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
68881ad6265SDimitry Andric            (XVF16GER2NN $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
689bdd1243dSDimitry Andric}
69081ad6265SDimitry Andric
691bdd1243dSDimitry Andriclet Predicates = [MMA, IsISAFuture] in {
692bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf16ger2 v16i8:$XA, v16i8:$XB)),
693bdd1243dSDimitry Andric            (XVF16GER2W RCCp.AToVSRC, RCCp.BToVSRC)>;
694bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf16ger2pp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
695bdd1243dSDimitry Andric            (XVF16GER2WPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
696bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf16ger2pn v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
697bdd1243dSDimitry Andric            (XVF16GER2WPN $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
698bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf16ger2np v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
699bdd1243dSDimitry Andric            (XVF16GER2WNP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
700bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf16ger2nn v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
701bdd1243dSDimitry Andric            (XVF16GER2WNN $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
702bdd1243dSDimitry Andric}
703bdd1243dSDimitry Andric
704bdd1243dSDimitry Andriclet Predicates = [MMA, IsNotISAFuture] in {
70581ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf32ger v16i8:$XA, v16i8:$XB)),
70681ad6265SDimitry Andric            (XVF32GER RCCp.AToVSRC, RCCp.BToVSRC)>;
70781ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf32gerpp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
70881ad6265SDimitry Andric            (XVF32GERPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
70981ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf32gerpn v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
71081ad6265SDimitry Andric            (XVF32GERPN $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
71181ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf32gernp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
71281ad6265SDimitry Andric            (XVF32GERNP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
71381ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf32gernn v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
71481ad6265SDimitry Andric            (XVF32GERNN $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
71581ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf64ger v256i1:$XA, v16i8:$XB)),
71681ad6265SDimitry Andric            (XVF64GER $XA, RCCp.BToVSRC)>;
71781ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf64gerpp v512i1:$ATi, v256i1:$XA, v16i8:$XB)),
71881ad6265SDimitry Andric            (XVF64GERPP $ATi, $XA, RCCp.BToVSRC)>;
71981ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf64gerpn v512i1:$ATi, v256i1:$XA, v16i8:$XB)),
72081ad6265SDimitry Andric            (XVF64GERPN $ATi, $XA, RCCp.BToVSRC)>;
72181ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf64gernp v512i1:$ATi, v256i1:$XA, v16i8:$XB)),
72281ad6265SDimitry Andric            (XVF64GERNP $ATi, $XA, RCCp.BToVSRC)>;
72381ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf64gernn v512i1:$ATi, v256i1:$XA, v16i8:$XB)),
72481ad6265SDimitry Andric            (XVF64GERNN $ATi, $XA, RCCp.BToVSRC)>;
72581ad6265SDimitry Andric
72681ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvbf16ger2 v16i8:$XA, v16i8:$XB)),
72781ad6265SDimitry Andric            (XVBF16GER2 RCCp.AToVSRC, RCCp.BToVSRC)>;
72881ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvbf16ger2pp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
72981ad6265SDimitry Andric            (XVBF16GER2PP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
73081ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvbf16ger2pn v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
73181ad6265SDimitry Andric            (XVBF16GER2PN $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
73281ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvbf16ger2np v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
73381ad6265SDimitry Andric            (XVBF16GER2NP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
73481ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvbf16ger2nn v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
73581ad6265SDimitry Andric            (XVBF16GER2NN $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
73681ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi16ger2 v16i8:$XA, v16i8:$XB)),
73781ad6265SDimitry Andric            (XVI16GER2 RCCp.AToVSRC, RCCp.BToVSRC)>;
73881ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi16ger2pp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
73981ad6265SDimitry Andric            (XVI16GER2PP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
74081ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi8ger4spp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
74181ad6265SDimitry Andric            (XVI8GER4SPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
74281ad6265SDimitry Andric}
74381ad6265SDimitry Andric
744bdd1243dSDimitry Andriclet Predicates = [MMA, IsISAFuture] in {
745bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf32ger v16i8:$XA, v16i8:$XB)),
746bdd1243dSDimitry Andric            (XVF32GERW RCCp.AToVSRC, RCCp.BToVSRC)>;
747bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf32gerpp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
748bdd1243dSDimitry Andric            (XVF32GERWPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
749bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf32gerpn v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
750bdd1243dSDimitry Andric            (XVF32GERWPN $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
751bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf32gernp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
752bdd1243dSDimitry Andric            (XVF32GERWNP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
753bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf32gernn v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
754bdd1243dSDimitry Andric            (XVF32GERWNN $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
755bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf64ger v256i1:$XA, v16i8:$XB)),
756bdd1243dSDimitry Andric            (XVF64GERW $XA, RCCp.BToVSRC)>;
757bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf64gerpp v512i1:$ATi, v256i1:$XA, v16i8:$XB)),
758bdd1243dSDimitry Andric            (XVF64GERWPP $ATi, $XA, RCCp.BToVSRC)>;
759bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf64gerpn v512i1:$ATi, v256i1:$XA, v16i8:$XB)),
760bdd1243dSDimitry Andric            (XVF64GERWPN $ATi, $XA, RCCp.BToVSRC)>;
761bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf64gernp v512i1:$ATi, v256i1:$XA, v16i8:$XB)),
762bdd1243dSDimitry Andric            (XVF64GERNP $ATi, $XA, RCCp.BToVSRC)>;
763bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvf64gernn v512i1:$ATi, v256i1:$XA, v16i8:$XB)),
764bdd1243dSDimitry Andric            (XVF64GERWNN $ATi, $XA, RCCp.BToVSRC)>;
765bdd1243dSDimitry Andric
766bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvbf16ger2 v16i8:$XA, v16i8:$XB)),
767bdd1243dSDimitry Andric            (XVBF16GER2W RCCp.AToVSRC, RCCp.BToVSRC)>;
768bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvbf16ger2pp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
769bdd1243dSDimitry Andric            (XVBF16GER2WPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
770bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvbf16ger2pn v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
771bdd1243dSDimitry Andric            (XVBF16GER2WPN $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
772bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvbf16ger2np v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
773bdd1243dSDimitry Andric            (XVBF16GER2WNP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
774bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvbf16ger2nn v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
775bdd1243dSDimitry Andric            (XVBF16GER2WNN $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
776bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi16ger2 v16i8:$XA, v16i8:$XB)),
777bdd1243dSDimitry Andric            (XVI16GER2W RCCp.AToVSRC, RCCp.BToVSRC)>;
778bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi16ger2pp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
779bdd1243dSDimitry Andric            (XVI16GER2WPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
780bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_xvi8ger4spp v512i1:$ATi, v16i8:$XA, v16i8:$XB)),
781bdd1243dSDimitry Andric            (XVI8GER4WSPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC)>;
782bdd1243dSDimitry Andric}
78381ad6265SDimitry Andric// MMA Intrinsics
784bdd1243dSDimitry Andric
785bdd1243dSDimitry Andriclet Predicates = [MMA, PrefixInstrs, IsNotISAFuture] in {
78681ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi4ger8 v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
78781ad6265SDimitry Andric                                            Msk4Imm:$YMSK, Msk8Imm:$PMSK)),
78881ad6265SDimitry Andric            (PMXVI4GER8 RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
78981ad6265SDimitry Andric                        Msk4Imm:$YMSK, Msk8Imm:$PMSK)>;
79081ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi4ger8pp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
79181ad6265SDimitry Andric                                              Msk4Imm:$XMSK, Msk4Imm:$YMSK,
79281ad6265SDimitry Andric                                              Msk8Imm:$PMSK)),
79381ad6265SDimitry Andric            (PMXVI4GER8PP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
79481ad6265SDimitry Andric                          Msk4Imm:$YMSK, Msk8Imm:$PMSK)>;
79581ad6265SDimitry Andric
79681ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi8ger4 v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
79781ad6265SDimitry Andric                                            Msk4Imm:$YMSK, Msk4Imm:$PMSK)),
79881ad6265SDimitry Andric            (PMXVI8GER4 RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
79981ad6265SDimitry Andric                        Msk4Imm:$YMSK, Msk4Imm:$PMSK)>;
80081ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi8ger4pp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
80181ad6265SDimitry Andric                                              Msk4Imm:$XMSK, Msk4Imm:$YMSK,
80281ad6265SDimitry Andric                                              Msk4Imm:$PMSK)),
80381ad6265SDimitry Andric            (PMXVI8GER4PP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
80481ad6265SDimitry Andric                          Msk4Imm:$YMSK, Msk4Imm:$PMSK)>;
80581ad6265SDimitry Andric
80681ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi16ger2s v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
80781ad6265SDimitry Andric                                              Msk4Imm:$YMSK, Msk2Imm:$PMSK)),
80881ad6265SDimitry Andric            (PMXVI16GER2S RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
80981ad6265SDimitry Andric                          Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
81081ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi16ger2spp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
81181ad6265SDimitry Andric                                                Msk4Imm:$XMSK, Msk4Imm:$YMSK,
81281ad6265SDimitry Andric                                                Msk2Imm:$PMSK)),
81381ad6265SDimitry Andric            (PMXVI16GER2SPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
81481ad6265SDimitry Andric                            Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
81581ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf16ger2 v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
81681ad6265SDimitry Andric                                             Msk4Imm:$YMSK, Msk2Imm:$PMSK)),
81781ad6265SDimitry Andric            (PMXVF16GER2 RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
81881ad6265SDimitry Andric                         Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
81981ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf16ger2pp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
82081ad6265SDimitry Andric                                               Msk4Imm:$XMSK, Msk4Imm:$YMSK,
82181ad6265SDimitry Andric                                               Msk2Imm:$PMSK)),
82281ad6265SDimitry Andric            (PMXVF16GER2PP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
82381ad6265SDimitry Andric                           Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
82481ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf16ger2pn v512i1:$ATi, v16i8:$XA, v16i8:$XB,
82581ad6265SDimitry Andric                                               Msk4Imm:$XMSK, Msk4Imm:$YMSK,
82681ad6265SDimitry Andric                                               Msk2Imm:$PMSK)),
82781ad6265SDimitry Andric            (PMXVF16GER2PN $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
82881ad6265SDimitry Andric                           Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
82981ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf16ger2np v512i1:$ATi, v16i8:$XA, v16i8:$XB,
83081ad6265SDimitry Andric                                               Msk4Imm:$XMSK, Msk4Imm:$YMSK,
83181ad6265SDimitry Andric                                               Msk2Imm:$PMSK)),
83281ad6265SDimitry Andric            (PMXVF16GER2NP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
83381ad6265SDimitry Andric                           Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
83481ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf16ger2nn v512i1:$ATi, v16i8:$XA, v16i8:$XB,
83581ad6265SDimitry Andric                                               Msk4Imm:$XMSK, Msk4Imm:$YMSK,
83681ad6265SDimitry Andric                                               Msk2Imm:$PMSK)),
83781ad6265SDimitry Andric            (PMXVF16GER2NN $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
83881ad6265SDimitry Andric                           Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
83981ad6265SDimitry Andric
84081ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf32ger v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
84181ad6265SDimitry Andric                                            Msk4Imm:$YMSK)),
84281ad6265SDimitry Andric            (PMXVF32GER RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
84381ad6265SDimitry Andric                        Msk4Imm:$YMSK)>;
84481ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf32gerpp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
84581ad6265SDimitry Andric                                              Msk4Imm:$XMSK, Msk4Imm:$YMSK)),
84681ad6265SDimitry Andric            (PMXVF32GERPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
84781ad6265SDimitry Andric                          Msk4Imm:$YMSK)>;
84881ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf32gerpn v512i1:$ATi, v16i8:$XA, v16i8:$XB,
84981ad6265SDimitry Andric                                              Msk4Imm:$XMSK, Msk4Imm:$YMSK)),
85081ad6265SDimitry Andric            (PMXVF32GERPN $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
85181ad6265SDimitry Andric                          Msk4Imm:$YMSK)>;
85281ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf32gernp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
85381ad6265SDimitry Andric                                              Msk4Imm:$XMSK, Msk4Imm:$YMSK)),
85481ad6265SDimitry Andric            (PMXVF32GERNP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
85581ad6265SDimitry Andric                          Msk4Imm:$YMSK)>;
85681ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf32gernn v512i1:$ATi, v16i8:$XA, v16i8:$XB,
85781ad6265SDimitry Andric                                              Msk4Imm:$XMSK, Msk4Imm:$YMSK)),
85881ad6265SDimitry Andric            (PMXVF32GERNN $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
85981ad6265SDimitry Andric                          Msk4Imm:$YMSK)>;
86081ad6265SDimitry Andric
86181ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf64ger v256i1:$XA, v16i8:$XB, Msk4Imm:$XMSK,
86281ad6265SDimitry Andric                                            Msk2Imm:$YMSK)),
86381ad6265SDimitry Andric            (PMXVF64GER $XA, RCCp.BToVSRC, Msk4Imm:$XMSK, Msk2Imm:$YMSK)>;
86481ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf64gerpp v512i1:$ATi, v256i1:$XA, v16i8:$XB,
86581ad6265SDimitry Andric                                              Msk4Imm:$XMSK, Msk2Imm:$YMSK)),
86681ad6265SDimitry Andric            (PMXVF64GERPP $ATi, $XA, RCCp.BToVSRC, Msk4Imm:$XMSK,
86781ad6265SDimitry Andric                          Msk2Imm:$YMSK)>;
86881ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf64gerpn v512i1:$ATi, v256i1:$XA, v16i8:$XB,
86981ad6265SDimitry Andric                                              Msk4Imm:$XMSK, Msk2Imm:$YMSK)),
87081ad6265SDimitry Andric            (PMXVF64GERPN $ATi, $XA, RCCp.BToVSRC, Msk4Imm:$XMSK,
87181ad6265SDimitry Andric                          Msk2Imm:$YMSK)>;
87281ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf64gernp v512i1:$ATi, v256i1:$XA, v16i8:$XB,
87381ad6265SDimitry Andric                                              Msk4Imm:$XMSK, Msk2Imm:$YMSK)),
87481ad6265SDimitry Andric            (PMXVF64GERNP $ATi, $XA, RCCp.BToVSRC, Msk4Imm:$XMSK,
87581ad6265SDimitry Andric                          Msk2Imm:$YMSK)>;
87681ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf64gernn v512i1:$ATi, v256i1:$XA, v16i8:$XB,
87781ad6265SDimitry Andric                                              Msk4Imm:$XMSK, Msk2Imm:$YMSK)),
87881ad6265SDimitry Andric            (PMXVF64GERNN $ATi, $XA, RCCp.BToVSRC, Msk4Imm:$XMSK,
87981ad6265SDimitry Andric                          Msk2Imm:$YMSK)>;
88081ad6265SDimitry Andric
88181ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvbf16ger2 v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
88281ad6265SDimitry Andric                                              Msk4Imm:$YMSK, Msk2Imm:$PMSK)),
88381ad6265SDimitry Andric            (PMXVBF16GER2 RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
88481ad6265SDimitry Andric                          Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
88581ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvbf16ger2pp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
88681ad6265SDimitry Andric                                                Msk4Imm:$XMSK, Msk4Imm:$YMSK,
88781ad6265SDimitry Andric                                                Msk2Imm:$PMSK)),
88881ad6265SDimitry Andric            (PMXVBF16GER2PP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
88981ad6265SDimitry Andric                            Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
89081ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvbf16ger2pn v512i1:$ATi, v16i8:$XA, v16i8:$XB,
89181ad6265SDimitry Andric                                                Msk4Imm:$XMSK, Msk4Imm:$YMSK,
89281ad6265SDimitry Andric                                                Msk2Imm:$PMSK)),
89381ad6265SDimitry Andric            (PMXVBF16GER2PN $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
89481ad6265SDimitry Andric                            Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
89581ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvbf16ger2np v512i1:$ATi, v16i8:$XA, v16i8:$XB,
89681ad6265SDimitry Andric                                                Msk4Imm:$XMSK, Msk4Imm:$YMSK,
89781ad6265SDimitry Andric                                                Msk2Imm:$PMSK)),
89881ad6265SDimitry Andric            (PMXVBF16GER2NP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
89981ad6265SDimitry Andric                            Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
90081ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvbf16ger2nn v512i1:$ATi, v16i8:$XA, v16i8:$XB,
90181ad6265SDimitry Andric                                                Msk4Imm:$XMSK, Msk4Imm:$YMSK,
90281ad6265SDimitry Andric                                                Msk2Imm:$PMSK)),
90381ad6265SDimitry Andric            (PMXVBF16GER2NN $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
90481ad6265SDimitry Andric                            Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
90581ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi16ger2 v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
90681ad6265SDimitry Andric                                             Msk4Imm:$YMSK, Msk2Imm:$PMSK)),
90781ad6265SDimitry Andric            (PMXVI16GER2 RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
90881ad6265SDimitry Andric                         Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
90981ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi8ger4spp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
91081ad6265SDimitry Andric                                               Msk4Imm:$XMSK, Msk4Imm:$YMSK,
91181ad6265SDimitry Andric                                               Msk2Imm:$PMSK)),
91281ad6265SDimitry Andric            (PMXVI8GER4SPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
91381ad6265SDimitry Andric                           Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
91481ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi16ger2pp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
91581ad6265SDimitry Andric                                               Msk4Imm:$XMSK, Msk4Imm:$YMSK,
91681ad6265SDimitry Andric                                               Msk2Imm:$PMSK)),
91781ad6265SDimitry Andric            (PMXVI16GER2PP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
91881ad6265SDimitry Andric                           Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
91981ad6265SDimitry Andric}
92081ad6265SDimitry Andric
921bdd1243dSDimitry Andriclet Predicates = [MMA, PrefixInstrs, IsISAFuture] in {
922bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi4ger8 v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
923bdd1243dSDimitry Andric                                            Msk4Imm:$YMSK, Msk8Imm:$PMSK)),
924bdd1243dSDimitry Andric            (PMXVI4GER8W RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
925bdd1243dSDimitry Andric                        Msk4Imm:$YMSK, Msk8Imm:$PMSK)>;
926bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi4ger8pp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
927bdd1243dSDimitry Andric                                              Msk4Imm:$XMSK, Msk4Imm:$YMSK,
928bdd1243dSDimitry Andric                                              Msk8Imm:$PMSK)),
929bdd1243dSDimitry Andric            (PMXVI4GER8WPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
930bdd1243dSDimitry Andric                          Msk4Imm:$YMSK, Msk8Imm:$PMSK)>;
931bdd1243dSDimitry Andric
932bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi8ger4 v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
933bdd1243dSDimitry Andric                                            Msk4Imm:$YMSK, Msk4Imm:$PMSK)),
934bdd1243dSDimitry Andric            (PMXVI8GER4W RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
935bdd1243dSDimitry Andric                        Msk4Imm:$YMSK, Msk4Imm:$PMSK)>;
936bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi8ger4pp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
937bdd1243dSDimitry Andric                                              Msk4Imm:$XMSK, Msk4Imm:$YMSK,
938bdd1243dSDimitry Andric                                              Msk4Imm:$PMSK)),
939bdd1243dSDimitry Andric            (PMXVI8GER4WPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
940bdd1243dSDimitry Andric                          Msk4Imm:$YMSK, Msk4Imm:$PMSK)>;
941bdd1243dSDimitry Andric
942bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi16ger2s v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
943bdd1243dSDimitry Andric                                              Msk4Imm:$YMSK, Msk2Imm:$PMSK)),
944bdd1243dSDimitry Andric            (PMXVI16GER2SW RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
945bdd1243dSDimitry Andric                          Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
946bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi16ger2spp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
947bdd1243dSDimitry Andric                                                Msk4Imm:$XMSK, Msk4Imm:$YMSK,
948bdd1243dSDimitry Andric                                                Msk2Imm:$PMSK)),
949bdd1243dSDimitry Andric            (PMXVI16GER2SWPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
950bdd1243dSDimitry Andric                            Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
951bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf16ger2 v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
952bdd1243dSDimitry Andric                                             Msk4Imm:$YMSK, Msk2Imm:$PMSK)),
953bdd1243dSDimitry Andric            (PMXVF16GER2W RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
954bdd1243dSDimitry Andric                         Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
955bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf16ger2pp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
956bdd1243dSDimitry Andric                                               Msk4Imm:$XMSK, Msk4Imm:$YMSK,
957bdd1243dSDimitry Andric                                               Msk2Imm:$PMSK)),
958bdd1243dSDimitry Andric            (PMXVF16GER2WPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
959bdd1243dSDimitry Andric                           Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
960bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf16ger2pn v512i1:$ATi, v16i8:$XA, v16i8:$XB,
961bdd1243dSDimitry Andric                                               Msk4Imm:$XMSK, Msk4Imm:$YMSK,
962bdd1243dSDimitry Andric                                               Msk2Imm:$PMSK)),
963bdd1243dSDimitry Andric            (PMXVF16GER2WPN $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
964bdd1243dSDimitry Andric                           Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
965bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf16ger2np v512i1:$ATi, v16i8:$XA, v16i8:$XB,
966bdd1243dSDimitry Andric                                               Msk4Imm:$XMSK, Msk4Imm:$YMSK,
967bdd1243dSDimitry Andric                                               Msk2Imm:$PMSK)),
968bdd1243dSDimitry Andric            (PMXVF16GER2WNP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
969bdd1243dSDimitry Andric                           Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
970bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf16ger2nn v512i1:$ATi, v16i8:$XA, v16i8:$XB,
971bdd1243dSDimitry Andric                                               Msk4Imm:$XMSK, Msk4Imm:$YMSK,
972bdd1243dSDimitry Andric                                               Msk2Imm:$PMSK)),
973bdd1243dSDimitry Andric            (PMXVF16GER2WNN $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
974bdd1243dSDimitry Andric                           Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
975bdd1243dSDimitry Andric
976bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf32ger v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
977bdd1243dSDimitry Andric                                            Msk4Imm:$YMSK)),
978bdd1243dSDimitry Andric            (PMXVF32GERW RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
979bdd1243dSDimitry Andric                        Msk4Imm:$YMSK)>;
980bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf32gerpp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
981bdd1243dSDimitry Andric                                              Msk4Imm:$XMSK, Msk4Imm:$YMSK)),
982bdd1243dSDimitry Andric            (PMXVF32GERWPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
983bdd1243dSDimitry Andric                          Msk4Imm:$YMSK)>;
984bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf32gerpn v512i1:$ATi, v16i8:$XA, v16i8:$XB,
985bdd1243dSDimitry Andric                                              Msk4Imm:$XMSK, Msk4Imm:$YMSK)),
986bdd1243dSDimitry Andric            (PMXVF32GERWPN $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
987bdd1243dSDimitry Andric                          Msk4Imm:$YMSK)>;
988bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf32gernp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
989bdd1243dSDimitry Andric                                              Msk4Imm:$XMSK, Msk4Imm:$YMSK)),
990bdd1243dSDimitry Andric            (PMXVF32GERWNP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
991bdd1243dSDimitry Andric                          Msk4Imm:$YMSK)>;
992bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf32gernn v512i1:$ATi, v16i8:$XA, v16i8:$XB,
993bdd1243dSDimitry Andric                                              Msk4Imm:$XMSK, Msk4Imm:$YMSK)),
994bdd1243dSDimitry Andric            (PMXVF32GERWNN $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
995bdd1243dSDimitry Andric                          Msk4Imm:$YMSK)>;
996bdd1243dSDimitry Andric
997bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf64ger v256i1:$XA, v16i8:$XB, Msk4Imm:$XMSK,
998bdd1243dSDimitry Andric                                            Msk2Imm:$YMSK)),
999bdd1243dSDimitry Andric            (PMXVF64GERW $XA, RCCp.BToVSRC, Msk4Imm:$XMSK, Msk2Imm:$YMSK)>;
1000bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf64gerpp v512i1:$ATi, v256i1:$XA, v16i8:$XB,
1001bdd1243dSDimitry Andric                                              Msk4Imm:$XMSK, Msk2Imm:$YMSK)),
1002bdd1243dSDimitry Andric            (PMXVF64GERWPP $ATi, $XA, RCCp.BToVSRC, Msk4Imm:$XMSK,
1003bdd1243dSDimitry Andric                          Msk2Imm:$YMSK)>;
1004bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf64gerpn v512i1:$ATi, v256i1:$XA, v16i8:$XB,
1005bdd1243dSDimitry Andric                                              Msk4Imm:$XMSK, Msk2Imm:$YMSK)),
1006bdd1243dSDimitry Andric            (PMXVF64GERWPN $ATi, $XA, RCCp.BToVSRC, Msk4Imm:$XMSK,
1007bdd1243dSDimitry Andric                          Msk2Imm:$YMSK)>;
1008bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf64gernp v512i1:$ATi, v256i1:$XA, v16i8:$XB,
1009bdd1243dSDimitry Andric                                              Msk4Imm:$XMSK, Msk2Imm:$YMSK)),
1010bdd1243dSDimitry Andric            (PMXVF64GERWNP $ATi, $XA, RCCp.BToVSRC, Msk4Imm:$XMSK,
1011bdd1243dSDimitry Andric                          Msk2Imm:$YMSK)>;
1012bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvf64gernn v512i1:$ATi, v256i1:$XA, v16i8:$XB,
1013bdd1243dSDimitry Andric                                              Msk4Imm:$XMSK, Msk2Imm:$YMSK)),
1014bdd1243dSDimitry Andric            (PMXVF64GERWNN $ATi, $XA, RCCp.BToVSRC, Msk4Imm:$XMSK,
1015bdd1243dSDimitry Andric                          Msk2Imm:$YMSK)>;
1016bdd1243dSDimitry Andric
1017bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvbf16ger2 v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
1018bdd1243dSDimitry Andric                                              Msk4Imm:$YMSK, Msk2Imm:$PMSK)),
1019bdd1243dSDimitry Andric            (PMXVBF16GER2W RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
1020bdd1243dSDimitry Andric                          Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
1021bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvbf16ger2pp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
1022bdd1243dSDimitry Andric                                                Msk4Imm:$XMSK, Msk4Imm:$YMSK,
1023bdd1243dSDimitry Andric                                                Msk2Imm:$PMSK)),
1024bdd1243dSDimitry Andric            (PMXVBF16GER2WPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
1025bdd1243dSDimitry Andric                            Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
1026bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvbf16ger2pn v512i1:$ATi, v16i8:$XA, v16i8:$XB,
1027bdd1243dSDimitry Andric                                                Msk4Imm:$XMSK, Msk4Imm:$YMSK,
1028bdd1243dSDimitry Andric                                                Msk2Imm:$PMSK)),
1029bdd1243dSDimitry Andric            (PMXVBF16GER2WPN $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
1030bdd1243dSDimitry Andric                            Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
1031bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvbf16ger2np v512i1:$ATi, v16i8:$XA, v16i8:$XB,
1032bdd1243dSDimitry Andric                                                Msk4Imm:$XMSK, Msk4Imm:$YMSK,
1033bdd1243dSDimitry Andric                                                Msk2Imm:$PMSK)),
1034bdd1243dSDimitry Andric            (PMXVBF16GER2WNP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
1035bdd1243dSDimitry Andric                            Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
1036bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvbf16ger2nn v512i1:$ATi, v16i8:$XA, v16i8:$XB,
1037bdd1243dSDimitry Andric                                                Msk4Imm:$XMSK, Msk4Imm:$YMSK,
1038bdd1243dSDimitry Andric                                                Msk2Imm:$PMSK)),
1039bdd1243dSDimitry Andric            (PMXVBF16GER2WNN $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
1040bdd1243dSDimitry Andric                            Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
1041bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi16ger2 v16i8:$XA, v16i8:$XB, Msk4Imm:$XMSK,
1042bdd1243dSDimitry Andric                                             Msk4Imm:$YMSK, Msk2Imm:$PMSK)),
1043bdd1243dSDimitry Andric            (PMXVI16GER2W RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
1044bdd1243dSDimitry Andric                         Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
1045bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi8ger4spp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
1046bdd1243dSDimitry Andric                                               Msk4Imm:$XMSK, Msk4Imm:$YMSK,
1047bdd1243dSDimitry Andric                                               Msk2Imm:$PMSK)),
1048bdd1243dSDimitry Andric            (PMXVI8GER4WSPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
1049bdd1243dSDimitry Andric                           Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
1050bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_pmxvi16ger2pp v512i1:$ATi, v16i8:$XA, v16i8:$XB,
1051bdd1243dSDimitry Andric                                               Msk4Imm:$XMSK, Msk4Imm:$YMSK,
1052bdd1243dSDimitry Andric                                               Msk2Imm:$PMSK)),
1053bdd1243dSDimitry Andric            (PMXVI16GER2WPP $ATi, RCCp.AToVSRC, RCCp.BToVSRC, Msk4Imm:$XMSK,
1054bdd1243dSDimitry Andric                           Msk4Imm:$YMSK, Msk2Imm:$PMSK)>;
1055bdd1243dSDimitry Andric}
1056bdd1243dSDimitry Andric
105781ad6265SDimitry Andricdef ConcatsMMA {
105881ad6265SDimitry Andric  dag VecsToVecPair0 =
105981ad6265SDimitry Andric    (v256i1 (INSERT_SUBREG
106081ad6265SDimitry Andric      (INSERT_SUBREG (IMPLICIT_DEF), $vs0, sub_vsx1),
106181ad6265SDimitry Andric      $vs1, sub_vsx0));
106281ad6265SDimitry Andric  dag VecsToVecPair1 =
106381ad6265SDimitry Andric    (v256i1 (INSERT_SUBREG
106481ad6265SDimitry Andric      (INSERT_SUBREG (IMPLICIT_DEF), $vs2, sub_vsx1),
106581ad6265SDimitry Andric      $vs3, sub_vsx0));
106681ad6265SDimitry Andric  dag VecsToVecQuad =
106781ad6265SDimitry Andric    (BUILD_UACC (INSERT_SUBREG
106881ad6265SDimitry Andric                  (INSERT_SUBREG (v512i1 (IMPLICIT_DEF)),
106981ad6265SDimitry Andric                                 (KILL_PAIR VecsToVecPair0), sub_pair0),
107081ad6265SDimitry Andric                  (KILL_PAIR VecsToVecPair1), sub_pair1));
107181ad6265SDimitry Andric}
107281ad6265SDimitry Andric
107381ad6265SDimitry Andricdef Extracts {
107481ad6265SDimitry Andric  dag Pair0 = (v256i1 (EXTRACT_SUBREG $v, sub_pair0));
107581ad6265SDimitry Andric  dag Pair1 = (v256i1 (EXTRACT_SUBREG $v, sub_pair1));
107681ad6265SDimitry Andric  dag Vec0 = (v4i32 (EXTRACT_SUBREG Pair0, sub_vsx0));
107781ad6265SDimitry Andric  dag Vec1 = (v4i32 (EXTRACT_SUBREG Pair0, sub_vsx1));
107881ad6265SDimitry Andric  dag Vec2 = (v4i32 (EXTRACT_SUBREG Pair1, sub_vsx0));
107981ad6265SDimitry Andric  dag Vec3 = (v4i32 (EXTRACT_SUBREG Pair1, sub_vsx1));
108081ad6265SDimitry Andric}
108181ad6265SDimitry Andric
1082bdd1243dSDimitry Andriclet Predicates = [MMA, IsNotISAFuture] in {
108381ad6265SDimitry Andric  def : Pat<(v512i1 (PPCAccBuild v4i32:$vs1, v4i32:$vs0, v4i32:$vs3, v4i32:$vs2)),
108481ad6265SDimitry Andric            (XXMTACC ConcatsMMA.VecsToVecQuad)>;
108581ad6265SDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_assemble_acc v16i8:$vs1, v16i8:$vs0,
108681ad6265SDimitry Andric                                              v16i8:$vs3, v16i8:$vs2)),
108781ad6265SDimitry Andric            (XXMTACC ConcatsMMA.VecsToVecQuad)>;
108881ad6265SDimitry Andric  def : Pat<(v512i1 (PPCxxmfacc v512i1:$AS)), (XXMFACC acc:$AS)>;
108981ad6265SDimitry Andric  def : Pat<(v4i32 (PPCAccExtractVsx acc:$v, 0)),
109081ad6265SDimitry Andric            Extracts.Vec0>;
109181ad6265SDimitry Andric  def : Pat<(v4i32 (PPCAccExtractVsx acc:$v, 1)),
109281ad6265SDimitry Andric            Extracts.Vec1>;
109381ad6265SDimitry Andric  def : Pat<(v4i32 (PPCAccExtractVsx acc:$v, 2)),
109481ad6265SDimitry Andric            Extracts.Vec2>;
109581ad6265SDimitry Andric  def : Pat<(v4i32 (PPCAccExtractVsx acc:$v, 3)),
109681ad6265SDimitry Andric            Extracts.Vec3>;
109781ad6265SDimitry Andric}
109881ad6265SDimitry Andric
1099bdd1243dSDimitry Andriclet Predicates = [MMA, IsISAFuture] in {
1100bdd1243dSDimitry Andric  def : Pat<(v512i1 (PPCAccBuild v4i32:$vs1, v4i32:$vs0, v4i32:$vs3, v4i32:$vs2)),
1101bdd1243dSDimitry Andric            (DMXXINSTFDMR512 ConcatsMMA.VecsToVecPair0, ConcatsMMA.VecsToVecPair1)>;
1102bdd1243dSDimitry Andric  def : Pat<(v512i1 (int_ppc_mma_assemble_acc v16i8:$vs1, v16i8:$vs0,
1103bdd1243dSDimitry Andric                                              v16i8:$vs3, v16i8:$vs2)),
1104bdd1243dSDimitry Andric            (DMXXINSTFDMR512 ConcatsMMA.VecsToVecPair0, ConcatsMMA.VecsToVecPair1)>;
1105bdd1243dSDimitry Andric  def : Pat<(v512i1 immAllZerosV), (XXSETACCZW)>;
1106bdd1243dSDimitry Andric}
1107