diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.td b/llvm/lib/Target/AMDGPU/SIInstrInfo.td --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.td +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.td @@ -2042,11 +2042,6 @@ field bit HasSrc1 = !ne(Src1VT.Value, untyped.Value); field bit HasSrc2 = !ne(Src2VT.Value, untyped.Value); - // TODO: Modifiers logic is somewhat adhoc here, to be refined later - // HasModifiers affects the normal and DPP encodings. We take note of EnableF32SrcMods, which - // enables modifiers for i32 type. - field bit HasModifiers = !or(isModifierType.ret, EnableF32SrcMods); - // HasSrc*FloatMods affects the SDWA encoding. We ignore EnableF32SrcMods. field bit HasSrc0FloatMods = isFloatType.ret; field bit HasSrc1FloatMods = isFloatType.ret; @@ -2057,10 +2052,6 @@ field bit HasSrc1IntMods = isIntType.ret; field bit HasSrc2IntMods = isIntType.ret; - field bit HasSrc0Mods = HasModifiers; - field bit HasSrc1Mods = !if(HasModifiers, !or(HasSrc1FloatMods, HasSrc1IntMods), 0); - field bit HasSrc2Mods = !if(HasModifiers, !or(HasSrc2FloatMods, HasSrc2IntMods), 0); - field bit HasClamp = !or(isModifierType.ret, EnableClamp); field bit HasSDWAClamp = EmitDst; field bit HasFPClamp = !and(isFloatType.ret, HasClamp); @@ -2074,6 +2065,16 @@ field bit HasOMod = !if(HasOpSel, 0, isFloatType.ret); field bit HasSDWAOMod = isFloatType.ret; + field bit HasModifiers = !or(isModifierType.ret, + isModifierType.ret, + isModifierType.ret, + HasOMod, + EnableF32SrcMods); + + field bit HasSrc0Mods = HasModifiers; + field bit HasSrc1Mods = !if(HasModifiers, !or(HasSrc1FloatMods, HasSrc1IntMods), 0); + field bit HasSrc2Mods = !if(HasModifiers, !or(HasSrc2FloatMods, HasSrc2IntMods), 0); + field bit HasExt = getHasExt.ret; field bit HasExtDPP = getHasDPP.ret; field bit HasExtSDWA = HasExt; diff --git a/llvm/lib/Target/AMDGPU/VOP1Instructions.td b/llvm/lib/Target/AMDGPU/VOP1Instructions.td --- a/llvm/lib/Target/AMDGPU/VOP1Instructions.td +++ b/llvm/lib/Target/AMDGPU/VOP1Instructions.td @@ -138,7 +138,6 @@ let HasModifiers = 0; let HasClamp = 1; - let HasOMod = 1; } def VOP1_F64_I32 : VOPProfileI2F ; diff --git a/llvm/lib/Target/AMDGPU/VOP2Instructions.td b/llvm/lib/Target/AMDGPU/VOP2Instructions.td --- a/llvm/lib/Target/AMDGPU/VOP2Instructions.td +++ b/llvm/lib/Target/AMDGPU/VOP2Instructions.td @@ -339,7 +339,6 @@ class VOP_DOT_ACC : VOP_MAC { let HasClamp = 0; let HasExtSDWA = 0; - let HasModifiers = 1; let HasOpSel = 0; let IsPacked = 0; } @@ -348,7 +347,11 @@ let Src0ModDPP = FPVRegInputMods; let Src1ModDPP = FPVRegInputMods; } -def VOP_DOT_ACC_I32_I32 : VOP_DOT_ACC; + +def VOP_DOT_ACC_I32_I32 : VOP_DOT_ACC { + let HasSrc0Mods = 1; + let HasSrc1Mods = 1; +} // Write out to vcc or arbitrary SGPR. def VOP2b_I32_I1_I32_I32 : VOPProfile<[i32, i32, i32, untyped], 0, /*EnableClamp=*/1> { diff --git a/llvm/lib/Target/AMDGPU/VOP3Instructions.td b/llvm/lib/Target/AMDGPU/VOP3Instructions.td --- a/llvm/lib/Target/AMDGPU/VOP3Instructions.td +++ b/llvm/lib/Target/AMDGPU/VOP3Instructions.td @@ -183,7 +183,7 @@ let IsMAI = !if(Features.IsMAI, 1, P.IsMAI); let IsPacked = !if(Features.IsPacked, 1, P.IsPacked); - let HasModifiers = !if(Features.IsPacked, !not(Features.IsMAI), P.HasModifiers); + let HasModifiers = !if(Features.IsMAI, 0, !or(Features.IsPacked, P.HasModifiers)); // FIXME: Hack to stop printing _e64 let Outs64 = (outs DstRC.RegClass:$vdst); @@ -253,6 +253,7 @@ let Asm64 = "$vdst, $src0, $attr$attrchan$clamp$omod"; let HasClamp = 1; + let HasSrc0Mods = 0; } class getInterp16Asm { @@ -691,7 +692,6 @@ IntOpSelMods:$src2_modifiers, SCSrc_b32:$src2, VGPR_32:$vdst_in, op_sel0:$op_sel); let HasClamp = 0; - let HasOMod = 0; } class PermlanePat