[llvm] [NVVM][NVPTX] Support decompress_b feature for tcgen05.mma intrinsics (PR #216312)
Kirill Vedernikov via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 18 11:51:15 PDT 2026
================
@@ -6802,6 +6806,185 @@ foreach sparse = [0, 1] in {
} // space
} // sparse
+class Tcgen05MMADecompressBase<string ASpace, string Kind, int CtaGroup,
+ string CollectorUsageA, string CollectorUsageB> :
+ Tcgen05MMABase</*IsSparse=*/ 0, ASpace, Kind, CtaGroup,
+ CollectorUsageA, CollectorUsageB> {
+ let Predicates = [hasRubinFamilySupport];
+
+ let KindVal = !cond(!eq(Kind, "f8f6f4") : 0);
+
+ dag DecompressBaseInOperandList = !con(BaseInOperandList,
+ (ins B32:$decompress_b));
+
+ dag DecompressBasePatternArgs = !con(BasePatternArgs, (ins i32:$decompress_b));
+
+ string DecompressBaseOperandsStr = BaseOperandsCommonStr
+ # ", [$decompress_b]"
+ # IDescStr;
+
+ string DecompressPrefix = Prefix # SpCtaKindStr;
+ string DecompressLutStr = ".decompress::lut::b";
+ string DecompressCollectorStr = ".collector::a::" # CollectorUsageA
+ # ".collector::b::" # CollectorUsageB;
+}
+
+class Tcgen05MMADecompressInst<string ASpace, string Kind, int CtaGroup,
+ string CollectorUsageA,
+ string CollectorUsageB> :
+ Tcgen05MMADecompressBase<ASpace, Kind, CtaGroup, CollectorUsageA,
+ CollectorUsageB> {
+ Intrinsic Intrin = !cast<Intrinsic>(
+ NVVM_TCGEN05_MMA_DECOMPRESS<ASpace, Kind>.record_name
+ );
+
+ let InOperandList = DecompressBaseInOperandList;
+
+ let AsmString = DecompressPrefix
+ # DecompressLutStr
+ # DecompressCollectorStr
+ # DecompressBaseOperandsStr
+ # InputDStr
+ # ";";
+
+ dag IntrinsicPattern = !foreach(tmp, DecompressBasePatternArgs, !subst(ins, Intrin, tmp));
+
+ dag FlagOperands = (Intrin (i32 CtaGroup), (i32 CollectorUsageAVal),
+ (i32 CollectorUsageBVal));
+
+ let Pattern = [!con(IntrinsicPattern, FlagOperands)];
+}
+
+// tcgen05.mma decompress
+foreach space = ["tensor", "shared"] in {
+ foreach cta_group = [1, 2] in {
+ foreach collector_usage_a = ["discard", "lastuse", "fill", "use"] in {
+ foreach collector_usage_b = ["discard", "lastuse", "fill", "use"] in {
+ def : Tcgen05MMADecompressInst<space, "f8f6f4", cta_group,
+ collector_usage_a, collector_usage_b>;
+ } // collector_usage_b
+ } // collector_usage_a
+ } // cta_group
+} // space
+
+class Tcgen05MMADecompressDisableOutputLaneInst<string ASpace, string Kind,
+ int CtaGroup,
+ string CollectorUsageA,
+ string CollectorUsageB> :
+ Tcgen05MMADecompressBase<ASpace, Kind, CtaGroup, CollectorUsageA,
+ CollectorUsageB> {
+ SDNode Opcode = Tcgen05MMADisableOutputLaneSDNode<0, // IsSparse
+ ASpace, CtaGroup,
+ 0, // IsScaleInputD
+ 0, // IsAShift
+ 1>; // IsDecompressB
+
+ // disable output lane
+ int DisableOutputLaneVecSize = !mul(4, CtaGroup);
+
+ dag DisableOutputLaneIns = !dag(ins,
+ !listsplat(B32, DisableOutputLaneVecSize),
+ !foreach(x,
+ !range(DisableOutputLaneVecSize),
+ "disable_output_lane" # x));
----------------
kvederni wrote:
Good point! Done.
https://github.com/llvm/llvm-project/pull/216312
More information about the llvm-commits
mailing list