@@ -1973,7 +1973,8 @@ class getIns64 <RegisterOperand Src0RC, RegisterOperand Src1RC,
19731973                RegisterOperand Src2RC, int NumSrcArgs,
19741974                bit HasClamp, bit HasModifiers, bit HasSrc2Mods, bit HasOMod,
19751975                Operand Src0Mod, Operand Src1Mod, Operand Src2Mod,
1976-                 bit HasFP8ByteSel = 0, bit HasFP8DstByteSel = 0> {
1976+                 bit HasFP8ByteSel = 0, bit HasFP8DstByteSel = 0,
1977+                 bit HasBitOp3 = 0> {
19771978  dag src0 = !if(!ge(NumSrcArgs, 1),
19781979                 !if (HasModifiers,
19791980                      (ins Src0Mod:$src0_modifiers, Src0RC:$src0),
@@ -1999,21 +2000,23 @@ class getIns64 <RegisterOperand Src0RC, RegisterOperand Src1RC,
19992000                    !con(!if(HasFP8DstByteSel, (ins VGPR_32:$vdst_in), (ins)),
20002001                         (ins ByteSel0:$byte_sel)),
20012002                    (ins));
2003+   dag bitop3 = !if(HasBitOp3, (ins bitop3_0:$bitop3), (ins));
20022004
2003-   dag ret = !con(src0, src1, src2, clamp, omod, bytesel);
2005+   dag ret = !con(src0, src1, src2, clamp, omod, bytesel, bitop3 );
20042006}
20052007
20062008class getInsVOP3Base<RegisterOperand Src0RC, RegisterOperand Src1RC,
20072009                RegisterOperand Src2RC, int NumSrcArgs,
20082010                bit HasClamp, bit HasModifiers, bit HasSrc2Mods, bit HasOMod,
20092011                Operand Src0Mod, Operand Src1Mod, Operand Src2Mod, bit HasOpSel,
2010-                 bit HasFP8ByteSel = 0, bit HasFP8DstByteSel = 0> {
2012+                 bit HasFP8ByteSel = 0, bit HasFP8DstByteSel = 0, bit HasBitOp3 = 0 > {
20112013  // getInst64 handles clamp and omod. implicit mutex between vop3p and omod
20122014  dag base = getIns64 <Src0RC, Src1RC, Src2RC, NumSrcArgs,
20132015                HasClamp, HasModifiers, HasSrc2Mods, HasOMod,
20142016                Src0Mod, Src1Mod, Src2Mod, HasFP8ByteSel, HasFP8DstByteSel>.ret;
20152017  dag opsel = (ins op_sel0:$op_sel);
2016-   dag ret = !con(base, !if(HasOpSel, opsel, (ins)));
2018+   dag bitop3 = (ins bitop3_0:$bitop3);
2019+   dag ret = !con(base, !if(HasBitOp3, bitop3, (ins)), !if(HasOpSel, opsel, (ins)));
20172020}
20182021
20192022class getInsVOP3P <RegisterOperand Src0RC, RegisterOperand Src1RC,
@@ -2035,12 +2038,12 @@ class getInsVOP3OpSel <RegisterOperand Src0RC, RegisterOperand Src1RC,
20352038                       RegisterOperand Src2RC, int NumSrcArgs,
20362039                       bit HasClamp, bit HasOMod,
20372040                       Operand Src0Mod, Operand Src1Mod, Operand Src2Mod,
2038-                        bit HasFP8ByteSel = 0, bit HasFP8DstByteSel = 0> {
2041+                        bit HasFP8ByteSel = 0, bit HasFP8DstByteSel = 0, bit HasBitOp3 = 0 > {
20392042  dag ret = getInsVOP3Base<Src0RC, Src1RC,
20402043                    Src2RC, NumSrcArgs,
20412044                    HasClamp, 1/*HasModifiers*/, 1/*HasSrc2Mods*/, HasOMod,
20422045                    Src0Mod, Src1Mod, Src2Mod, /*HasOpSel=*/1,
2043-                     HasFP8ByteSel, HasFP8DstByteSel>.ret;
2046+                     HasFP8ByteSel, HasFP8DstByteSel, HasBitOp3 >.ret;
20442047}
20452048
20462049class getInsDPPBase <RegisterOperand OldRC, RegisterOperand Src0RC, RegisterOperand Src1RC,
@@ -2247,7 +2250,8 @@ class getAsmVOP3OpSel <int NumSrcArgs,
22472250                       bit Src0HasMods,
22482251                       bit Src1HasMods,
22492252                       bit Src2HasMods,
2250-                        bit HasByteSel = 0> {
2253+                        bit HasByteSel = 0,
2254+                        bit HasBitOp3 = 0> {
22512255  string dst = "$vdst";
22522256
22532257  string isrc0 = !if(!eq(NumSrcArgs, 1), "$src0", "$src0,");
@@ -2269,7 +2273,8 @@ class getAsmVOP3OpSel <int NumSrcArgs,
22692273  string bytesel = !if(HasByteSel, "$byte_sel", "");
22702274  string clamp = !if(HasClamp, "$clamp", "");
22712275  string omod = !if(HasOMod, "$omod", "");
2272-   string ret = dst#", "#src0#src1#src2#"$op_sel"#bytesel#clamp#omod;
2276+   string bitop3 = !if(HasBitOp3, "$bitop3", "");
2277+   string ret = dst#", "#src0#src1#src2#bitop3#"$op_sel"#bytesel#clamp#omod;
22732278}
22742279
22752280class getAsmDPP <bit HasDst, int NumSrcArgs, bit HasModifiers, ValueType DstVT = i32> {
@@ -2301,7 +2306,7 @@ class getAsmVOP3Base <int NumSrcArgs, bit HasDst, bit HasClamp,
23012306                       bit HasOpSel, bit HasOMod, bit IsVOP3P,
23022307                       bit HasNeg, bit Src0HasMods,
23032308                       bit Src1HasMods, bit Src2HasMods, ValueType DstVT = i32,
2304-                        bit HasByteSel = 0> {
2309+                        bit HasByteSel = 0, bit HasBitOp3 = 0 > {
23052310  string dst = !if(HasDst,
23062311                   !if(!eq(DstVT.Size, 1),
23072312                       "$sdst",
@@ -2324,6 +2329,7 @@ class getAsmVOP3Base <int NumSrcArgs, bit HasDst, bit HasClamp,
23242329  string src2 = !if(Src2HasMods, src2mods, src2nomods);
23252330  string opsel = !if(HasOpSel, "$op_sel", "");
23262331  string bytesel = !if(HasByteSel, "$byte_sel", "");
2332+   string bitop3 = !if(HasBitOp3, "$bitop3", "");
23272333  string 3PMods = !if(IsVOP3P,
23282334                      !if(HasOpSel, "$op_sel_hi", "")
23292335                        #!if(HasNeg, "$neg_lo$neg_hi", ""),
@@ -2333,7 +2339,7 @@ class getAsmVOP3Base <int NumSrcArgs, bit HasDst, bit HasClamp,
23332339
23342340  string ret = dst#!if(!eq(NumSrcArgs,0),
23352341                       "",
2336-                        !if(HasDst,", ", "")#src0#src1#src2#opsel#bytesel#3PMods#clamp#omod);
2342+                        !if(HasDst,", ", "")#src0#src1#src2#bitop3# opsel#bytesel#3PMods#clamp#omod);
23372343}
23382344
23392345class getAsmVOP3DPP<string base> {
@@ -2558,6 +2564,7 @@ class VOPProfile <list<ValueType> _ArgVT, bit _EnableClamp = 0> {
25582564  field bit HasFP8DstByteSel = 0;
25592565  field bit HasFP4DstByteSel = 0;
25602566  field bit HasFP8ByteSel = !or(HasFP8SrcByteSel, HasFP8DstByteSel);
2567+   field bit HasBitOp3 = 0;
25612568
25622569  field bit HasDst = !ne(DstVT.Value, untyped.Value);
25632570  field bit HasDst32 = HasDst;
@@ -2628,14 +2635,14 @@ class VOPProfile <list<ValueType> _ArgVT, bit _EnableClamp = 0> {
26282635  field dag Ins64 = getIns64<Src0RC64, Src1RC64, Src2RC64, NumSrcArgs,
26292636                             HasClamp, HasModifiers, HasSrc2Mods,
26302637                             HasOMod, Src0Mod, Src1Mod, Src2Mod,
2631-                              HasFP8ByteSel, HasFP8DstByteSel>.ret;
2638+                              HasFP8ByteSel, HasFP8DstByteSel, HasBitOp3 >.ret;
26322639  field dag InsVOP3P = getInsVOP3P<Src0RC64, Src1RC64, Src2RC64,
26332640                                   NumSrcArgs, HasClamp, HasOpSel, HasNeg,
26342641                                   Src0PackedMod, Src1PackedMod, Src2PackedMod>.ret;
26352642  field dag InsVOP3OpSel = getInsVOP3OpSel<Src0RC64, Src1RC64, Src2RC64,
26362643                                NumSrcArgs, HasClamp, HasOMod,
26372644                                Src0Mod, Src1Mod, Src2Mod,
2638-                                 HasFP8ByteSel, HasFP8DstByteSel>.ret;
2645+                                 HasFP8ByteSel, HasFP8DstByteSel, HasBitOp3 >.ret;
26392646  field dag InsDPP = !if(HasExtDPP,
26402647                         getInsDPP<DstRCDPP, Src0DPP, Src1DPP, Src2DPP, NumSrcArgs,
26412648                                   HasModifiers, Src0ModDPP, Src1ModDPP, Src2ModDPP>.ret,
@@ -2648,7 +2655,7 @@ class VOPProfile <list<ValueType> _ArgVT, bit _EnableClamp = 0> {
26482655  defvar InsVOP3DPPBase = getInsVOP3Base<Src0VOP3DPP, Src1VOP3DPP,
26492656                  Src2VOP3DPP, NumSrcArgs, HasClamp, HasModifiers, HasSrc2Mods, HasOMod,
26502657                  Src0ModVOP3DPP, Src1ModVOP3DPP, Src2ModVOP3DPP, HasOpSel,
2651-                   HasFP8ByteSel, HasFP8DstByteSel>.ret;
2658+                   HasFP8ByteSel, HasFP8DstByteSel, HasBitOp3 >.ret;
26522659  defvar InsVOP3PDPPBase = getInsVOP3P<Src0VOP3DPP, Src1VOP3DPP,
26532660                  Src2VOP3DPP, NumSrcArgs, HasClamp, HasOpSel, HasNeg,
26542661                  Src0ModVOP3DPP, Src1ModVOP3DPP, Src2ModVOP3DPP>.ret;
@@ -2677,7 +2684,7 @@ class VOPProfile <list<ValueType> _ArgVT, bit _EnableClamp = 0> {
26772684  field string AsmDPP8 = getAsmDPP8<HasDst, NumSrcArgs, 0 /*HasModifiers*/, DstVT>.ret;
26782685  field string AsmVOP3Base = getAsmVOP3Base<NumSrcArgs, HasDst, HasClamp,
26792686   HasOpSel, HasOMod, IsVOP3P, HasNeg, HasSrc0Mods, HasSrc1Mods,
2680-    HasSrc2Mods, DstVT, HasFP8ByteSel>.ret;
2687+    HasSrc2Mods, DstVT, HasFP8ByteSel, HasBitOp3 >.ret;
26812688  field string Asm64 = AsmVOP3Base;
26822689  field string AsmVOP3P = getAsmVOP3P<HasDst, NumSrcArgs, HasNeg, HasClamp, HasOpSel>.ret;
26832690  field string AsmVOP3OpSel = getAsmVOP3OpSel<NumSrcArgs,
@@ -2686,7 +2693,8 @@ class VOPProfile <list<ValueType> _ArgVT, bit _EnableClamp = 0> {
26862693                                              HasSrc0FloatMods,
26872694                                              HasSrc1FloatMods,
26882695                                              HasSrc2FloatMods,
2689-                                               HasFP8ByteSel>.ret;
2696+                                               HasFP8ByteSel,
2697+                                               HasBitOp3>.ret;
26902698  field string AsmVOP3DPP = getAsmVOP3DPP<AsmVOP3Base>.ret;
26912699  field string AsmVOP3DPP16 = getAsmVOP3DPP16<AsmVOP3Base>.ret;
26922700  field string AsmVOP3DPP8 = getAsmVOP3DPP8<AsmVOP3Base>.ret;
0 commit comments