@@ -14,6 +14,12 @@ def GlobalSAddr : ComplexPattern<iPTR, 3, "SelectGlobalSAddr", [], [SDNPWantRoot
1414def ScratchSAddr : ComplexPattern<iPTR, 2, "SelectScratchSAddr", [], [SDNPWantRoot], -10>;
1515def ScratchSVAddr : ComplexPattern<iPTR, 3, "SelectScratchSVAddr", [], [SDNPWantRoot], -10>;
1616
17+ class True16D16Table <string hiOp, string loOp> {
18+ Instruction T16Op = !cast<Instruction>(NAME);
19+ Instruction HiOp = !cast<Instruction>(hiOp);
20+ Instruction LoOp = !cast<Instruction>(loOp);
21+ }
22+
1723//===----------------------------------------------------------------------===//
1824// FLAT classes
1925//===----------------------------------------------------------------------===//
@@ -225,6 +231,12 @@ class FLAT_Load_Pseudo <string opName, RegisterClass regClass,
225231 let DisableEncoding = !if(HasTiedOutput, "$vdst_in", "");
226232}
227233
234+ multiclass FLAT_Load_Pseudo_t16<string opName> {
235+ def "" : FLAT_Load_Pseudo<opName, VGPR_32, 1>;
236+ let True16Predicate = UseRealTrue16Insts in
237+ def _t16 : FLAT_Load_Pseudo<opName#"_t16", VGPR_16>, True16D16Table<NAME#"_HI", NAME>;
238+ }
239+
228240class FLAT_Store_Pseudo <string opName, RegisterClass vdataClass,
229241 bit HasSaddr = 0, bit EnableSaddr = 0> : FLAT_Pseudo<
230242 opName,
@@ -242,6 +254,12 @@ class FLAT_Store_Pseudo <string opName, RegisterClass vdataClass,
242254 let enabled_saddr = EnableSaddr;
243255}
244256
257+ multiclass FLAT_Store_Pseudo_t16<string opName> {
258+ def "" : FLAT_Store_Pseudo<opName, VGPR_32>;
259+ let True16Predicate = UseRealTrue16Insts in
260+ def _t16 : FLAT_Store_Pseudo<opName#"_t16", VGPR_16>, True16D16Table<NAME#"_D16_HI", NAME>;
261+ }
262+
245263multiclass FLAT_Global_Load_Pseudo<string opName, RegisterClass regClass, bit HasTiedInput = 0> {
246264 let is_flat_global = 1 in {
247265 def "" : FLAT_Load_Pseudo<opName, regClass, HasTiedInput, 1>,
@@ -653,27 +671,28 @@ def FLAT_LOAD_DWORDX2 : FLAT_Load_Pseudo <"flat_load_dwordx2", VReg_64>;
653671def FLAT_LOAD_DWORDX4 : FLAT_Load_Pseudo <"flat_load_dwordx4", VReg_128>;
654672def FLAT_LOAD_DWORDX3 : FLAT_Load_Pseudo <"flat_load_dwordx3", VReg_96>;
655673
656- def FLAT_STORE_BYTE : FLAT_Store_Pseudo <"flat_store_byte", VGPR_32>;
657- def FLAT_STORE_SHORT : FLAT_Store_Pseudo <"flat_store_short", VGPR_32>;
658674def FLAT_STORE_DWORD : FLAT_Store_Pseudo <"flat_store_dword", VGPR_32>;
659675def FLAT_STORE_DWORDX2 : FLAT_Store_Pseudo <"flat_store_dwordx2", VReg_64>;
660676def FLAT_STORE_DWORDX4 : FLAT_Store_Pseudo <"flat_store_dwordx4", VReg_128>;
661677def FLAT_STORE_DWORDX3 : FLAT_Store_Pseudo <"flat_store_dwordx3", VReg_96>;
662678
663679let SubtargetPredicate = HasD16LoadStore in {
664680let TiedSourceNotRead = 1 in {
665- def FLAT_LOAD_UBYTE_D16 : FLAT_Load_Pseudo <"flat_load_ubyte_d16", VGPR_32, 1>;
666681def FLAT_LOAD_UBYTE_D16_HI : FLAT_Load_Pseudo <"flat_load_ubyte_d16_hi", VGPR_32, 1>;
667- def FLAT_LOAD_SBYTE_D16 : FLAT_Load_Pseudo <"flat_load_sbyte_d16", VGPR_32, 1 >;
682+ defm FLAT_LOAD_UBYTE_D16 : FLAT_Load_Pseudo_t16 <"flat_load_ubyte_d16" >;
668683def FLAT_LOAD_SBYTE_D16_HI : FLAT_Load_Pseudo <"flat_load_sbyte_d16_hi", VGPR_32, 1>;
669- def FLAT_LOAD_SHORT_D16 : FLAT_Load_Pseudo <"flat_load_short_d16", VGPR_32, 1 >;
684+ defm FLAT_LOAD_SBYTE_D16 : FLAT_Load_Pseudo_t16 <"flat_load_sbyte_d16" >;
670685def FLAT_LOAD_SHORT_D16_HI : FLAT_Load_Pseudo <"flat_load_short_d16_hi", VGPR_32, 1>;
686+ defm FLAT_LOAD_SHORT_D16 : FLAT_Load_Pseudo_t16 <"flat_load_short_d16">;
671687}
672688
673689def FLAT_STORE_BYTE_D16_HI : FLAT_Store_Pseudo <"flat_store_byte_d16_hi", VGPR_32>;
674690def FLAT_STORE_SHORT_D16_HI : FLAT_Store_Pseudo <"flat_store_short_d16_hi", VGPR_32>;
675691}
676692
693+ defm FLAT_STORE_BYTE : FLAT_Store_Pseudo_t16 <"flat_store_byte">;
694+ defm FLAT_STORE_SHORT : FLAT_Store_Pseudo_t16 <"flat_store_short">;
695+
677696defm FLAT_ATOMIC_CMPSWAP : FLAT_Atomic_Pseudo <"flat_atomic_cmpswap",
678697 VGPR_32, i32, v2i32, VReg_64>;
679698
@@ -1044,6 +1063,11 @@ class FlatLoadPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> :
10441063 (inst $vaddr, $offset, 0, $in)
10451064>;
10461065
1066+ class FlatLoadPat_D16_t16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
1067+ (vt (node (FlatOffset (i64 VReg_64:$vaddr), i32:$offset))),
1068+ (inst $vaddr, $offset, (i32 0))
1069+ >;
1070+
10471071class FlatSignedLoadPat_D16 <FLAT_Pseudo inst, SDPatternOperator node, ValueType vt> : GCNPat <
10481072 (node (GlobalOffset (i64 VReg_64:$vaddr), i32:$offset), vt:$in),
10491073 (inst $vaddr, $offset, 0, $in)
@@ -1355,27 +1379,35 @@ let OtherPredicates = [HasFlatAddressSpace] in {
13551379
13561380def : FlatLoadPat <FLAT_LOAD_UBYTE, atomic_load_8_flat, i32>;
13571381def : FlatLoadPat <FLAT_LOAD_UBYTE, atomic_load_8_flat, i16>;
1358- def : FlatLoadPat <FLAT_LOAD_UBYTE, atomic_load_zext_8_flat, i32>;
1359- def : FlatLoadPat <FLAT_LOAD_UBYTE, atomic_load_zext_8_flat, i16>;
13601382def : FlatLoadPat <FLAT_LOAD_USHORT, atomic_load_16_flat, i32>;
13611383def : FlatLoadPat <FLAT_LOAD_USHORT, atomic_load_16_flat, i16>;
1362- def : FlatLoadPat <FLAT_LOAD_USHORT, atomic_load_zext_16_flat, i32>;
1363- def : FlatLoadPat <FLAT_LOAD_USHORT, atomic_load_zext_16_flat, i16>;
13641384def : FlatLoadPat <FLAT_LOAD_UBYTE, extloadi8_flat, i32>;
13651385def : FlatLoadPat <FLAT_LOAD_UBYTE, zextloadi8_flat, i32>;
13661386def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i32>;
1367- def : FlatLoadPat <FLAT_LOAD_SBYTE, atomic_load_sext_8_flat, i32>;
1368- def : FlatLoadPat <FLAT_LOAD_SBYTE, atomic_load_sext_8_flat, i16>;
1369- def : FlatLoadPat <FLAT_LOAD_UBYTE, extloadi8_flat, i16>;
1370- def : FlatLoadPat <FLAT_LOAD_UBYTE, zextloadi8_flat, i16>;
1371- def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i16>;
13721387def : FlatLoadPat <FLAT_LOAD_USHORT, extloadi16_flat, i32>;
13731388def : FlatLoadPat <FLAT_LOAD_USHORT, zextloadi16_flat, i32>;
1374- def : FlatLoadPat <FLAT_LOAD_USHORT, load_flat, i16>;
13751389def : FlatLoadPat <FLAT_LOAD_SSHORT, sextloadi16_flat, i32>;
1376- def : FlatLoadPat <FLAT_LOAD_SSHORT, atomic_load_sext_16_flat, i32>;
13771390def : FlatLoadPat <FLAT_LOAD_DWORDX3, load_flat, v3i32>;
13781391
1392+ foreach p = [NotHasTrue16BitInsts, UseFakeTrue16Insts] in
1393+ let True16Predicate = p in {
1394+ def : FlatLoadPat <FLAT_LOAD_UBYTE, extloadi8_flat, i16>;
1395+ def : FlatLoadPat <FLAT_LOAD_UBYTE, zextloadi8_flat, i16>;
1396+ def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i16>;
1397+ def : FlatLoadPat <FLAT_LOAD_USHORT, load_flat, i16>;
1398+ def : FlatStorePat <FLAT_STORE_BYTE, truncstorei8_flat, i16>;
1399+ def : FlatStorePat <FLAT_STORE_SHORT, store_flat, i16>;
1400+ }
1401+
1402+ let OtherPredicates = [D16PreservesUnusedBits, HasFlatAddressSpace], True16Predicate = UseRealTrue16Insts in {
1403+ def : FlatLoadPat_D16_t16<FLAT_LOAD_UBYTE_D16_t16, extloadi8_flat, i16>;
1404+ def : FlatLoadPat_D16_t16<FLAT_LOAD_UBYTE_D16_t16, zextloadi8_flat, i16>;
1405+ def : FlatLoadPat_D16_t16<FLAT_LOAD_SBYTE_D16_t16, sextloadi8_flat, i16>;
1406+ def : FlatLoadPat_D16_t16<FLAT_LOAD_SHORT_D16_t16, load_flat, i16>;
1407+ def : FlatStorePat <FLAT_STORE_BYTE_t16, truncstorei8_flat, i16>;
1408+ def : FlatStorePat <FLAT_STORE_SHORT_t16, store_flat, i16>;
1409+ } // End let OtherPredicates = [D16PreservesUnusedBits, HasFlatAddressSpace], True16Predicate = UseRealTrue16Insts
1410+
13791411def : FlatLoadPat <FLAT_LOAD_DWORD, atomic_load_32_flat, i32>;
13801412def : FlatLoadPat <FLAT_LOAD_DWORDX2, atomic_load_64_flat, i64>;
13811413
@@ -1454,9 +1486,6 @@ let SubtargetPredicate = isGFX12Plus in {
14541486 defm : FlatAtomicNoRtnPatWithAddrSpace<"FLAT_ATOMIC_COND_SUB_U32", "int_amdgcn_atomic_cond_sub_u32", "flat_addrspace", i32>;
14551487}
14561488
1457- def : FlatStorePat <FLAT_STORE_BYTE, truncstorei8_flat, i16>;
1458- def : FlatStorePat <FLAT_STORE_SHORT, store_flat, i16>;
1459-
14601489let OtherPredicates = [HasD16LoadStore] in {
14611490def : FlatStorePat <FLAT_STORE_SHORT_D16_HI, truncstorei16_hi16_flat, i32>;
14621491def : FlatStorePat <FLAT_STORE_BYTE_D16_HI, truncstorei8_hi16_flat, i32>;
@@ -2752,3 +2781,11 @@ defm SCRATCH_STORE_SHORT_D16_HI : VSCRATCH_Real_AllAddr_gfx12<0x25, "scratch_
27522781
27532782defm SCRATCH_LOAD_BLOCK : VSCRATCH_Real_AllAddr_gfx12<0x53>;
27542783defm SCRATCH_STORE_BLOCK : VSCRATCH_Real_AllAddr_gfx12<0x54>;
2784+
2785+ def True16D16Table : GenericTable {
2786+ let FilterClass = "True16D16Table";
2787+ let CppTypeName = "True16D16Info";
2788+ let Fields = ["T16Op", "HiOp", "LoOp"];
2789+ let PrimaryKey = ["T16Op"];
2790+ let PrimaryKeyName = "getT16D16Helper";
2791+ }
0 commit comments