@@ -401,6 +401,44 @@ def NVVM_ReduxOp :
401401 }];
402402}
403403
404+ //===----------------------------------------------------------------------===//
405+ // NVVM Performance Monitor events
406+ //===----------------------------------------------------------------------===//
407+
408+ def NVVM_PMEventOp : NVVM_PTXBuilder_Op<"pmevent">,
409+ Arguments<(ins OptionalAttr<I16Attr>:$maskedEventId,
410+ OptionalAttr<I32Attr>:$eventId)> {
411+ let summary = "Trigger one or more Performance Monitor events.";
412+
413+ let description = [{
414+ Triggers one or more of a fixed number of performance monitor events, with
415+ event index or mask specified by immediate operand.
416+
417+ Without `mask` it triggers a single performance monitor event indexed by
418+ immediate operand a, in the range 0..15.
419+
420+ With `mask` it triggers one or more of the performance monitor events. Each
421+ bit in the 16-bit immediate operand controls an event.
422+
423+ [For more information, see PTX ISA](https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#miscellaneous-instructions-pmevent)
424+ }];
425+
426+ string llvmBuilder = [{
427+ llvm::Value *mId = builder.getInt16(* $maskedEventId);
428+ createIntrinsicCall(builder, llvm::Intrinsic::nvvm_pm_event_mask, {mId});
429+ }];
430+
431+ let assemblyFormat = "attr-dict (`id` `=` $eventId^)? (`mask` `=` $maskedEventId^)?";
432+
433+ let extraClassDeclaration = [{
434+ bool hasIntrinsic() { return !getEventId(); }
435+ }];
436+ let extraClassDefinition = [{
437+ std::string $cppClass::getPtx() { return std::string("pmevent %0;"); }
438+ }];
439+ let hasVerifier = 1;
440+ }
441+
404442//===----------------------------------------------------------------------===//
405443// NVVM Split arrive/wait barrier
406444//===----------------------------------------------------------------------===//
0 commit comments