diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.td b/llvm/lib/Target/AMDGPU/SIInstrInfo.td index a78440dc7a1f4..2c20475726a48 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.td +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.td @@ -1973,7 +1973,8 @@ class getIns64 { + bit HasFP8ByteSel = 0, bit HasFP8DstByteSel = 0, + bit HasBitOp3 = 0> { dag src0 = !if(!ge(NumSrcArgs, 1), !if (HasModifiers, (ins Src0Mod:$src0_modifiers, Src0RC:$src0), @@ -1999,21 +2000,23 @@ class getIns64 { + bit HasFP8ByteSel = 0, bit HasFP8DstByteSel = 0, bit HasBitOp3 = 0> { // getInst64 handles clamp and omod. implicit mutex between vop3p and omod dag base = getIns64 .ret; dag opsel = (ins op_sel0:$op_sel); - dag ret = !con(base, !if(HasOpSel, opsel, (ins))); + dag bitop3 = (ins bitop3_0:$bitop3); + dag ret = !con(base, !if(HasBitOp3, bitop3, (ins)), !if(HasOpSel, opsel, (ins))); } class getInsVOP3P { + bit HasFP8ByteSel = 0, bit HasFP8DstByteSel = 0, bit HasBitOp3 = 0> { dag ret = getInsVOP3Base.ret; + HasFP8ByteSel, HasFP8DstByteSel, HasBitOp3>.ret; } class getInsDPPBase { + bit HasByteSel = 0, + bit HasBitOp3 = 0> { string dst = "$vdst"; string isrc0 = !if(!eq(NumSrcArgs, 1), "$src0", "$src0,"); @@ -2269,7 +2273,8 @@ class getAsmVOP3OpSel { @@ -2301,7 +2306,7 @@ class getAsmVOP3Base { + bit HasByteSel = 0, bit HasBitOp3 = 0> { string dst = !if(HasDst, !if(!eq(DstVT.Size, 1), "$sdst", @@ -2324,6 +2329,7 @@ class getAsmVOP3Base { @@ -2558,6 +2564,7 @@ class VOPProfile _ArgVT, bit _EnableClamp = 0> { field bit HasFP8DstByteSel = 0; field bit HasFP4DstByteSel = 0; field bit HasFP8ByteSel = !or(HasFP8SrcByteSel, HasFP8DstByteSel); + field bit HasBitOp3 = 0; field bit HasDst = !ne(DstVT.Value, untyped.Value); field bit HasDst32 = HasDst; @@ -2628,14 +2635,14 @@ class VOPProfile _ArgVT, bit _EnableClamp = 0> { field dag Ins64 = getIns64.ret; + HasFP8ByteSel, HasFP8DstByteSel, HasBitOp3>.ret; field dag InsVOP3P = getInsVOP3P.ret; field dag InsVOP3OpSel = getInsVOP3OpSel.ret; + HasFP8ByteSel, HasFP8DstByteSel, HasBitOp3>.ret; field dag InsDPP = !if(HasExtDPP, getInsDPP.ret, @@ -2648,7 +2655,7 @@ class VOPProfile _ArgVT, bit _EnableClamp = 0> { defvar InsVOP3DPPBase = getInsVOP3Base.ret; + HasFP8ByteSel, HasFP8DstByteSel, HasBitOp3>.ret; defvar InsVOP3PDPPBase = getInsVOP3P.ret; @@ -2677,7 +2684,7 @@ class VOPProfile _ArgVT, bit _EnableClamp = 0> { field string AsmDPP8 = getAsmDPP8.ret; field string AsmVOP3Base = getAsmVOP3Base.ret; + HasSrc2Mods, DstVT, HasFP8ByteSel, HasBitOp3>.ret; field string Asm64 = AsmVOP3Base; field string AsmVOP3P = getAsmVOP3P.ret; field string AsmVOP3OpSel = getAsmVOP3OpSel _ArgVT, bit _EnableClamp = 0> { HasSrc0FloatMods, HasSrc1FloatMods, HasSrc2FloatMods, - HasFP8ByteSel>.ret; + HasFP8ByteSel, + HasBitOp3>.ret; field string AsmVOP3DPP = getAsmVOP3DPP.ret; field string AsmVOP3DPP16 = getAsmVOP3DPP16.ret; field string AsmVOP3DPP8 = getAsmVOP3DPP8.ret; diff --git a/llvm/lib/Target/AMDGPU/VOP3Instructions.td b/llvm/lib/Target/AMDGPU/VOP3Instructions.td index 046cce73ff761..ef88a379f3680 100644 --- a/llvm/lib/Target/AMDGPU/VOP3Instructions.td +++ b/llvm/lib/Target/AMDGPU/VOP3Instructions.td @@ -1003,18 +1003,7 @@ class VOP3_BITOP3_Profile : VOP3_Profile let HasClamp = 0; let HasOMod = 0; let HasModifiers = 0; - - let Ins64 = !con(getIns64.ret, - (ins bitop3_0:$bitop3)); - - let InsVOP3OpSel = !con(getInsVOP3Base.ret, - (ins bitop3_0:$bitop3, op_sel0:$op_sel)); - - let Asm64 = "$vdst, $src0, $src1, $src2$bitop3"; - let AsmVOP3OpSel = !subst("$op_sel", "$bitop3$op_sel", getAsmVOP3OpSel<3, 0, 0, 0, 0, 0>.ret); + let HasBitOp3 = 1; } class VOP3_CVT_SCALE_F1632_FP8BF8_Profile : VOP3_Profile,