@@ -100,6 +100,13 @@ class ROCDL_IntrOp<string mnemonic, list<int> overloadedResults,
100
100
overloadedOperands, traits, numResults, requiresAccessGroup,
101
101
requiresAliasAnalysis, 0, 0, immArgPositions, immArgAttrNames>;
102
102
103
+ // Subclass to save typing and ease readibility when there aren't overloaded
104
+ // operands or memory accesses.
105
+ class ROCDL_ConcreteNonMemIntrOp<string mnemonic, list<Trait> traits,
106
+ int numResults, list<int> immArgPositions = [],
107
+ list<string> immArgNames = []>
108
+ : ROCDL_IntrOp<mnemonic, [], [], traits, numResults, 0, 0,
109
+ immArgPositions, immArgNames>;
103
110
//===----------------------------------------------------------------------===//
104
111
// ROCDL special register op definitions
105
112
//===----------------------------------------------------------------------===//
@@ -150,37 +157,26 @@ class ROCDL_MbcntOp<string mnemonic> :
150
157
def ROCDL_MbcntLoOp : ROCDL_MbcntOp<"lo">;
151
158
def ROCDL_MbcntHiOp : ROCDL_MbcntOp<"hi">;
152
159
153
- def ROCDL_DsSwizzleOp :
154
- ROCDL_Op<"ds_swizzle">,
155
- Results<(outs I32:$res)>,
156
- Arguments<(ins I32:$src,
157
- I32:$offset)>
158
- {
159
- string llvmBuilder = [{
160
- $res = createIntrinsicCall(builder, llvm::Intrinsic::amdgcn_ds_swizzle, {$src, $offset});
161
- }];
160
+ def ROCDL_DsSwizzleOp : ROCDL_ConcreteNonMemIntrOp<"ds_swizzle", [], 1>,
161
+ Arguments<(ins I32:$src,
162
+ I32:$offset)> {
163
+ let results = (outs I32:$res);
162
164
let assemblyFormat = [{
163
165
$src `,` $offset attr-dict `:` `(` type($src) `,` type($offset) `)` `->` type($res)
164
166
}];
165
167
}
166
168
167
- def ROCDL_DsBpermuteOp :
168
- ROCDL_Op<"ds_bpermute">,
169
- Results<(outs I32:$res)>,
170
- Arguments<(ins I32:$index,
171
- I32:$src)>
172
- {
173
- string llvmBuilder = [{
174
- $res = createIntrinsicCall(builder, llvm::Intrinsic::amdgcn_ds_bpermute, {$index, $src});
175
- }];
169
+ def ROCDL_DsBpermuteOp : ROCDL_ConcreteNonMemIntrOp<"ds_bpermute", [], 1>,
170
+ Arguments<(ins I32:$index,
171
+ I32:$src)> {
172
+ let results = (outs I32:$res);
176
173
let assemblyFormat = [{
177
174
$index `,` $src attr-dict `:` `(` type($index) `,` type($src) `)` `->` type($res)
178
175
}];
179
176
}
180
177
181
178
def ROCDL_BallotOp :
182
- ROCDL_Op<"ballot">,
183
- Results<(outs LLVM_Type:$res)>,
179
+ ROCDL_IntrOp<"ballot", [0], [], [], 1>,
184
180
Arguments<(ins I1:$pred)> {
185
181
let summary = "Vote across thread group";
186
182
@@ -189,11 +185,6 @@ def ROCDL_BallotOp :
189
185
The nth bit of the result contains the 1 bit contributed by the nth warp lane.
190
186
}];
191
187
192
- string llvmBuilder = [{
193
- $res = createIntrinsicCall(builder,
194
- llvm::Intrinsic::amdgcn_ballot, {$pred}, {$_resultType});
195
- }];
196
-
197
188
let assemblyFormat = "$pred attr-dict `:` type($res)";
198
189
}
199
190
@@ -249,18 +240,12 @@ def ROCDL_GridDimZOp : ROCDL_DimGetterFunctionOp<"grid.dim.z",
249
240
250
241
// Emits the waintcnt instruction. The bitfield's semantics depend
251
242
// on the target chipset
252
- def ROCDL_WaitcntOp : ROCDL_Op<"waitcnt">, Arguments<(ins I32Attr:$bitfield)> {
253
- string llvmBuilder = [{
254
- createIntrinsicCall(builder, llvm::Intrinsic::amdgcn_s_waitcnt,
255
- {builder.getInt32($bitfield)});
256
- }];
243
+ def ROCDL_SWaitcntOp : ROCDL_ConcreteNonMemIntrOp<"s.waitcnt", [], 0, [0], ["bitfield"]>,
244
+ Arguments<(ins I32Attr:$bitfield)> {
257
245
let assemblyFormat = "attr-dict $bitfield";
258
246
}
259
247
260
- def ROCDL_SBarrierOp : ROCDL_Op<"s.barrier"> {
261
- string llvmBuilder = [{
262
- createIntrinsicCall(builder, llvm::Intrinsic::amdgcn_s_barrier);
263
- }];
248
+ def ROCDL_SBarrierOp : ROCDL_ConcreteNonMemIntrOp<"s.barrier", [], 0> {
264
249
let assemblyFormat = "attr-dict";
265
250
}
266
251
@@ -276,68 +261,51 @@ def ROCDL_BarrierOp : ROCDL_Op<"barrier"> {
276
261
let assemblyFormat = "attr-dict";
277
262
}
278
263
279
- def ROCDL_BarrierSignalOp : ROCDL_IntrOp <"s.barrier.signal", [], [], [], 0, 0 , 0, [0], ["id"]>,
264
+ def ROCDL_BarrierSignalOp : ROCDL_ConcreteNonMemIntrOp <"s.barrier.signal", [], 0, [0], ["id"]>,
280
265
Arguments<(ins I32Attr:$id)> {
281
266
let results = (outs);
282
267
let assemblyFormat = "$id attr-dict";
283
268
}
284
269
285
- def ROCDL_BarrierWaitOp : ROCDL_IntrOp <"s.barrier.wait", [], [], [], 0, 0 , 0, [0], ["id"]>,
270
+ def ROCDL_BarrierWaitOp : ROCDL_ConcreteNonMemIntrOp <"s.barrier.wait", [], 0, [0], ["id"]>,
286
271
Arguments<(ins I16Attr:$id)> {
287
272
let results = (outs);
288
273
let assemblyFormat = "$id attr-dict";
289
- string llvmBuilder =
290
- "createIntrinsicCall(builder, llvm::Intrinsic::amdgcn_s_barrier_wait,builder.getInt16(op.getId()));";
291
274
}
292
275
293
- def ROCDL_WaitDscntOp: ROCDL_IntrOp <"s.wait.dscnt", [], [], [], 0, 0 , 0, [0], ["id"]>,
276
+ def ROCDL_WaitDscntOp: ROCDL_ConcreteNonMemIntrOp <"s.wait.dscnt", [], 0, [0], ["id"]>,
294
277
Arguments<(ins I16Attr:$id)> {
295
278
let results = (outs);
296
279
let assemblyFormat = "$id attr-dict";
297
280
}
298
281
299
- def ROCDL_SetPrioOp : ROCDL_IntrOp <"s.setprio", [], [] , [], 0 >,
282
+ def ROCDL_SetPrioOp : ROCDL_ConcreteNonMemIntrOp <"s.setprio", [], 0 , [0 ], ["priority"] >,
300
283
Arguments<(ins I16Attr:$priority)> {
301
- let results = (outs);
302
284
let assemblyFormat = "$priority attr-dict";
303
- string llvmBuilder =
304
- "createIntrinsicCall(builder, llvm::Intrinsic::amdgcn_s_setprio,builder.getInt16(op.getPriority()));";
305
285
}
306
286
307
- def ROCDL_SchedBarrier : ROCDL_IntrOp <"sched.barrier", [], [] , [], 0 >,
287
+ def ROCDL_SchedBarrier : ROCDL_ConcreteNonMemIntrOp <"sched.barrier", [], 0 , [0],["mask"] >,
308
288
Arguments<(ins I32Attr:$mask)> {
309
- let results = (outs);
310
289
let assemblyFormat = "$mask attr-dict";
311
- string llvmBuilder =
312
- "createIntrinsicCall(builder, llvm::Intrinsic::amdgcn_sched_barrier,builder.getInt32(op.getMask()));";
313
290
}
314
291
315
- def ROCDL_SchedGroupBarrier : ROCDL_IntrOp<"sched.group.barrier", [], [], [], 0>,
316
- Arguments<(ins I32Attr:$mask, I32Attr:$size, I32Attr:$groupId)> {
317
- let results = (outs);
292
+ def ROCDL_SchedGroupBarrier
293
+ : ROCDL_ConcreteNonMemIntrOp<"sched.group.barrier", [], 0,
294
+ [0, 1, 2], ["mask", "size", "groupId"]>,
295
+ Arguments<(ins I32Attr:$mask, I32Attr:$size, I32Attr:$groupId)> {
318
296
let assemblyFormat = "$mask `,` $size `,` $groupId attr-dict";
319
- string llvmBuilder = [{
320
- createIntrinsicCall(builder,
321
- llvm::Intrinsic::amdgcn_sched_group_barrier,
322
- {builder.getInt32(op.getMask()), builder.getInt32(op.getSize()), builder.getInt32(op.getGroupId())});
323
- }];
324
297
}
325
298
326
- def ROCDL_IglpOpt : ROCDL_IntrOp <"iglp.opt", [], [] , [], 0 >,
299
+ def ROCDL_IglpOpt : ROCDL_ConcreteNonMemIntrOp <"iglp.opt", [], 0 , [0 ], ["variant"] >,
327
300
Arguments<(ins I32Attr:$variant)> {
328
- let results = (outs);
329
301
let assemblyFormat = "$variant attr-dict";
330
- string llvmBuilder =
331
- "createIntrinsicCall(builder, llvm::Intrinsic::amdgcn_iglp_opt,builder.getInt32(op.getVariant()));";
332
302
}
333
303
334
304
//===---------------------------------------------------------------------===//
335
305
// Xdlops intrinsics
336
306
337
307
class ROCDL_Mfma_IntrOp<string mnemonic, list<Trait> traits = []> :
338
- LLVM_IntrOpBase<ROCDL_Dialect, mnemonic,
339
- "amdgcn_" # !subst(".","_", mnemonic),
340
- [], [], traits, 1>,
308
+ ROCDL_IntrOp<mnemonic, [], [], traits, 1>,
341
309
Arguments<(ins Variadic<LLVM_Type>:$args)> {
342
310
let assemblyFormat =
343
311
"$args attr-dict `:` functional-type($args, $res)";
@@ -347,9 +315,7 @@ class ROCDL_Mfma_IntrOp<string mnemonic, list<Trait> traits = []> :
347
315
// MFMA intrinsics with overloaded operands
348
316
class ROCDL_Mfma_OO_IntrOp<string mnemonic, list<int> overloadedOperands,
349
317
list<Trait> traits = []> :
350
- LLVM_IntrOpBase<ROCDL_Dialect, mnemonic,
351
- "amdgcn_" # !subst(".","_", mnemonic),
352
- [], overloadedOperands, traits, 1>,
318
+ ROCDL_IntrOp<mnemonic, [], overloadedOperands, traits, 1>,
353
319
Arguments<(ins Variadic<LLVM_Type>:$args)> {
354
320
let assemblyFormat =
355
321
"$args attr-dict `:` functional-type($args, $res)";
@@ -430,9 +396,7 @@ def ROCDL_smfmac_f32_32x32x32_fp8_fp8 : ROCDL_Mfma_IntrOp<"smfmac.f32.32x32x32.f
430
396
// WMMA intrinsics
431
397
class ROCDL_Wmma_IntrOp<string mnemonic, list<int> overloadedOperands,
432
398
list<Trait> traits = []> :
433
- LLVM_IntrOpBase<ROCDL_Dialect, mnemonic,
434
- "amdgcn_" # !subst(".","_", mnemonic),
435
- [0], overloadedOperands, traits, 1>,
399
+ ROCDL_IntrOp<mnemonic, [0], overloadedOperands, traits, 1>,
436
400
Arguments<(ins Variadic<LLVM_Type>:$args)> {
437
401
let assemblyFormat =
438
402
"$args attr-dict `:` functional-type($args, $res)";
@@ -572,50 +536,32 @@ def ROCDL_RawPtrBufferAtomicFaddOp : ROCDL_RawPtrBufferAtomicNoRet<"fadd">;
572
536
// Raw buffer load/store intrinsics
573
537
574
538
def ROCDL_RawBufferLoadOp :
575
- ROCDL_Op<"raw.buffer.load">,
576
- Results<(outs LLVM_Type:$res)>,
539
+ ROCDL_IntrOp<"raw.buffer.load", [0], [], [], 1>,
577
540
Arguments<(ins LLVM_Type:$rsrc,
578
541
LLVM_Type:$offset,
579
542
LLVM_Type:$soffset,
580
543
LLVM_Type:$aux)> {
581
- string llvmBuilder = [{
582
- $res = createIntrinsicCall(builder,
583
- llvm::Intrinsic::amdgcn_raw_buffer_load, {$rsrc, $offset,
584
- $soffset, $aux}, {$_resultType});
585
- }];
586
544
let hasCustomAssemblyFormat = 1;
587
545
}
588
546
589
547
def ROCDL_RawBufferStoreOp :
590
- ROCDL_Op <"raw.buffer.store">,
548
+ ROCDL_IntrOp <"raw.buffer.store", [], [0], [], 0 >,
591
549
Arguments<(ins LLVM_Type:$vdata,
592
550
LLVM_Type:$rsrc,
593
551
LLVM_Type:$offset,
594
552
LLVM_Type:$soffset,
595
553
LLVM_Type:$aux)>{
596
- string llvmBuilder = [{
597
- auto vdataType = moduleTranslation.convertType(op.getVdata().getType());
598
- createIntrinsicCall(builder,
599
- llvm::Intrinsic::amdgcn_raw_buffer_store, {$vdata, $rsrc,
600
- $offset, $soffset, $aux}, {vdataType});
601
- }];
602
554
let hasCustomAssemblyFormat = 1;
603
555
}
604
556
605
557
def ROCDL_RawBufferAtomicCmpSwap :
606
- ROCDL_Op<"raw.buffer.atomic.cmpswap", [AllTypesMatch<["res", "src", "cmp"]>]>,
607
- Results<(outs LLVM_Type:$res)>,
558
+ ROCDL_IntrOp<"raw.buffer.atomic.cmpswap", [], [0], [AllTypesMatch<["res", "src", "cmp"]>], 1>,
608
559
Arguments<(ins LLVM_Type:$src,
609
560
LLVM_Type:$cmp,
610
561
LLVM_Type:$rsrc,
611
562
I32:$offset,
612
563
I32:$soffset,
613
564
I32:$aux)>{
614
- string llvmBuilder = [{
615
- $res = createIntrinsicCall(builder,
616
- llvm::Intrinsic::amdgcn_raw_buffer_atomic_cmpswap, {$src, $cmp, $rsrc,
617
- $offset, $soffset, $aux}, {$_resultType});
618
- }];
619
565
let assemblyFormat = [{
620
566
attr-dict `(` operands `)` `:` type($res) `,` type($rsrc)
621
567
}];
@@ -625,100 +571,64 @@ def ROCDL_RawBufferAtomicCmpSwap :
625
571
// MI-100 and MI-200 buffer atomic floating point add intrinsic
626
572
627
573
def ROCDL_RawBufferAtomicFAddOp :
628
- ROCDL_Op <"raw.buffer.atomic.fadd">,
574
+ ROCDL_IntrOp <"raw.buffer.atomic.fadd", [], [0], [], 0 >,
629
575
Arguments<(ins LLVM_Type:$vdata,
630
576
LLVM_Type:$rsrc,
631
577
LLVM_Type:$offset,
632
578
LLVM_Type:$soffset,
633
579
LLVM_Type:$aux)>{
634
- string llvmBuilder = [{
635
- auto vdataType = moduleTranslation.convertType(op.getVdata().getType());
636
- createIntrinsicCall(builder,
637
- llvm::Intrinsic::amdgcn_raw_buffer_atomic_fadd, {$vdata, $rsrc,
638
- $offset, $soffset, $aux}, {vdataType});
639
- }];
640
580
let hasCustomAssemblyFormat = 1;
641
581
}
642
582
643
583
//===---------------------------------------------------------------------===//
644
584
// Buffer atomic floating point max intrinsic. GFX9 does not support fp32.
645
585
646
586
def ROCDL_RawBufferAtomicFMaxOp :
647
- ROCDL_Op <"raw.buffer.atomic.fmax">,
587
+ ROCDL_IntrOp <"raw.buffer.atomic.fmax", [], [0], [], 0 >,
648
588
Arguments<(ins LLVM_Type:$vdata,
649
589
LLVM_Type:$rsrc,
650
590
LLVM_Type:$offset,
651
591
LLVM_Type:$soffset,
652
592
LLVM_Type:$aux)>{
653
- string llvmBuilder = [{
654
- auto vdataType = moduleTranslation.convertType(op.getVdata().getType());
655
- createIntrinsicCall(builder,
656
- llvm::Intrinsic::amdgcn_raw_buffer_atomic_fmax, {$vdata, $rsrc,
657
- $offset, $soffset, $aux}, {vdataType});
658
- }];
659
593
let hasCustomAssemblyFormat = 1;
660
594
}
661
595
662
596
//===---------------------------------------------------------------------===//
663
597
// Buffer atomic signed integer max intrinsic.
664
598
665
599
def ROCDL_RawBufferAtomicSMaxOp :
666
- ROCDL_Op <"raw.buffer.atomic.smax">,
600
+ ROCDL_IntrOp <"raw.buffer.atomic.smax", [], [0], [], 0 >,
667
601
Arguments<(ins LLVM_Type:$vdata,
668
602
LLVM_Type:$rsrc,
669
603
LLVM_Type:$offset,
670
604
LLVM_Type:$soffset,
671
605
LLVM_Type:$aux)>{
672
- string llvmBuilder = [{
673
- auto vdataType = moduleTranslation.convertType(op.getVdata().getType());
674
- createIntrinsicCall(builder,
675
- llvm::Intrinsic::amdgcn_raw_buffer_atomic_smax, {$vdata, $rsrc,
676
- $offset, $soffset, $aux}, {vdataType});
677
- }];
678
606
let hasCustomAssemblyFormat = 1;
679
607
}
680
608
681
609
//===---------------------------------------------------------------------===//
682
610
// Buffer atomic unsigned integer min intrinsic.
683
611
684
612
def ROCDL_RawBufferAtomicUMinOp :
685
- ROCDL_Op <"raw.buffer.atomic.umin">,
613
+ ROCDL_IntrOp <"raw.buffer.atomic.umin", [], [0], [], 0 >,
686
614
Arguments<(ins LLVM_Type:$vdata,
687
615
LLVM_Type:$rsrc,
688
616
LLVM_Type:$offset,
689
617
LLVM_Type:$soffset,
690
618
LLVM_Type:$aux)>{
691
- string llvmBuilder = [{
692
- auto vdataType = moduleTranslation.convertType(op.getVdata().getType());
693
- createIntrinsicCall(builder,
694
- llvm::Intrinsic::amdgcn_raw_buffer_atomic_umin, {$vdata, $rsrc,
695
- $offset, $soffset, $aux}, {vdataType});
696
- }];
697
619
let hasCustomAssemblyFormat = 1;
698
620
}
699
621
700
622
// DPP Update intrinsic
701
623
def ROCDL_DPPUpdateOp : ROCDL_IntrOp<"update.dpp", [], [0],
702
- [AllTypesMatch<["res", "src", "old"]>], 1>,
624
+ [AllTypesMatch<["res", "src", "old"]>], 1, 0, 0,
625
+ [2, 3, 4, 5], ["dppCtrl", "rowMask", "bankMask", "boundCtrl"]>,
703
626
Arguments<(ins LLVM_Type:$old, LLVM_Type:$src, I32Attr:$dppCtrl, I32Attr:$rowMask,
704
627
I32Attr:$bankMask, I1Attr:$boundCtrl)> {
705
628
let results = (outs LLVM_Type:$res);
706
629
let assemblyFormat = [{
707
630
attr-dict $old `,` $src `with` $dppCtrl `,` $rowMask `,` $bankMask `,` $boundCtrl `:` type($src)
708
631
}];
709
- string llvmBuilder = [{
710
- auto vdataType = moduleTranslation.convertType(op.getSrc().getType());
711
- llvm::Value *args[] = {
712
- moduleTranslation.lookupValue(op.getOld()),
713
- moduleTranslation.lookupValue(op.getSrc()),
714
- builder.getInt32(op.getDppCtrl()),
715
- builder.getInt32(op.getRowMask()),
716
- builder.getInt32(op.getBankMask()),
717
- builder.getInt1(op.getBoundCtrl())
718
- };
719
- $res = createIntrinsicCall(builder,
720
- llvm::Intrinsic::amdgcn_update_dpp, args, {vdataType});
721
- }];
722
632
}
723
633
724
634
//===---------------------------------------------------------------------===//
0 commit comments