@@ -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)
@@ -1366,16 +1390,22 @@ def : FlatLoadPat <FLAT_LOAD_UBYTE, zextloadi8_flat, i32>;
13661390def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i32>;
13671391def : FlatLoadPat <FLAT_LOAD_SBYTE, atomic_load_sext_8_flat, i32>;
13681392def : 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>;
13721393def : FlatLoadPat <FLAT_LOAD_USHORT, extloadi16_flat, i32>;
13731394def : FlatLoadPat <FLAT_LOAD_USHORT, zextloadi16_flat, i32>;
1374- def : FlatLoadPat <FLAT_LOAD_USHORT, load_flat, i16>;
13751395def : FlatLoadPat <FLAT_LOAD_SSHORT, sextloadi16_flat, i32>;
13761396def : FlatLoadPat <FLAT_LOAD_SSHORT, atomic_load_sext_16_flat, i32>;
13771397def : FlatLoadPat <FLAT_LOAD_DWORDX3, load_flat, v3i32>;
13781398
1399+ foreach p = [NotHasTrue16BitInsts, UseFakeTrue16Insts] in
1400+ let True16Predicate = p in {
1401+ def : FlatLoadPat <FLAT_LOAD_UBYTE, extloadi8_flat, i16>;
1402+ def : FlatLoadPat <FLAT_LOAD_UBYTE, zextloadi8_flat, i16>;
1403+ def : FlatLoadPat <FLAT_LOAD_SBYTE, sextloadi8_flat, i16>;
1404+ def : FlatLoadPat <FLAT_LOAD_USHORT, load_flat, i16>;
1405+ def : FlatStorePat <FLAT_STORE_BYTE, truncstorei8_flat, i16>;
1406+ def : FlatStorePat <FLAT_STORE_SHORT, store_flat, i16>;
1407+ }
1408+
13791409def : FlatLoadPat <FLAT_LOAD_DWORD, atomic_load_32_flat, i32>;
13801410def : FlatLoadPat <FLAT_LOAD_DWORDX2, atomic_load_64_flat, i64>;
13811411
@@ -1454,9 +1484,6 @@ let SubtargetPredicate = isGFX12Plus in {
14541484 defm : FlatAtomicNoRtnPatWithAddrSpace<"FLAT_ATOMIC_COND_SUB_U32", "int_amdgcn_atomic_cond_sub_u32", "flat_addrspace", i32>;
14551485}
14561486
1457- def : FlatStorePat <FLAT_STORE_BYTE, truncstorei8_flat, i16>;
1458- def : FlatStorePat <FLAT_STORE_SHORT, store_flat, i16>;
1459-
14601487let OtherPredicates = [HasD16LoadStore] in {
14611488def : FlatStorePat <FLAT_STORE_SHORT_D16_HI, truncstorei16_hi16_flat, i32>;
14621489def : FlatStorePat <FLAT_STORE_BYTE_D16_HI, truncstorei8_hi16_flat, i32>;
0 commit comments