@@ -236,6 +236,76 @@ foreach index = !range(0, 32) in {
236
236
def NVVM_EnvReg # index # Op : NVVM_SpecialRegisterOp<"read.ptx.sreg.envreg" # index>;
237
237
}
238
238
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
+
239
309
//===----------------------------------------------------------------------===//
240
310
// NVVM approximate op definitions
241
311
//===----------------------------------------------------------------------===//
0 commit comments