diff --git a/llvm/lib/Target/AMDGPU/BUFInstructions.td b/llvm/lib/Target/AMDGPU/BUFInstructions.td index d2769992b3c1a..d6017e1e893d9 100644 --- a/llvm/lib/Target/AMDGPU/BUFInstructions.td +++ b/llvm/lib/Target/AMDGPU/BUFInstructions.td @@ -780,9 +780,8 @@ class MUBUF_AtomicRet_Pseudo.ret> { - let FPAtomic = isFP in { + ValueType vdataType> { + let FPAtomic = vdataType.isFP in { def _OFFSET : MUBUF_AtomicNoRet_Pseudo , MUBUFAddr64Table <0, NAME>; def _ADDR64 : MUBUF_AtomicNoRet_Pseudo , @@ -804,9 +803,8 @@ multiclass MUBUF_Pseudo_Atomics_NO_RTN .ret> { - let FPAtomic = isFP in { + SDPatternOperator atomic> { + let FPAtomic = vdataType.isFP in { def _OFFSET_RTN : MUBUF_AtomicRet_Pseudo .ret, RegisterOperand data_op = getLdStRegisterOperand.ret> { def "" : FLAT_AtomicNoRet_Pseudo , AtomicNoRet { let PseudoInstr = NAME; - let FPAtomic = isFP; + let FPAtomic = data_vt.isFP; let AddedComplexity = -1; // Prefer global atomics if available } } @@ -555,7 +554,6 @@ multiclass FLAT_Atomic_Pseudo_RTN< ValueType vt, ValueType data_vt = vt, RegisterClass data_rc = vdst_rc, - bit isFP = isFloatType.ret, RegisterOperand data_op = getLdStRegisterOperand.ret> { def _RTN : FLAT_AtomicRet_Pseudo .ret:$vdst), @@ -563,7 +561,7 @@ multiclass FLAT_Atomic_Pseudo_RTN< " $vdst, $vaddr, $vdata$offset$cpol">, GlobalSaddrTable<0, opName#"_rtn">, AtomicNoRet { - let FPAtomic = isFP; + let FPAtomic = data_vt.isFP; let AddedComplexity = -1; // Prefer global atomics if available } } @@ -574,10 +572,9 @@ multiclass FLAT_Atomic_Pseudo< ValueType vt, ValueType data_vt = vt, RegisterClass data_rc = vdst_rc, - bit isFP = isFloatType.ret, RegisterOperand data_op = getLdStRegisterOperand.ret> { - defm "" : FLAT_Atomic_Pseudo_NO_RTN; - defm "" : FLAT_Atomic_Pseudo_RTN; + defm "" : FLAT_Atomic_Pseudo_NO_RTN; + defm "" : FLAT_Atomic_Pseudo_RTN; } multiclass FLAT_Global_Atomic_Pseudo_NO_RTN< @@ -586,7 +583,6 @@ multiclass FLAT_Global_Atomic_Pseudo_NO_RTN< ValueType vt, ValueType data_vt = vt, RegisterClass data_rc = vdst_rc, - bit isFP = isFloatType.ret, RegisterOperand data_op = getLdStRegisterOperand.ret> { def "" : FLAT_AtomicNoRet_Pseudo { let has_saddr = 1; let PseudoInstr = NAME; - let FPAtomic = isFP; + let FPAtomic = data_vt.isFP; } def _SADDR : FLAT_AtomicNoRet_Pseudo .ret, RegisterOperand data_op = getLdStRegisterOperand.ret, RegisterOperand vdst_op = getLdStRegisterOperand.ret> { @@ -630,7 +625,7 @@ multiclass FLAT_Global_Atomic_Pseudo_RTN< GlobalSaddrTable<0, opName#"_rtn">, AtomicNoRet { let has_saddr = 1; - let FPAtomic = isFP; + let FPAtomic = data_vt.isFP; } def _SADDR_RTN : FLAT_AtomicRet_Pseudo { - bit ret = !or(!eq(SrcVT.Value, f16.Value), - !eq(SrcVT.Value, bf16.Value), - !eq(SrcVT.Value, f32.Value), - !eq(SrcVT.Value, f64.Value), - !eq(SrcVT.Value, v2f16.Value), - !eq(SrcVT.Value, v2bf16.Value), - !eq(SrcVT.Value, v4f16.Value), - !eq(SrcVT.Value, v4bf16.Value), - !eq(SrcVT.Value, v8f16.Value), - !eq(SrcVT.Value, v8bf16.Value), - !eq(SrcVT.Value, v16f16.Value), - !eq(SrcVT.Value, v16bf16.Value), - !eq(SrcVT.Value, v2f32.Value), - !eq(SrcVT.Value, v4f32.Value), - !eq(SrcVT.Value, v8f32.Value), - !eq(SrcVT.Value, v2f64.Value), - !eq(SrcVT.Value, v4f64.Value)); -} - -// XXX - do v2i16 instructions? class isIntType { - bit ret = !or(!eq(SrcVT.Value, i8.Value), - !eq(SrcVT.Value, i16.Value), - !eq(SrcVT.Value, i32.Value), - !eq(SrcVT.Value, i64.Value), - !eq(SrcVT.Value, v4i16.Value), - !eq(SrcVT.Value, v8i16.Value), - !eq(SrcVT.Value, v16i16.Value), - !eq(SrcVT.Value, v2i32.Value), - !eq(SrcVT.Value, v4i32.Value), - !eq(SrcVT.Value, v8i32.Value)); + bit ret = !and(SrcVT.isInteger, !ne(SrcVT.Value, i1.Value)); } -class isPackedType { - bit ret = !or(!eq(SrcVT.Value, v2i16.Value), - !eq(SrcVT.Value, v2f16.Value), - !eq(SrcVT.Value, v2bf16.Value), - !eq(SrcVT.Value, v4f16.Value), - !eq(SrcVT.Value, v4bf16.Value), - !eq(SrcVT.Value, v2i32.Value), - !eq(SrcVT.Value, v2f32.Value), - !eq(SrcVT.Value, v4i32.Value), - !eq(SrcVT.Value, v4f32.Value), - !eq(SrcVT.Value, v8i32.Value), - !eq(SrcVT.Value, v8f32.Value)); -} - - //===----------------------------------------------------------------------===// // PatFrags for global memory operations //===----------------------------------------------------------------------===// @@ -1003,7 +957,7 @@ def ExpSrc3 : RegisterOperand { class SDWASrc : RegisterOperand { let OperandNamespace = "AMDGPU"; - string Type = !if(isFloatType.ret, "FP", "INT"); + string Type = !if(vt.isFP, "FP", "INT"); let OperandType = "OPERAND_REG_INLINE_C_"#Type#vt.Size; let DecoderMethod = "decodeSDWASrc"#vt.Size; let EncoderMethod = "getSDWASrcEncoding"; @@ -1499,10 +1453,8 @@ class getSDWADstForVT { // Returns the register class to use for source 0 of VOP[12C] // instructions for the given VT. class getVOPSrc0ForVT { - bit isFP = isFloatType.ret; - RegisterOperand ret = - !if(isFP, + !if(VT.isFP, !if(!eq(VT.Size, 64), VSrc_f64, !if(!or(!eq(VT.Value, f16.Value), !eq(VT.Value, bf16.Value)), @@ -1562,21 +1514,19 @@ class getVregSrcForVT_t16 { } class getSDWASrcForVT { - bit isFP = isFloatType.ret; RegisterOperand retFlt = !if(!eq(VT.Size, 16), SDWASrc_f16, SDWASrc_f32); RegisterOperand retInt = !if(!eq(VT.Size, 16), SDWASrc_i16, SDWASrc_i32); - RegisterOperand ret = !if(isFP, retFlt, retInt); + RegisterOperand ret = !if(VT.isFP, retFlt, retInt); } // Returns the register class to use for sources of VOP3 instructions for the // given VT. class getVOP3SrcForVT { - bit isFP = isFloatType.ret; RegisterOperand ret = !if(!eq(VT.Size, 128), VRegSrc_128, !if(!eq(VT.Size, 64), - !if(isFP, + !if(VT.isFP, !if(!eq(VT.Value, v2f32.Value), VSrc_v2f32, VSrc_f64), @@ -1585,7 +1535,7 @@ class getVOP3SrcForVT { VSrc_b64)), !if(!eq(VT.Value, i1.Value), SSrc_i1, - !if(isFP, + !if(VT.isFP, !if(!or(!eq(VT.Value, f16.Value), !eq(VT.Value, bf16.Value)), !if(IsTrue16, VSrcT_f16, VSrc_f16), !if(!or(!eq(VT.Value, v2f16.Value), !eq(VT.Value, v2bf16.Value)), @@ -1611,10 +1561,9 @@ class getVOP3SrcForVT { // Src2 of VOP3 DPP instructions cannot be a literal class getVOP3DPPSrcForVT { - bit isFP = isFloatType.ret; RegisterOperand ret = !if (!eq(VT.Value, i1.Value), SSrc_i1, - !if (isFP, + !if (VT.isFP, !if (!or(!eq(VT.Value, f16.Value), !eq(VT.Value, bf16.Value)), VCSrc_f16, !if (!or(!eq(VT.Value, v2f16.Value), !eq(VT.Value, v2bf16.Value)), VCSrc_v2f16, VCSrc_f32)), !if (!eq(VT.Value, i16.Value), VCSrc_b16, @@ -1650,14 +1599,12 @@ class isModifierType { // Return type of input modifiers operand for specified input operand class getSrcMod { - bit isFP = isFloatType.ret; - bit isPacked = isPackedType.ret; Operand ret = !if(!eq(VT.Size, 64), - !if(isFP, FP64InputMods, Int64InputMods), + !if(VT.isFP, FP64InputMods, Int64InputMods), !if(!eq(VT.Size, 16), - !if(isFP, !if(IsTrue16, FPT16InputMods, FP16InputMods), - !if(IsTrue16, IntT16InputMods, IntOpSelMods)), - !if(isFP, FP32InputMods, Int32InputMods))); + !if(VT.isFP, !if(IsTrue16, FPT16InputMods, FP16InputMods), + !if(IsTrue16, IntT16InputMods, IntOpSelMods)), + !if(VT.isFP, FP32InputMods, Int32InputMods))); } class getOpSelMod { @@ -1667,14 +1614,12 @@ class getOpSelMod { // Return type of input modifiers operand specified input operand for DPP class getSrcModDPP { - bit isFP = isFloatType.ret; - Operand ret = !if(isFP, FPVRegInputMods, IntVRegInputMods); + Operand ret = !if(VT.isFP, FPVRegInputMods, IntVRegInputMods); } class getSrcModDPP_t16 { - bit isFP = isFloatType.ret; Operand ret = - !if (isFP, + !if (VT.isFP, !if (!or(!eq(VT.Value, f16.Value), !eq(VT.Value, bf16.Value)), FPT16VRegInputMods, FPVRegInputMods), !if (!eq(VT.Value, i16.Value), IntT16VRegInputMods, @@ -1683,10 +1628,8 @@ class getSrcModDPP_t16 { // Return type of input modifiers operand for specified input operand for DPP class getSrcModVOP3DPP { - bit isFP = isFloatType.ret; - bit isPacked = isPackedType.ret; Operand ret = - !if (isFP, + !if (VT.isFP, !if (!or(!eq(VT.Value, f16.Value), !eq(VT.Value, bf16.Value)), FP16VCSrcInputMods, FP32VCSrcInputMods), Int32VCSrcInputMods); @@ -2330,9 +2273,9 @@ class VOPProfile _ArgVT, bit _EnableClamp = 0> { field bit HasSrc1 = !ne(Src1VT.Value, untyped.Value); field bit HasSrc2 = !ne(Src2VT.Value, untyped.Value); - field bit HasSrc0FloatMods = isFloatType.ret; - field bit HasSrc1FloatMods = isFloatType.ret; - field bit HasSrc2FloatMods = isFloatType.ret; + field bit HasSrc0FloatMods = Src0VT.isFP; + field bit HasSrc1FloatMods = Src1VT.isFP; + field bit HasSrc2FloatMods = Src2VT.isFP; field bit HasSrc0IntMods = isIntType.ret; field bit HasSrc1IntMods = isIntType.ret; @@ -2340,16 +2283,16 @@ class VOPProfile _ArgVT, bit _EnableClamp = 0> { field bit HasClamp = !or(isModifierType.ret, EnableClamp); field bit HasSDWAClamp = EmitDst; - field bit HasFPClamp = !and(isFloatType.ret, HasClamp); - field bit HasIntClamp = !if(isFloatType.ret, 0, HasClamp); + field bit HasFPClamp = !and(DstVT.isFP, HasClamp); + field bit HasIntClamp = !if(DstVT.isFP, 0, HasClamp); field bit HasClampLo = HasClamp; - field bit HasClampHi = !and(isPackedType.ret, HasClamp); + field bit HasClampHi = !and(DstVT.isVector, HasClamp); field bit HasHigh = 0; - field bit IsPacked = isPackedType.ret; + field bit IsPacked = Src0VT.isVector; field bit HasOpSel = IsPacked; - field bit HasOMod = !if(IsVOP3P, 0, isFloatType.ret); - field bit HasSDWAOMod = isFloatType.ret; + field bit HasOMod = !if(IsVOP3P, 0, DstVT.isFP); + field bit HasSDWAOMod = DstVT.isFP; field bit HasModifiers = !or(isModifierType.ret, isModifierType.ret, diff --git a/llvm/lib/Target/AMDGPU/VOP1Instructions.td b/llvm/lib/Target/AMDGPU/VOP1Instructions.td index 99960c94e5983..d604990dc88c2 100644 --- a/llvm/lib/Target/AMDGPU/VOP1Instructions.td +++ b/llvm/lib/Target/AMDGPU/VOP1Instructions.td @@ -48,7 +48,7 @@ class VOP1_Pseudo pattern=[], bit VOP1On let mayStore = 0; let hasSideEffects = 0; - let ReadsModeReg = !or(isFloatType.ret, isFloatType.ret); + let ReadsModeReg = !or(P.DstVT.isFP, P.Src0VT.isFP); let mayRaiseFPException = ReadsModeReg; diff --git a/llvm/lib/Target/AMDGPU/VOP2Instructions.td b/llvm/lib/Target/AMDGPU/VOP2Instructions.td index c97fef6d894ab..1ae974a26aa44 100644 --- a/llvm/lib/Target/AMDGPU/VOP2Instructions.td +++ b/llvm/lib/Target/AMDGPU/VOP2Instructions.td @@ -69,7 +69,7 @@ class VOP2_Pseudo pattern=[], string suf let mayStore = 0; let hasSideEffects = 0; - let ReadsModeReg = !or(isFloatType.ret, isFloatType.ret); + let ReadsModeReg = !or(P.DstVT.isFP, P.Src0VT.isFP); let mayRaiseFPException = ReadsModeReg; diff --git a/llvm/lib/Target/AMDGPU/VOPCInstructions.td b/llvm/lib/Target/AMDGPU/VOPCInstructions.td index e5b801048e6d3..c3aa13a9b3c7d 100644 --- a/llvm/lib/Target/AMDGPU/VOPCInstructions.td +++ b/llvm/lib/Target/AMDGPU/VOPCInstructions.td @@ -108,8 +108,8 @@ class VOPC_NoSdst_Profile sched, ValueType vt0, let InsSDWA = (ins Src0ModSDWA:$src0_modifiers, Src0SDWA:$src0, Src1ModSDWA:$src1_modifiers, Src1SDWA:$src1, src0_sel:$src0_sel, src1_sel:$src1_sel); - let AsmVOP3Base = !if(isFloatType.ret, "$src0_modifiers, $src1_modifiers$clamp", - "$src0, $src1"); + let AsmVOP3Base = !if(Src0VT.isFP, "$src0_modifiers, $src1_modifiers$clamp", + "$src0, $src1"); let AsmSDWA9 = "$src0_modifiers, $src1_modifiers $src0_sel $src1_sel"; let EmitDst = 0; } @@ -146,7 +146,7 @@ class VOPC_Pseudo pattern=[], let mayStore = 0; let hasSideEffects = 0; - let ReadsModeReg = isFloatType.ret; + let ReadsModeReg = P.Src0VT.isFP; let VALU = 1; let VOPC = 1; diff --git a/llvm/lib/Target/AMDGPU/VOPInstructions.td b/llvm/lib/Target/AMDGPU/VOPInstructions.td index c4b9e70630937..a923c4b71788d 100644 --- a/llvm/lib/Target/AMDGPU/VOPInstructions.td +++ b/llvm/lib/Target/AMDGPU/VOPInstructions.td @@ -152,7 +152,7 @@ class VOP3_Pseudo pattern = [], let ClampLo = P.HasClampLo; let ClampHi = P.HasClampHi; - let ReadsModeReg = !or(isFloatType.ret, isFloatType.ret); + let ReadsModeReg = !or(P.DstVT.isFP, P.Src0VT.isFP); let mayRaiseFPException = ReadsModeReg; let Uses = !if(ReadsModeReg, [MODE, EXEC], [EXEC]); @@ -599,7 +599,7 @@ class VOP_SDWA_Pseudo pattern=[]> : let VALU = 1; let SDWA = 1; - let ReadsModeReg = !or(isFloatType.ret, isFloatType.ret); + let ReadsModeReg = !or(P.DstVT.isFP, P.Src0VT.isFP); let mayRaiseFPException = ReadsModeReg; let Uses = !if(ReadsModeReg, [MODE, EXEC], [EXEC]); @@ -811,7 +811,7 @@ class VOP_DPP_Pseudo pattern=[], let DPP = 1; let Size = 8; - let ReadsModeReg = !or(isFloatType.ret, isFloatType.ret); + let ReadsModeReg = !or(P.DstVT.isFP, P.Src0VT.isFP); let mayRaiseFPException = ReadsModeReg; let Uses = !if(ReadsModeReg, [MODE, EXEC], [EXEC]);