@@ -96,8 +96,8 @@ def XeA32v3 : XeAddrRC<GRF_3x32, "32v3">;
96
96
def XeA32v4 : XeAddrRC<GRF_4x32, "32v4">;
97
97
98
98
// SRF address operand (set for $addrbase or $addroff)
99
- // TODO: All supported messages currently have 64b srf address
100
- def XeScalarA64 : XeAddrRC<SRF_2x32, "64">;
99
+ def XeScalarA32 : XeAddrRC<SRF_32, "32">;
100
+ def XeScalarA64 : XeAddrRC<SRF_2x32, "64">;
101
101
102
102
class AddressOpndHandler<string Fn> {
103
103
string HandlerFn = Fn;
@@ -109,11 +109,11 @@ def StatelessBase64A64Handler : AddressOpndHandler<"selectStatelessBase64A64">;
109
109
def StatelessBase64A32SHandler : AddressOpndHandler<"selectStatelessBase64A32S">;
110
110
def StatelessBase64A32UHandler : AddressOpndHandler<"selectStatelessBase64A32U">;
111
111
def SLMA32Handler : AddressOpndHandler<"selectSLMA32">;
112
- def SLMBase64A32Handler : AddressOpndHandler<"selectSLMBase64A32">;
113
112
def GenericBase64A64Handler : AddressOpndHandler<"selectGenericBase64A64">;
114
113
def NullHandler : AddressOpndHandler<"/* Unused */">;
115
114
// scalar address handler
116
- def StatelessBase64Handler : AddressOpndHandler<"selectStatelessBase64">;
115
+ def StatelessBase64Handler : AddressOpndHandler<"selectStatelessBase64">;
116
+ def SLMScalarA32Handler : AddressOpndHandler<"selectSLMScalarA32">;
117
117
118
118
class AddrPattern<ValueType VT, int NumOps, AddressOpndHandler H, int complexity>
119
119
: ComplexPattern<VT, NumOps, H.HandlerFn> {
@@ -176,10 +176,20 @@ class toAddrMIROp<string memName, XeAddrRC baseRC, XeAddrRC offRC, string asmNam
176
176
true : "");
177
177
178
178
// address offset name not present if RC is null. Or it is the asmName if exists.
179
- // Otherwise it's "a32" or "a64" accroding to RC size
179
+ // Otherwise it's "a" + offRC.Size, e.g. "a32" or "a64".
180
+ // Additionally, prefix scalar form address offset with "scalar"
181
+ // Some examples:
182
+ // asmName offRC.Size vectorName scalarName
183
+ // --------------------------------------------------
184
+ // "" "32" "a32" "scalara32"
185
+ // "" "32v2" "a32v2" "sclara32v2"
186
+ // "a64" -- "a64" "scalara64"
187
+ // "a32s" -- "a32s" "scalara32s"
188
+ // "sa32" -- "sa32" "scalarsa32"
189
+ defvar OffPrefix = !if(!eq(!find(!cast<string>(offRC), "Scalar"), -1), "", "scalar");
180
190
defvar OffName = !cond(!eq(offRC, XeAddrNull) : "",
181
- !eq(asmName, "") : "_a "#offRC.Size,
182
- true : "_"#asmName);
191
+ !eq(asmName, "") : "_"#OffPrefix#"a "#offRC.Size,
192
+ true : "_"#OffPrefix# asmName);
183
193
184
194
string AddrName = memName#BaseName#OffName;
185
195
}
@@ -207,25 +217,25 @@ class XeAddressMode<XeMemoryType mt, XeAddrRC baseRC, XeAddrRC offsetRC, string
207
217
XeAddrOpnd AddrOpnd = toXeAddrOpnd<mt.Size, baseRC, offsetRC, H, complexity>.Opnd;
208
218
}
209
219
210
- // MemoryType, $addrbase, $addroff, AsmName, AddressOpndHandler, complexity
211
- // ------------------------------------------------------------------------------------
220
+ // MemoryType, $addrbase, $addroff, AsmName, AddressOpndHandler, complexity
221
+ // ---------------------------------------------------------------------------------------
212
222
// Vector address
213
- def XeStateful_Base64_A32 : XeAddressMode<XeStateful, XeScalarA64, XeA32, "sa32", StatefulBase64A32Handler, 1>;
214
- def XeStateless_A64 : XeAddressMode<XeStateless, XeAddrNull, XeA64, "a64", StatelessA64Hanlder, 1>;
215
- def XeStateless_Base64_A64 : XeAddressMode<XeStateless, XeScalarA64, XeA64, "a64", StatelessBase64A64Handler, 1>;
216
- def XeStateless_Base64_A32S : XeAddressMode<XeStateless, XeScalarA64, XeA32, "a32s", StatelessBase64A32SHandler, 6>;
217
- def XeStateless_Base64_A32U : XeAddressMode<XeStateless, XeScalarA64, XeA32, "a32u", StatelessBase64A32UHandler, 6>;
218
- def XeSLM_Base64_A32 : XeAddressMode<XeSLM, XeScalarA64, XeA32, "", SLMBase64A32Handler, 3>;
219
- def XeSLM_A32 : XeAddressMode<XeSLM, XeAddrNull, XeA32, "", SLMA32Handler, 1>;
220
- def XeGeneric_Base64_A64 : XeAddressMode<XeGeneric, XeScalarA64, XeA64, "a64", GenericBase64A64Handler, 1>;
221
- def XeURB_A32 : XeAddressMode<XeURB, XeAddrNull, XeA32, "", NullHandler, 1>;
223
+ def XeStateful_Base64_A32 : XeAddressMode<XeStateful, XeScalarA64, XeA32, "sa32", StatefulBase64A32Handler, 1>;
224
+ def XeStateless_A64 : XeAddressMode<XeStateless, XeAddrNull, XeA64, "a64", StatelessA64Hanlder, 1>;
225
+ def XeStateless_Base64_A64 : XeAddressMode<XeStateless, XeScalarA64, XeA64, "a64", StatelessBase64A64Handler, 1>;
226
+ def XeStateless_Base64_A32S : XeAddressMode<XeStateless, XeScalarA64, XeA32, "a32s", StatelessBase64A32SHandler, 6>;
227
+ def XeStateless_Base64_A32U : XeAddressMode<XeStateless, XeScalarA64, XeA32, "a32u", StatelessBase64A32UHandler, 6>;
228
+ def XeSLM_A32 : XeAddressMode<XeSLM, XeAddrNull, XeA32, "", SLMA32Handler, 1>;
229
+ def XeGeneric_Base64_A64 : XeAddressMode<XeGeneric, XeScalarA64, XeA64, "a64", GenericBase64A64Handler, 1>;
230
+ def XeURB_A32 : XeAddressMode<XeURB, XeAddrNull, XeA32, "", NullHandler, 1>;
222
231
// TGM has multiple address payload sizes depending on surface type
223
- def XeTGM_Base64_A32 : XeAddressMode<XeTGM, XeScalarA64, XeA32, "", NullHandler, 1>;
224
- def XeTGM_Base64_A32v2 : XeAddressMode<XeTGM, XeScalarA64, XeA32v2, "", NullHandler, 1>;
225
- def XeTGM_Base64_A32v3 : XeAddressMode<XeTGM, XeScalarA64, XeA32v3, "", NullHandler, 1>;
226
- def XeTGM_Base64_A32v4 : XeAddressMode<XeTGM, XeScalarA64, XeA32v4, "", NullHandler, 1>;
232
+ def XeTGM_Base64_A32 : XeAddressMode<XeTGM, XeScalarA64, XeA32, "", NullHandler, 1>;
233
+ def XeTGM_Base64_A32v2 : XeAddressMode<XeTGM, XeScalarA64, XeA32v2, "", NullHandler, 1>;
234
+ def XeTGM_Base64_A32v3 : XeAddressMode<XeTGM, XeScalarA64, XeA32v3, "", NullHandler, 1>;
235
+ def XeTGM_Base64_A32v4 : XeAddressMode<XeTGM, XeScalarA64, XeA32v4, "", NullHandler, 1>;
227
236
// Scalar address
228
- def XeStateless_Base64 : XeAddressMode<XeStateless, XeScalarA64, XeAddrNull, "a64", StatelessBase64Handler, 2>;
237
+ def XeStateless_Base64 : XeAddressMode<XeStateless, XeScalarA64, XeAddrNull, "a64", StatelessBase64Handler, 2>;
238
+ def XeSLM_ScalarA32 : XeAddressMode<XeSLM, XeAddrNull, XeScalarA32, "", SLMScalarA32Handler, 2>;
229
239
230
240
class StorePat<XeAddressMode AM, SDPatternOperator Op> : PatFrag<(ops node:$data, node:$ptr), (Op node:$data, node:$ptr)> {
231
241
let IsStore = 1;
@@ -243,7 +253,10 @@ class AtomPat<XeAddressMode AM, PatFrag pat> :
243
253
let AddressSpaces = AM.MemTy.AsNum;
244
254
}
245
255
246
- foreach Am = [XeStateless_Base64_A32S, XeStateless_Base64_A32U, XeStateless_Base64_A64, XeStateless_A64, XeGeneric_Base64_A64, XeSLM_A32, XeSLM_Base64_A32, XeStateful_Base64_A32, XeStateless_Base64] in {
256
+ foreach Am = [XeStateless_Base64_A32S, XeStateless_Base64_A32U, XeStateless_Base64_A64, XeStateless_A64, XeStateless_Base64,
257
+ XeGeneric_Base64_A64,
258
+ XeSLM_A32, XeSLM_ScalarA32,
259
+ XeStateful_Base64_A32] in {
247
260
// Complex operand matchers for GISel.
248
261
def gi_AddrPattern_#Am.MIRName : GIComplexOperandMatcher<VTtoLLT<Am.MemTy.Size>.Ty, Am.AddrOpnd.Handler.HandlerFn>, GIComplexPatternEquiv<Am.AddrOpnd>;
249
262
}
@@ -579,13 +592,13 @@ multiclass TypedStore<XeAddressMode Am, list<XeIOType> IOTypes> {
579
592
}
580
593
581
594
// vector ld/st
582
- foreach as = [XeStateless_Base64_A32S, XeStateless_Base64_A32U, XeStateless_Base64_A64, XeStateless_A64, XeGeneric_Base64_A64, XeSLM_A32, XeSLM_Base64_A32, XeStateful_Base64_A32] in {
595
+ foreach as = [XeStateless_Base64_A32S, XeStateless_Base64_A32U, XeStateless_Base64_A64, XeStateless_A64, XeGeneric_Base64_A64, XeSLM_A32, XeStateful_Base64_A32] in {
583
596
defm LD: Load<as, XeIOTypes.LdSt>;
584
597
defm ST: Store<as, XeIOTypes.LdSt>;
585
598
}
586
599
587
600
// scalar ld/st
588
- foreach as = [XeStateless_Base64] in {
601
+ foreach as = [XeStateless_Base64, XeSLM_ScalarA32 ] in {
589
602
defm SLD: Load<as, XeIOTypes.Sldst, 1>;
590
603
defm SST: Store<as, XeIOTypes.Sldst, 1>;
591
604
}
@@ -616,7 +629,7 @@ foreach as = [XeStateless_Base64_A32S, XeStateless_Base64_A32U, XeStateless_Base
616
629
}
617
630
618
631
// shared atomic
619
- foreach as = [XeSLM_A32, XeSLM_Base64_A32 ] in {
632
+ foreach as = [XeSLM_A32] in {
620
633
defm IATOM: Atom<as, "IATOM", XeIOTypes.Atom1SrcNo64, ["aincwrap", "adecwrap", "aadd", "asub", "asmin", "asmax", "aumin", "aumax", "aand", "aor", "axor", "ast"]>;
621
634
defm IATOM: Atom<as, "IATOM", XeIOTypes.Atom2Src, ["acxg"]>;
622
635
defm FATOM: Atom<as, "FATOM", XeIOTypes.Atom1SrcNo64, ["afadd", "afsub", "afmin", "afmax"]>;
0 commit comments