@@ -1383,6 +1383,11 @@ class FlatLoadPat_D16_t16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType v
1383
1383
(inst $vaddr, $offset, (i32 0))
1384
1384
>;
1385
1385
1386
+ class FlatLoadPat_t16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1387
+ (vt (node (FlatOffset i64:$vaddr, i32:$offset))),
1388
+ (EXTRACT_SUBREG (inst $vaddr, $offset), lo16)
1389
+ >;
1390
+
1386
1391
class FlatSignedLoadPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1387
1392
(node (GlobalOffset (i64 VReg_64:$vaddr), i32:$offset), vt:$in),
1388
1393
(inst $vaddr, $offset, 0, $in)
@@ -1393,6 +1398,11 @@ class FlatSignedLoadPat_D16_t16 <FLAT_Pseudo inst, SDPatternOperator node, Value
1393
1398
(inst $vaddr, $offset, (i32 0))
1394
1399
>;
1395
1400
1401
+ class FlatSignedLoadPat_t16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1402
+ (vt (node (GlobalOffset (i64 VReg_64:$vaddr), i32:$offset))),
1403
+ (EXTRACT_SUBREG (inst $vaddr, $offset, (i32 0)), lo16)
1404
+ >;
1405
+
1396
1406
class GlobalLoadSaddrPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1397
1407
(vt (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset, CPol:$cpol), vt:$in)),
1398
1408
(inst $saddr, $voffset, $offset, $cpol, $in)
@@ -1408,6 +1418,11 @@ class FlatLoadSaddrPat_D16_t16 <FLAT_Pseudo inst, SDPatternOperator node, ValueT
1408
1418
(inst $saddr, $voffset, $offset, $cpol)
1409
1419
>;
1410
1420
1421
+ class FlatLoadSaddrPat_t16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1422
+ (vt (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset, CPol:$cpol))),
1423
+ (EXTRACT_SUBREG (inst $saddr, $voffset, $offset, $cpol), lo16)
1424
+ >;
1425
+
1411
1426
class FlatLoadLDSSignedPat_M0 <FLAT_Pseudo inst, SDPatternOperator node> : GCNPat <
1412
1427
(node (i64 VReg_64:$vaddr), (i32 VGPR_32:$dsaddr), (i32 timm:$offset), (i32 timm:$cpol), M0),
1413
1428
(inst $dsaddr, $vaddr, $offset, $cpol)
@@ -1443,6 +1458,11 @@ class GlobalLoadSaddrPat_D16_t16 <FLAT_Pseudo inst, SDPatternOperator node, Valu
1443
1458
(inst $saddr, $voffset, $offset, $cpol)
1444
1459
>;
1445
1460
1461
+ class GlobalLoadSaddrPat_t16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1462
+ (vt (node (GlobalSAddr (i64 SReg_64:$saddr), (i32 VGPR_32:$voffset), i32:$offset, CPol:$cpol))),
1463
+ (EXTRACT_SUBREG (inst $saddr, $voffset, $offset, $cpol), lo16)
1464
+ >;
1465
+
1446
1466
class FlatLoadSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1447
1467
(vt (node (GlobalOffset (i64 VReg_64:$vaddr), i32:$offset))),
1448
1468
(inst $vaddr, $offset)
@@ -1625,6 +1645,11 @@ class ScratchLoadSignedPat_D16_t16 <FLAT_Pseudo inst, SDPatternOperator node, Va
1625
1645
(inst $vaddr, $offset, 0)
1626
1646
>;
1627
1647
1648
+ class ScratchLoadSignedPat_t16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1649
+ (vt (node (ScratchOffset (i32 VGPR_32:$vaddr), i32:$offset))),
1650
+ (EXTRACT_SUBREG (inst $vaddr, $offset), lo16)
1651
+ >;
1652
+
1628
1653
class ScratchStoreSignedPat <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1629
1654
(node vt:$data, (ScratchOffset (i32 VGPR_32:$vaddr), i32:$offset)),
1630
1655
(inst getVregSrcForVT<vt>.ret:$data, $vaddr, $offset)
@@ -1645,6 +1670,11 @@ class ScratchLoadSaddrPat_D16_t16 <FLAT_Pseudo inst, SDPatternOperator node, Val
1645
1670
(inst $saddr, $offset, 0)
1646
1671
>;
1647
1672
1673
+ class ScratchLoadSaddrPat_t16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1674
+ (vt (node (ScratchSAddr (i32 SGPR_32:$saddr), i32:$offset))),
1675
+ (EXTRACT_SUBREG (inst $saddr, $offset), lo16)
1676
+ >;
1677
+
1648
1678
class ScratchStoreSaddrPat <FLAT_Pseudo inst, SDPatternOperator node,
1649
1679
ValueType vt> : GCNPat <
1650
1680
(node vt:$data, (ScratchSAddr (i32 SGPR_32:$saddr), i32:$offset)),
@@ -1672,6 +1702,11 @@ class ScratchLoadSVaddrPat_D16_t16 <FLAT_Pseudo inst, SDPatternOperator node, Va
1672
1702
(inst $vaddr, $saddr, $offset, $cpol)
1673
1703
>;
1674
1704
1705
+ class ScratchLoadSVaddrPat_t16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1706
+ (vt (node (ScratchSVAddr (i32 VGPR_32:$vaddr), (i32 SGPR_32:$saddr), i32:$offset, CPol:$cpol))),
1707
+ (EXTRACT_SUBREG (inst $vaddr, $saddr, $offset, $cpol), lo16)
1708
+ >;
1709
+
1675
1710
multiclass GlobalLoadLDSPats_M0<FLAT_Pseudo inst, SDPatternOperator node> {
1676
1711
def : FlatLoadLDSSignedPat_M0 <inst, node> {
1677
1712
let AddedComplexity = 10;
@@ -1764,6 +1799,16 @@ multiclass GlobalFLATLoadPats_D16_t16<string inst, SDPatternOperator node, Value
1764
1799
}
1765
1800
}
1766
1801
1802
+ multiclass GlobalFLATLoadPats_t16<FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> {
1803
+ def : FlatSignedLoadPat_t16<inst, node, vt> {
1804
+ let AddedComplexity = 10;
1805
+ }
1806
+
1807
+ def : GlobalLoadSaddrPat_t16<!cast<FLAT_Pseudo>(!cast<string>(inst)#"_SADDR"), node, vt> {
1808
+ let AddedComplexity = 11;
1809
+ }
1810
+ }
1811
+
1767
1812
multiclass GlobalFLATStorePats<FLAT_Pseudo inst, SDPatternOperator node,
1768
1813
ValueType vt> {
1769
1814
def : FlatStoreSignedPat <inst, node, vt> {
@@ -1872,8 +1917,8 @@ multiclass ScratchFLATStorePats<FLAT_Pseudo inst, SDPatternOperator node,
1872
1917
}
1873
1918
}
1874
1919
1875
- multiclass ScratchFLATStorePats_t16 <string inst, SDPatternOperator node,
1876
- ValueType vt> {
1920
+ multiclass ScratchFLATStorePats_D16_t16 <string inst, SDPatternOperator node,
1921
+ ValueType vt> {
1877
1922
def : ScratchStoreSignedPat <!cast<FLAT_Pseudo>(inst#"_t16"), node, vt> {
1878
1923
let AddedComplexity = 25;
1879
1924
}
@@ -1918,6 +1963,21 @@ multiclass ScratchFLATLoadPats_D16_t16<string inst, SDPatternOperator node, Valu
1918
1963
}
1919
1964
}
1920
1965
1966
+ multiclass ScratchFLATLoadPats_t16<FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> {
1967
+ def : ScratchLoadSignedPat_t16 <inst, node, vt> {
1968
+ let AddedComplexity = 25;
1969
+ }
1970
+
1971
+ def : ScratchLoadSaddrPat_t16<!cast<FLAT_Pseudo>(!cast<string>(inst)#"_SADDR"), node, vt> {
1972
+ let AddedComplexity = 26;
1973
+ }
1974
+
1975
+ def : ScratchLoadSVaddrPat_t16<!cast<FLAT_Pseudo>(!cast<string>(inst)#"_SVS"), node, vt> {
1976
+ let SubtargetPredicate = HasFlatScratchSVSMode;
1977
+ let AddedComplexity = 27;
1978
+ }
1979
+ }
1980
+
1921
1981
multiclass FlatLoadPats<FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> {
1922
1982
def : FlatLoadPat <inst, node, vt> {
1923
1983
let OtherPredicates = [HasFlatAddressSpace];
@@ -1947,6 +2007,17 @@ multiclass FlatLoadPats_D16_t16<FLAT_Pseudo inst, SDPatternOperator node, ValueT
1947
2007
}
1948
2008
}
1949
2009
2010
+ multiclass FlatLoadPats_t16<FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> {
2011
+ def : FlatLoadPat_t16 <inst, node, vt> {
2012
+ let OtherPredicates = [HasFlatAddressSpace];
2013
+ }
2014
+
2015
+ def : FlatLoadSaddrPat_t16<!cast<FLAT_Pseudo>(!cast<string>(inst)#"_SADDR"), node, vt> {
2016
+ let AddedComplexity = 9;
2017
+ let SubtargetPredicate = HasFlatGVSMode;
2018
+ }
2019
+ }
2020
+
1950
2021
multiclass FlatStorePats<FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> {
1951
2022
def : FlatStorePat <inst, node, vt> {
1952
2023
let OtherPredicates = [HasFlatAddressSpace];
@@ -1997,6 +2068,17 @@ let True16Predicate = NotUseRealTrue16Insts in {
1997
2068
defm : FlatStorePats <FLAT_STORE_SHORT, atomic_store_16_flat, i16>;
1998
2069
}
1999
2070
2071
+ let True16Predicate = UseTrue16WithSramECC in {
2072
+ defm : FlatLoadPats_t16 <FLAT_LOAD_UBYTE, extloadi8_flat, i16>;
2073
+ defm : FlatLoadPats_t16 <FLAT_LOAD_UBYTE, zextloadi8_flat, i16>;
2074
+ defm : FlatLoadPats_t16 <FLAT_LOAD_SBYTE, sextloadi8_flat, i16>;
2075
+ defm : FlatLoadPats_t16 <FLAT_LOAD_USHORT, load_flat, i16>;
2076
+ defm : FlatLoadPats_t16 <FLAT_LOAD_UBYTE, atomic_load_aext_8_flat, i16>;
2077
+ defm : FlatLoadPats_t16 <FLAT_LOAD_UBYTE, atomic_load_zext_8_flat, i16>;
2078
+ defm : FlatLoadPats_t16 <FLAT_LOAD_USHORT, atomic_load_nonext_16_flat, i16>;
2079
+ defm : FlatLoadPats_t16 <FLAT_LOAD_SBYTE, atomic_load_sext_8_flat, i16>;
2080
+ }
2081
+
2000
2082
let OtherPredicates = [D16PreservesUnusedBits, HasFlatAddressSpace], True16Predicate = UseRealTrue16Insts in {
2001
2083
defm : FlatLoadPats_D16_t16<FLAT_LOAD_UBYTE_D16_t16, extloadi8_flat, i16>;
2002
2084
defm : FlatLoadPats_D16_t16<FLAT_LOAD_UBYTE_D16_t16, zextloadi8_flat, i16>;
@@ -2006,11 +2088,14 @@ let OtherPredicates = [D16PreservesUnusedBits, HasFlatAddressSpace], True16Predi
2006
2088
defm : FlatLoadPats_D16_t16<FLAT_LOAD_UBYTE_D16_t16, atomic_load_zext_8_flat, i16>;
2007
2089
defm : FlatLoadPats_D16_t16<FLAT_LOAD_SHORT_D16_t16, atomic_load_nonext_16_flat, i16>;
2008
2090
defm : FlatLoadPats_D16_t16<FLAT_LOAD_SBYTE_D16_t16, atomic_load_sext_8_flat, i16>;
2091
+ } // End let OtherPredicates = [D16PreservesUnusedBits, HasFlatAddressSpace], True16Predicate = UseRealTrue16Insts
2092
+
2093
+ let OtherPredicates = [D16PreservesUnusedBits], True16Predicate = UseRealTrue16Insts in {
2009
2094
defm : FlatStorePats_t16 <FLAT_STORE_BYTE, truncstorei8_flat, i16>;
2010
2095
defm : FlatStorePats_t16 <FLAT_STORE_SHORT, store_flat, i16>;
2011
2096
defm : FlatStorePats_t16 <FLAT_STORE_BYTE, atomic_store_8_flat, i16>;
2012
2097
defm : FlatStorePats_t16 <FLAT_STORE_SHORT, atomic_store_16_flat, i16>;
2013
- } // End let OtherPredicates = [D16PreservesUnusedBits, HasFlatAddressSpace], True16Predicate = UseRealTrue16Insts
2098
+ }
2014
2099
2015
2100
defm : FlatLoadPats <FLAT_LOAD_DWORD, atomic_load_nonext_32_flat, i32>;
2016
2101
defm : FlatLoadPats <FLAT_LOAD_DWORDX2, atomic_load_nonext_64_flat, i64>;
@@ -2140,6 +2225,20 @@ defm : GlobalFLATLoadPats <GLOBAL_LOAD_USHORT, atomic_load_nonext_16_global, i16
2140
2225
defm : GlobalFLATLoadPats <GLOBAL_LOAD_USHORT, atomic_load_zext_16_global, i16>;
2141
2226
}
2142
2227
2228
+ let True16Predicate = UseTrue16WithSramECC in {
2229
+ defm : GlobalFLATLoadPats_t16 <GLOBAL_LOAD_UBYTE, extloadi8_global, i16>;
2230
+ defm : GlobalFLATLoadPats_t16 <GLOBAL_LOAD_UBYTE, zextloadi8_global, i16>;
2231
+ defm : GlobalFLATLoadPats_t16 <GLOBAL_LOAD_SBYTE, sextloadi8_global, i16>;
2232
+ defm : GlobalFLATLoadPats_t16 <GLOBAL_LOAD_SSHORT, atomic_load_sext_16_global, i32>;
2233
+ defm : GlobalFLATLoadPats_t16 <GLOBAL_LOAD_USHORT, atomic_load_zext_16_global, i32>;
2234
+ defm : GlobalFLATLoadPats_t16 <GLOBAL_LOAD_USHORT, load_global, i16>;
2235
+ defm : GlobalFLATLoadPats_t16 <GLOBAL_LOAD_UBYTE, atomic_load_aext_8_global, i16>;
2236
+ defm : GlobalFLATLoadPats_t16 <GLOBAL_LOAD_UBYTE, atomic_load_zext_8_global, i16>;
2237
+ defm : GlobalFLATLoadPats_t16 <GLOBAL_LOAD_SBYTE, atomic_load_sext_8_global, i16>;
2238
+ defm : GlobalFLATLoadPats_t16 <GLOBAL_LOAD_USHORT, atomic_load_nonext_16_global, i16>;
2239
+ defm : GlobalFLATLoadPats_t16 <GLOBAL_LOAD_USHORT, atomic_load_zext_16_global, i16>;
2240
+ }
2241
+
2143
2242
let OtherPredicates = [D16PreservesUnusedBits], True16Predicate = UseRealTrue16Insts in {
2144
2243
defm : GlobalFLATLoadPats_D16_t16<"GLOBAL_LOAD_UBYTE_D16", extloadi8_global, i16>;
2145
2244
defm : GlobalFLATLoadPats_D16_t16<"GLOBAL_LOAD_UBYTE_D16", zextloadi8_global, i16>;
@@ -2192,6 +2291,13 @@ defm : GlobalFLATStorePats <GLOBAL_STORE_BYTE, atomic_store_8_global, i16>;
2192
2291
defm : GlobalFLATStorePats <GLOBAL_STORE_SHORT, atomic_store_16_global, i16>;
2193
2292
}
2194
2293
2294
+ let OtherPredicates = [HasFlatGlobalInsts], True16Predicate = UseRealTrue16Insts in {
2295
+ defm : GlobalFLATStorePats_D16_t16 <"GLOBAL_STORE_BYTE", truncstorei8_global, i16>;
2296
+ defm : GlobalFLATStorePats_D16_t16 <"GLOBAL_STORE_SHORT", store_global, i16>;
2297
+ defm : GlobalFLATStorePats_D16_t16 <"GLOBAL_STORE_BYTE", atomic_store_8_global, i16>;
2298
+ defm : GlobalFLATStorePats_D16_t16 <"GLOBAL_STORE_SHORT", atomic_store_16_global, i16>;
2299
+ }
2300
+
2195
2301
let OtherPredicates = [HasD16LoadStore] in {
2196
2302
defm : GlobalFLATStorePats <GLOBAL_STORE_SHORT_D16_HI, truncstorei16_hi16_global, i32>;
2197
2303
defm : GlobalFLATStorePats <GLOBAL_STORE_BYTE_D16_HI, truncstorei8_hi16_global, i32>;
@@ -2362,14 +2468,24 @@ defm : ScratchFLATStorePats <SCRATCH_STORE_SHORT, store_private, i16>;
2362
2468
defm : ScratchFLATStorePats <SCRATCH_STORE_BYTE, truncstorei8_private, i16>;
2363
2469
}
2364
2470
2365
- let True16Predicate = UseRealTrue16Insts in {
2471
+ let True16Predicate = UseTrue16WithSramECC in {
2472
+ defm : ScratchFLATLoadPats_t16 <SCRATCH_LOAD_UBYTE, extloadi8_private, i16>;
2473
+ defm : ScratchFLATLoadPats_t16 <SCRATCH_LOAD_UBYTE, zextloadi8_private, i16>;
2474
+ defm : ScratchFLATLoadPats_t16 <SCRATCH_LOAD_SBYTE, sextloadi8_private, i16>;
2475
+ defm : ScratchFLATLoadPats_t16 <SCRATCH_LOAD_USHORT, load_private, i16>;
2476
+ }
2477
+
2478
+ let OtherPredicates = [D16PreservesUnusedBits], True16Predicate = UseRealTrue16Insts in {
2366
2479
defm : ScratchFLATLoadPats_D16_t16<"SCRATCH_LOAD_UBYTE_D16", extloadi8_private, i16>;
2367
2480
defm : ScratchFLATLoadPats_D16_t16<"SCRATCH_LOAD_UBYTE_D16", zextloadi8_private, i16>;
2368
2481
defm : ScratchFLATLoadPats_D16_t16<"SCRATCH_LOAD_SBYTE_D16", sextloadi8_private, i16>;
2369
2482
defm : ScratchFLATLoadPats_D16_t16<"SCRATCH_LOAD_SHORT_D16", load_private, i16>;
2370
- defm : ScratchFLATStorePats_t16 <"SCRATCH_STORE_SHORT", store_private, i16>;
2371
- defm : ScratchFLATStorePats_t16 <"SCRATCH_STORE_BYTE", truncstorei8_private, i16>;
2372
- } // End True16Predicate = UseRealTrue16Insts
2483
+ } // End OtherPredicates = [D16PreservesUnusedBits], True16Predicate = UseRealTrue16Insts
2484
+
2485
+ let True16Predicate = UseRealTrue16Insts in {
2486
+ defm : ScratchFLATStorePats_D16_t16 <"SCRATCH_STORE_SHORT", store_private, i16>;
2487
+ defm : ScratchFLATStorePats_D16_t16 <"SCRATCH_STORE_BYTE", truncstorei8_private, i16>;
2488
+ }
2373
2489
2374
2490
foreach vt = Reg32Types.types in {
2375
2491
defm : ScratchFLATLoadPats <SCRATCH_LOAD_DWORD, load_private, vt>;
0 commit comments