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