@@ -10,8 +10,13 @@ def smrd_offset_8 : ImmOperand<i32, "SMRDOffset8", 1>;
10
10
11
11
let EncoderMethod = "getSMEMOffsetEncoding",
12
12
DecoderMethod = "decodeSMEMOffset" in {
13
- def smem_offset : ImmOperand<i32, "SMEMOffset", 1>;
14
- def smem_offset_mod : NamedIntOperand<i32, "offset", "SMEMOffsetMod">;
13
+ def SMEMOffset : ImmOperand<i32, "SMEMOffset", 1>;
14
+ def SMEMOffsetMod : NamedIntOperand<i32, "offset", 0>;
15
+ def OptSMEMOffsetMod : NamedIntOperand<i32, "offset"> {
16
+ let ImmTy = SMEMOffsetMod.ImmTy;
17
+ let PredicateMethod = SMEMOffsetMod.PredicateMethod;
18
+ let PrintMethod = SMEMOffsetMod.PrintMethod;
19
+ }
15
20
}
16
21
17
22
//===----------------------------------------------------------------------===//
@@ -87,11 +92,14 @@ class OffsetMode<bit hasOffset, bit hasSOffset, string variant,
87
92
string Asm = asm;
88
93
}
89
94
90
- def IMM_Offset : OffsetMode<1, 0, "_IMM", (ins smem_offset :$offset), "$offset">;
95
+ def IMM_Offset : OffsetMode<1, 0, "_IMM", (ins SMEMOffset :$offset), "$offset">;
91
96
def SGPR_Offset : OffsetMode<0, 1, "_SGPR", (ins SReg_32:$soffset), "$soffset">;
92
97
def SGPR_IMM_Offset : OffsetMode<1, 1, "_SGPR_IMM",
93
- (ins SReg_32:$soffset, smem_offset_mod :$offset),
98
+ (ins SReg_32:$soffset, SMEMOffsetMod :$offset),
94
99
"$soffset$offset">;
100
+ def SGPR_IMM_OptOffset : OffsetMode<1, 1, "_SGPR_IMM",
101
+ (ins SReg_32:$soffset, OptSMEMOffsetMod:$offset),
102
+ "$soffset$offset">;
95
103
96
104
class SM_Probe_Pseudo <string opName, RegisterClass baseClass, OffsetMode offsets>
97
105
: SM_Pseudo<opName, (outs),
@@ -201,6 +209,7 @@ multiclass SM_Pseudo_Probe<RegisterClass baseClass> {
201
209
def _IMM : SM_Probe_Pseudo <opName, baseClass, IMM_Offset>;
202
210
def _SGPR : SM_Probe_Pseudo <opName, baseClass, SGPR_Offset>;
203
211
def _SGPR_IMM : SM_Probe_Pseudo <opName, baseClass, SGPR_IMM_Offset>;
212
+ def _SGPR_OPT_IMM : SM_Probe_Pseudo <opName, baseClass, SGPR_IMM_OptOffset>;
204
213
}
205
214
206
215
class SM_WaveId_Pseudo<string opName, SDPatternOperator node> : SM_Pseudo<
@@ -214,7 +223,7 @@ class SM_WaveId_Pseudo<string opName, SDPatternOperator node> : SM_Pseudo<
214
223
215
224
class SM_Prefetch_Pseudo <string opName, RegisterClass baseClass, bit hasSBase>
216
225
: SM_Pseudo<opName, (outs), !con(!if(hasSBase, (ins baseClass:$sbase), (ins)),
217
- (ins smem_offset :$offset, SReg_32:$soffset, i8imm:$sdata)),
226
+ (ins SMEMOffset :$offset, SReg_32:$soffset, i8imm:$sdata)),
218
227
!if(hasSBase, " $sbase,", "") # " $offset, $soffset, $sdata"> {
219
228
// Mark prefetches as both load and store to prevent reordering with loads
220
229
// and stores. This is also needed for pattern to match prefetch intrinsic.
@@ -1410,7 +1419,7 @@ class SMEM_Real_Load_gfx12<bits<6> op, string ps, string opName, OffsetMode offs
1410
1419
multiclass SM_Real_Loads_gfx12<bits<6> op, string ps = NAME> {
1411
1420
defvar opName = !tolower(NAME);
1412
1421
def _IMM_gfx12 : SMEM_Real_Load_gfx12<op, ps, opName, IMM_Offset>;
1413
- def _SGPR_IMM_gfx12 : SMEM_Real_Load_gfx12<op, ps, opName, SGPR_IMM_Offset >;
1422
+ def _SGPR_IMM_gfx12 : SMEM_Real_Load_gfx12<op, ps, opName, SGPR_IMM_OptOffset >;
1414
1423
}
1415
1424
1416
1425
defm S_LOAD_B32 : SM_Real_Loads_gfx12<0x00, "S_LOAD_DWORD">;
@@ -1448,7 +1457,7 @@ def S_PREFETCH_DATA_PC_REL_gfx12 : SMEM_Real_Prefetch_gfx12<0x28, S_PREFETCH_DAT
1448
1457
multiclass SMEM_Real_Probe_gfx12<bits<6> op> {
1449
1458
defvar ps = NAME;
1450
1459
def _IMM_gfx12 : SMEM_Real_Prefetch_gfx12<op, !cast<SM_Probe_Pseudo>(ps#_IMM)>;
1451
- def _SGPR_IMM_gfx12 : SMEM_Real_Prefetch_gfx12<op, !cast<SM_Probe_Pseudo>(ps#_SGPR_IMM )>;
1460
+ def _SGPR_IMM_gfx12 : SMEM_Real_Prefetch_gfx12<op, !cast<SM_Probe_Pseudo>(ps#_SGPR_OPT_IMM )>;
1452
1461
}
1453
1462
1454
1463
defm S_ATC_PROBE : SMEM_Real_Probe_gfx12<0x22>;
0 commit comments