@@ -236,6 +236,76 @@ foreach index = !range(0, 32) in {
236236 def NVVM_EnvReg # index # Op : NVVM_SpecialRegisterOp<"read.ptx.sreg.envreg" # index>;
237237}
238238
239+ //===----------------------------------------------------------------------===//
240+ // Inline PTX op definition
241+ //===----------------------------------------------------------------------===//
242+
243+ def NVVM_InlinePtxOp : NVVM_Op<"inline_ptx",
244+ [DeclareOpInterfaceMethods<BasicPtxBuilderOpInterface>,
245+ AttrSizedOperandSegments]>
246+ {
247+ let summary = "Inline PTX Op";
248+ let description = [{This op allows using PTX directly within the NVVM
249+ dialect, while greatly simplifying llvm.inline_asm generation. It
250+ automatically handles register size selection and sets the correct
251+ read/write access for each operand. The operation leverages the
252+ `BasicPtxBuilderInterface` to abstract away low-level details of
253+ PTX assembly formatting.
254+
255+ The `predicate` attribute is used to specify a predicate for the
256+ PTX instruction.
257+
258+ Example 1: Read-only Parameters
259+ ```mlir
260+ nvvm.inline_ptx "mbarrier.init.b64 [$0], $1;" (%barrier_gen, %count) : !llvm.ptr, i32
261+
262+ // Lowers to:
263+ llvm.inline_asm has_side_effects asm_dialect = att
264+ "mbarrier.init.b64 [$0], $1;", "l,r" %arg0, %arg2 : (!llvm.ptr, i32) -> ()
265+ ```
266+
267+ Example 2: Read-only and Write-only Parameters
268+ ```mlir
269+ %0 = nvvm.inline_ptx "ex2.approx.ftz.f32 $0, $1;" (%input) : f32 -> f32
270+
271+ // Lowers to:
272+ %0 = llvm.inline_asm has_side_effects asm_dialect = att
273+ "ex2.approx.ftz.f32 $0, $1;", "=f,f" %arg0 : (f32) -> f32
274+ ```
275+
276+ Example 3: Predicate Usage
277+ ```mlir
278+ nvvm.inline_ptx "mbarrier.init.b64 [$0], $1;" (%barrier_gen, %count),
279+ predicate = %pred : !llvm.ptr, i32, i1
280+
281+ // Lowers to:
282+ llvm.inline_asm has_side_effects asm_dialect = att
283+ "@$2 mbarrier.init.b64 [$0], $1;", "l,r,b" %arg0, %arg2, %arg3
284+ : (!llvm.ptr, i32, i1) -> ()
285+ ```
286+ }];
287+
288+ let arguments = (ins Variadic<AnyType>:$readOnlyArgs,
289+ StrAttr:$ptxCode,
290+ PtxPredicate:$predicate);
291+
292+ let results = (outs Variadic<AnyType>:$writeOnlyArgs);
293+
294+ let assemblyFormat = [{
295+ $ptxCode `(` $readOnlyArgs `)`
296+ (`,` `predicate` `=` $predicate^)? attr-dict
297+ `:` type(operands)
298+ (`->` type($writeOnlyArgs)^)?
299+ }];
300+
301+ let extraClassDefinition = [{
302+ std::string $cppClass::getPtx() {
303+ StringRef ptxInstStr = getPtxCode();
304+ return std::string(ptxInstStr.data());
305+ }
306+ }];
307+ }
308+
239309//===----------------------------------------------------------------------===//
240310// NVVM approximate op definitions
241311//===----------------------------------------------------------------------===//
0 commit comments