@@ -1293,6 +1293,7 @@ def WaitVMVSrc : NamedIntOperand<"wait_vm_vsrc"> {
12931293def ByteSel : NamedIntOperand<"byte_sel"> {
12941294 let Validator = "isUInt<2>";
12951295}
1296+ def ByteSel0 : DefaultOperand<ByteSel, 0>;
12961297
12971298let PrintMethod = "printBitOp3" in
12981299def BitOp3 : NamedIntOperand<"bitop3">;
@@ -1971,7 +1972,8 @@ class getIns32 <RegisterOperand Src0RC, RegisterOperand Src1RC, int NumSrcArgs>
19711972class getIns64 <RegisterOperand Src0RC, RegisterOperand Src1RC,
19721973 RegisterOperand Src2RC, int NumSrcArgs,
19731974 bit HasClamp, bit HasModifiers, bit HasSrc2Mods, bit HasOMod,
1974- Operand Src0Mod, Operand Src1Mod, Operand Src2Mod> {
1975+ Operand Src0Mod, Operand Src1Mod, Operand Src2Mod,
1976+ bit HasFP8ByteSel = 0, bit HasFP8DstByteSel = 0> {
19751977 dag src0 = !if(!ge(NumSrcArgs, 1),
19761978 !if (HasModifiers,
19771979 (ins Src0Mod:$src0_modifiers, Src0RC:$src0),
@@ -1987,20 +1989,29 @@ class getIns64 <RegisterOperand Src0RC, RegisterOperand Src1RC,
19871989 (ins Src2Mod:$src2_modifiers, Src2RC:$src2),
19881990 (ins Src2RC:$src2)),
19891991 (ins));
1990- dag clamp = !if(HasClamp, (ins Clamp0:$clamp), (ins));
1992+ // If there is vdst_in after clamp with HasFP8DstByteSel we cannot use
1993+ // Clamp0 with default value, all default operands must be at the end.
1994+ dag clamp = !if(HasClamp, !if(HasFP8DstByteSel, (ins Clamp:$clamp),
1995+ (ins Clamp0:$clamp)),
1996+ (ins));
19911997 dag omod = !if(HasOMod, (ins omod0:$omod), (ins));
1998+ dag bytesel = !if(HasFP8ByteSel,
1999+ !con(!if(HasFP8DstByteSel, (ins VGPR_32:$vdst_in), (ins)),
2000+ (ins ByteSel0:$byte_sel)),
2001+ (ins));
19922002
1993- dag ret = !con(src0, src1, src2, clamp, omod);
2003+ dag ret = !con(src0, src1, src2, clamp, omod, bytesel );
19942004}
19952005
19962006class getInsVOP3Base<RegisterOperand Src0RC, RegisterOperand Src1RC,
19972007 RegisterOperand Src2RC, int NumSrcArgs,
19982008 bit HasClamp, bit HasModifiers, bit HasSrc2Mods, bit HasOMod,
1999- Operand Src0Mod, Operand Src1Mod, Operand Src2Mod, bit HasOpSel> {
2009+ Operand Src0Mod, Operand Src1Mod, Operand Src2Mod, bit HasOpSel,
2010+ bit HasFP8ByteSel = 0, bit HasFP8DstByteSel = 0> {
20002011 // getInst64 handles clamp and omod. implicit mutex between vop3p and omod
20012012 dag base = getIns64 <Src0RC, Src1RC, Src2RC, NumSrcArgs,
20022013 HasClamp, HasModifiers, HasSrc2Mods, HasOMod,
2003- Src0Mod, Src1Mod, Src2Mod>.ret;
2014+ Src0Mod, Src1Mod, Src2Mod, HasFP8ByteSel, HasFP8DstByteSel >.ret;
20042015 dag opsel = (ins op_sel0:$op_sel);
20052016 dag ret = !con(base, !if(HasOpSel, opsel, (ins)));
20062017}
@@ -2612,7 +2623,8 @@ class VOPProfile <list<ValueType> _ArgVT, bit _EnableClamp = 0> {
26122623 field dag Ins32 = getIns32<Src0RC32, Src1RC32, NumSrcArgs>.ret;
26132624 field dag Ins64 = getIns64<Src0RC64, Src1RC64, Src2RC64, NumSrcArgs,
26142625 HasClamp, HasModifiers, HasSrc2Mods,
2615- HasOMod, Src0Mod, Src1Mod, Src2Mod>.ret;
2626+ HasOMod, Src0Mod, Src1Mod, Src2Mod,
2627+ HasFP8ByteSel, HasFP8DstByteSel>.ret;
26162628 field dag InsVOP3P = getInsVOP3P<Src0RC64, Src1RC64, Src2RC64,
26172629 NumSrcArgs, HasClamp, HasOpSel, HasNeg,
26182630 Src0PackedMod, Src1PackedMod, Src2PackedMod>.ret;
@@ -2630,7 +2642,8 @@ class VOPProfile <list<ValueType> _ArgVT, bit _EnableClamp = 0> {
26302642 Src0ModDPP, Src1ModDPP, Src2ModDPP>.ret;
26312643 defvar InsVOP3DPPBase = getInsVOP3Base<Src0VOP3DPP, Src1VOP3DPP,
26322644 Src2VOP3DPP, NumSrcArgs, HasClamp, HasModifiers, HasSrc2Mods, HasOMod,
2633- Src0ModVOP3DPP, Src1ModVOP3DPP, Src2ModVOP3DPP, HasOpSel>.ret;
2645+ Src0ModVOP3DPP, Src1ModVOP3DPP, Src2ModVOP3DPP, HasOpSel,
2646+ HasFP8ByteSel, HasFP8DstByteSel>.ret;
26342647 defvar InsVOP3PDPPBase = getInsVOP3P<Src0VOP3DPP, Src1VOP3DPP,
26352648 Src2VOP3DPP, NumSrcArgs, HasClamp, HasOpSel, HasNeg,
26362649 Src0ModVOP3DPP, Src1ModVOP3DPP, Src2ModVOP3DPP>.ret;
0 commit comments