@@ -401,6 +401,19 @@ class VOP3Interp_vi <bits<10> op, VOPProfile P> : VOP3e_vi <op, P> {
401
401
let Inst{49-41} = src0;
402
402
}
403
403
404
+ class VOP3a_BITOP3_gfx12<bits<10> op, VOPProfile p> : VOP3e_gfx11_gfx12<op, p> {
405
+ bits<8> bitop3;
406
+
407
+ let Inst{60-59} = bitop3{7-6};
408
+ let Inst{10-8} = bitop3{5-3};
409
+ let Inst{63-61} = bitop3{2-0};
410
+
411
+ let Inst{11} = !if(p.HasOpSel, src0_modifiers{2}, 0);
412
+ let Inst{12} = !if(p.HasOpSel, src1_modifiers{2}, 0);
413
+ let Inst{13} = !if(p.HasOpSel, src2_modifiers{2}, 0);
414
+ let Inst{14} = !if(p.HasOpSel, src0_modifiers{3}, 0);
415
+ }
416
+
404
417
class VOP3Interp_gfx10<bits<10> op, VOPProfile p> : VOP3e_gfx10<op, p> {
405
418
bits<6> attr;
406
419
bits<2> attrchan;
@@ -1506,6 +1519,7 @@ class VOP3_Profile_Base<VOPProfile P, VOP3Features Features = VOP3_REGULAR> : VO
1506
1519
let HasFP8SrcByteSel = P.HasFP8SrcByteSel;
1507
1520
let HasFP8DstByteSel = P.HasFP8DstByteSel;
1508
1521
let HasOMod = P.HasOMod;
1522
+ let HasBitOp3 = P.HasBitOp3;
1509
1523
1510
1524
let HasModifiers =
1511
1525
!if (Features.IsMAI, 0,
@@ -1525,6 +1539,7 @@ class VOP3_Profile_True16<VOPProfile P, VOP3Features Features = VOP3_REGULAR> :
1525
1539
let HasFP8SrcByteSel = P.HasFP8SrcByteSel;
1526
1540
let HasFP8DstByteSel = P.HasFP8DstByteSel;
1527
1541
let HasOMod = P.HasOMod;
1542
+ let HasBitOp3 = P.HasBitOp3;
1528
1543
1529
1544
let HasModifiers =
1530
1545
!if (Features.IsMAI, 0,
@@ -1540,6 +1555,7 @@ class VOP3_Profile_Fake16<VOPProfile P, VOP3Features Features = VOP3_REGULAR> :
1540
1555
let HasFP8SrcByteSel = P.HasFP8SrcByteSel;
1541
1556
let HasFP8DstByteSel = P.HasFP8DstByteSel;
1542
1557
let HasOMod = P.HasOMod;
1558
+ let HasBitOp3 = P.HasBitOp3;
1543
1559
1544
1560
let HasModifiers =
1545
1561
!if (Features.IsMAI, 0,
@@ -1723,6 +1739,34 @@ class VOP3b_DPP8_Base<bits<10> op, VOP_Pseudo ps, string opName = ps.OpName>
1723
1739
let Inst{14 - 8} = sdst;
1724
1740
}
1725
1741
1742
+ class VOP3_BITOP3_DPP16_Gen<bits<10> op, VOP_DPP_Pseudo p, GFXGen Gen, string asmName>
1743
+ : VOP3_DPP16_Gen_t16<op, p, Gen, asmName> {
1744
+ bits<8> bitop3;
1745
+
1746
+ let Inst{60-59} = bitop3{7-6};
1747
+ let Inst{10-8} = bitop3{5-3};
1748
+ let Inst{63-61} = bitop3{2-0};
1749
+
1750
+ let Inst{11} = !if(p.Pfl.HasOpSel, src0_modifiers{2}, 0);
1751
+ let Inst{12} = !if(p.Pfl.HasOpSel, src1_modifiers{2}, 0);
1752
+ let Inst{13} = !if(p.Pfl.HasOpSel, src2_modifiers{2}, 0);
1753
+ let Inst{14} = !if(p.Pfl.HasOpSel, src0_modifiers{3}, 0);
1754
+ }
1755
+
1756
+ class VOP3_BITOP3_DPP8<bits<10> op, VOP_Pseudo p, string asmName>
1757
+ : Base_VOP3_DPP8_t16<op, p, asmName> {
1758
+ bits<8> bitop3;
1759
+
1760
+ let Inst{60-59} = bitop3{7-6};
1761
+ let Inst{10-8} = bitop3{5-3};
1762
+ let Inst{63-61} = bitop3{2-0};
1763
+
1764
+ let Inst{11} = !if(p.Pfl.HasOpSel, src0_modifiers{2}, 0);
1765
+ let Inst{12} = !if(p.Pfl.HasOpSel, src1_modifiers{2}, 0);
1766
+ let Inst{13} = !if(p.Pfl.HasOpSel, src2_modifiers{2}, 0);
1767
+ let Inst{14} = !if(p.Pfl.HasOpSel, src0_modifiers{3}, 0);
1768
+ }
1769
+
1726
1770
class VOP3b_DPP8_Base_t16<bits<10> op, VOP_Pseudo ps, string opName = ps.OpName>
1727
1771
: Base_VOP3_DPP8<op, ps, opName> {
1728
1772
bits<8> sdst;
@@ -1943,6 +1987,29 @@ multiclass VOP3be_Realtriple<
1943
1987
multiclass VOP3beOnly_Realtriple<GFXGen Gen, bits<10> op> :
1944
1988
VOP3be_Realtriple<Gen, op, 1>;
1945
1989
1990
+ multiclass VOP3_BITOP3_Real_dpp_Base<GFXGen Gen, bits<10> op, string asmName> {
1991
+ def _e64_dpp#Gen.Suffix :
1992
+ VOP3_BITOP3_DPP16_Gen<op, !cast<VOP_DPP_Pseudo>(NAME#"_e64"#"_dpp"), Gen, asmName>;
1993
+ }
1994
+
1995
+ multiclass VOP3_BITOP3_Real_dpp8_Base<GFXGen Gen, bits<10> op, string asmName> {
1996
+ defvar ps = !cast<VOP3_Pseudo>(NAME#"_e64");
1997
+ def _e64_dpp8#Gen.Suffix : VOP3_BITOP3_DPP8<op, ps, asmName> {
1998
+ let DecoderNamespace =
1999
+ Gen.DecoderNamespace #!if (ps.Pfl.IsRealTrue16, "", "_FAKE16");
2000
+ let AssemblerPredicate = Gen.AssemblerPredicate;
2001
+ }
2002
+ }
2003
+
2004
+ multiclass VOP3_BITOP3_Real_Base<GFXGen Gen, bits<10> op, string asmName> {
2005
+ defvar ps = !cast<VOP_Pseudo>(NAME#"_e64");
2006
+ let IsSingle = ps.Pfl.IsSingle, AsmString = asmName # ps.AsmOperands in {
2007
+ def _e64#Gen.Suffix :
2008
+ VOP3_Real_Gen<ps, Gen>,
2009
+ VOP3a_BITOP3_gfx12<op, ps.Pfl>;
2010
+ }
2011
+ }
2012
+
1946
2013
//===----------------------------------------------------------------------===//
1947
2014
// VOP3 GFX11
1948
2015
//===----------------------------------------------------------------------===//
@@ -2046,6 +2113,16 @@ multiclass VOP3Only_Realtriple_with_name_gfx11_gfx12<bits<10> op, string opName,
2046
2113
VOP3Only_Realtriple_with_name<GFX11Gen, op, opName, asmName>,
2047
2114
VOP3Only_Realtriple_with_name<GFX12Gen, op, opName, asmName>;
2048
2115
2116
+ multiclass VOP3_Real_BITOP3_gfx1250<bits<10> op, string asmName = !cast<VOP3_Pseudo>(NAME#"_e64").Mnemonic> :
2117
+ VOP3_BITOP3_Real_Base<GFX1250Gen, op, asmName>,
2118
+ VOP3_BITOP3_Real_dpp_Base<GFX1250Gen, op, asmName>,
2119
+ VOP3_BITOP3_Real_dpp8_Base<GFX1250Gen, op, asmName>;
2120
+
2121
+ multiclass VOP3_Real_BITOP3_t16_and_fake16_gfx1250<bits<10> op, string asmName = !cast<VOP3_Pseudo>(NAME#"_e64").Mnemonic> {
2122
+ defm _t16 : VOP3_Real_BITOP3_gfx1250<op, asmName>;
2123
+ defm _fake16: VOP3_Real_BITOP3_gfx1250<op, asmName>;
2124
+ }
2125
+
2049
2126
multiclass VOP3Dot_Realtriple_gfx11_gfx12<bits<10> op, string asmName, bit isSingle = 0,
2050
2127
string opName = NAME> :
2051
2128
VOP3Dot_Realtriple<GFX11Gen, op, asmName, isSingle, opName>,
0 commit comments