@@ -127,6 +127,15 @@ multiclass DS_1A1D_NORET_mc<string opName, RegisterClass rc = VGPR_32> {
127127 }
128128}
129129
130+ multiclass DS_1A1D_NORET_t16<string opName, RegisterClass rc = VGPR_32>
131+ : DS_1A1D_NORET_mc<opName, rc> {
132+ let has_m0_read = 0 in {
133+ let True16Predicate = UseRealTrue16Insts in {
134+ def "_t16" : DS_1A1D_NORET<opName#"_t16", VGPR_16>, True16D16Table<NAME#"_D16_HI", NAME>;
135+ }
136+ }
137+ }
138+
130139multiclass DS_1A1D_NORET_mc_gfx9<string opName, RegisterClass rc = VGPR_32> {
131140 let has_m0_read = 0 in {
132141 def "" : DS_1A1D_NORET<opName, rc>;
@@ -294,6 +303,15 @@ multiclass DS_1A_RET_mc<string opName, RegisterClass rc = VGPR_32, bit HasTiedOu
294303 }
295304}
296305
306+ multiclass DS_1A_RET_t16<string opName, RegisterClass rc = VGPR_32, bit HasTiedOutput = 0, Operand ofs = Offset>
307+ : DS_1A_RET_mc<opName, rc, HasTiedOutput, ofs> {
308+ let has_m0_read = 0 in {
309+ let True16Predicate = UseRealTrue16Insts in {
310+ def "_t16" : DS_1A_RET<opName#"_t16", VGPR_16, HasTiedOutput, ofs>, True16D16Table<NAME#"_D16_HI", NAME#"_D16">;
311+ }
312+ }
313+ }
314+
297315multiclass DS_1A_RET_NoM0<string opName, RegisterClass rc = VGPR_32> {
298316 let has_m0_read = 0 in {
299317 def "" : DS_1A_RET<opName, rc>;
@@ -457,8 +475,6 @@ defm DS_MIN_F32 : DS_1A1D_NORET_mc<"ds_min_f32">;
457475defm DS_MAX_F32 : DS_1A1D_NORET_mc<"ds_max_f32">;
458476
459477let mayLoad = 0 in {
460- defm DS_WRITE_B8 : DS_1A1D_NORET_mc<"ds_write_b8">;
461- defm DS_WRITE_B16 : DS_1A1D_NORET_mc<"ds_write_b16">;
462478defm DS_WRITE_B32 : DS_1A1D_NORET_mc<"ds_write_b32">;
463479defm DS_WRITE2_B32 : DS_1A2D_Off8_NORET_mc<"ds_write2_b32">;
464480defm DS_WRITE2ST64_B32: DS_1A2D_Off8_NORET_mc<"ds_write2st64_b32">;
@@ -473,6 +489,9 @@ def DS_WRITE_B16_D16_HI : DS_1A1D_NORET<"ds_write_b16_d16_hi">;
473489
474490} // End has_m0_read = 0
475491
492+ defm DS_WRITE_B8 : DS_1A1D_NORET_t16<"ds_write_b8">;
493+ defm DS_WRITE_B16 : DS_1A1D_NORET_t16<"ds_write_b16">;
494+
476495let SubtargetPredicate = HasDSAddTid in {
477496def DS_WRITE_ADDTID_B32 : DS_0A1D_NORET<"ds_write_addtid_b32">;
478497}
@@ -625,10 +644,7 @@ def DS_SWIZZLE_B32 : DS_1A_RET <"ds_swizzle_b32", VGPR_32, 0, Swizzle>;
625644}
626645
627646let mayStore = 0 in {
628- defm DS_READ_I8 : DS_1A_RET_mc<"ds_read_i8">;
629- defm DS_READ_U8 : DS_1A_RET_mc<"ds_read_u8">;
630647defm DS_READ_I16 : DS_1A_RET_mc<"ds_read_i16">;
631- defm DS_READ_U16 : DS_1A_RET_mc<"ds_read_u16">;
632648defm DS_READ_B32 : DS_1A_RET_mc<"ds_read_b32">;
633649defm DS_READ_B64 : DS_1A_RET_mc<"ds_read_b64", VReg_64>;
634650
@@ -649,6 +665,10 @@ def DS_READ_U16_D16_HI : DS_1A_RET_Tied<"ds_read_u16_d16_hi">;
649665}
650666} // End has_m0_read = 0
651667
668+ defm DS_READ_I8 : DS_1A_RET_t16<"ds_read_i8">;
669+ defm DS_READ_U8 : DS_1A_RET_t16<"ds_read_u8">;
670+ defm DS_READ_U16 : DS_1A_RET_t16<"ds_read_u16">;
671+
652672let SubtargetPredicate = HasDSAddTid in {
653673def DS_READ_ADDTID_B32 : DS_0A_RET<"ds_read_addtid_b32">;
654674}
@@ -784,34 +804,51 @@ multiclass DSReadPat_mc<DS_Pseudo inst, ValueType vt, string frag> {
784804 }
785805}
786806
807+ multiclass DSReadPat_t16<DS_Pseudo inst, ValueType vt, string frag> {
808+
809+ let OtherPredicates = [LDSRequiresM0Init] in {
810+ def : DSReadPat<inst, vt, !cast<PatFrag>(frag#"_m0")>;
811+ }
812+
813+ let OtherPredicates = [NotLDSRequiresM0Init] in {
814+ foreach p = [NotHasTrue16BitInsts, UseFakeTrue16Insts] in
815+ let True16Predicate = p in {
816+ def : DSReadPat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt, !cast<PatFrag>(frag)>;
817+ }
818+ let True16Predicate = UseRealTrue16Insts in {
819+ def : DSReadPat<!cast<DS_Pseudo>(!cast<string>(inst)#"_t16"), vt, !cast<PatFrag>(frag)>;
820+ }
821+ }
822+ }
823+
787824class DSReadPat_D16 <DS_Pseudo inst, PatFrag frag, ValueType vt> : GCNPat <
788825 (frag (DS1Addr1Offset i32:$ptr, i32:$offset), vt:$in),
789826 (inst $ptr, Offset:$offset, (i1 0), $in)
790827>;
791828
792829defm : DSReadPat_mc <DS_READ_I8, i32, "sextloadi8_local">;
793- defm : DSReadPat_mc <DS_READ_I8, i16, "sextloadi8_local">;
794830defm : DSReadPat_mc <DS_READ_U8, i32, "extloadi8_local">;
795831defm : DSReadPat_mc <DS_READ_U8, i32, "zextloadi8_local">;
796- defm : DSReadPat_mc <DS_READ_U8, i16, "extloadi8_local">;
797- defm : DSReadPat_mc <DS_READ_U8, i16, "zextloadi8_local">;
798832defm : DSReadPat_mc <DS_READ_I16, i32, "sextloadi16_local">;
799833defm : DSReadPat_mc <DS_READ_I16, i32, "sextloadi16_local">;
800834defm : DSReadPat_mc <DS_READ_U16, i32, "extloadi16_local">;
801835defm : DSReadPat_mc <DS_READ_U16, i32, "zextloadi16_local">;
802- defm : DSReadPat_mc <DS_READ_U16, i16, "load_local">;
836+ defm : DSReadPat_t16 <DS_READ_I8, i16, "sextloadi8_local">;
837+ defm : DSReadPat_t16 <DS_READ_U8, i16, "extloadi8_local">;
838+ defm : DSReadPat_t16 <DS_READ_U8, i16, "zextloadi8_local">;
839+ defm : DSReadPat_t16 <DS_READ_U16, i16, "load_local">;
803840
804841foreach vt = Reg32Types.types in {
805842defm : DSReadPat_mc <DS_READ_B32, vt, "load_local">;
806843}
807844
808- defm : DSReadPat_mc <DS_READ_U8, i16, "atomic_load_8_local">;
845+ defm : DSReadPat_t16 <DS_READ_U8, i16, "atomic_load_8_local">;
809846defm : DSReadPat_mc <DS_READ_U8, i32, "atomic_load_8_local">;
810- defm : DSReadPat_mc <DS_READ_U8, i16, "atomic_load_zext_8_local">;
847+ defm : DSReadPat_t16 <DS_READ_U8, i16, "atomic_load_zext_8_local">;
811848defm : DSReadPat_mc <DS_READ_U8, i32, "atomic_load_zext_8_local">;
812- defm : DSReadPat_mc <DS_READ_I8, i16, "atomic_load_sext_8_local">;
849+ defm : DSReadPat_t16 <DS_READ_I8, i16, "atomic_load_sext_8_local">;
813850defm : DSReadPat_mc <DS_READ_I8, i32, "atomic_load_sext_8_local">;
814- defm : DSReadPat_mc <DS_READ_U16, i16, "atomic_load_16_local">;
851+ defm : DSReadPat_t16 <DS_READ_U16, i16, "atomic_load_16_local">;
815852defm : DSReadPat_mc <DS_READ_U16, i32, "atomic_load_16_local">;
816853defm : DSReadPat_mc <DS_READ_U16, i32, "atomic_load_zext_16_local">;
817854defm : DSReadPat_mc <DS_READ_I16, i32, "atomic_load_sext_16_local">;
@@ -850,18 +887,34 @@ multiclass DSWritePat_mc <DS_Pseudo inst, ValueType vt, string frag> {
850887 }
851888}
852889
890+ multiclass DSWritePat_t16 <DS_Pseudo inst, ValueType vt, string frag> {
891+ let OtherPredicates = [LDSRequiresM0Init] in {
892+ def : DSWritePat<inst, vt, !cast<PatFrag>(frag#"_m0")>;
893+ }
894+
895+ let OtherPredicates = [NotLDSRequiresM0Init] in {
896+ foreach p = [NotHasTrue16BitInsts, UseFakeTrue16Insts] in
897+ let True16Predicate = p in {
898+ def : DSWritePat<!cast<DS_Pseudo>(!cast<string>(inst)#"_gfx9"), vt, !cast<PatFrag>(frag)>;
899+ }
900+ let True16Predicate = UseRealTrue16Insts in {
901+ def : DSWritePat<!cast<DS_Pseudo>(!cast<string>(inst)#"_t16"), vt, !cast<PatFrag>(frag)>;
902+ }
903+ }
904+ }
905+
853906defm : DSWritePat_mc <DS_WRITE_B8, i32, "truncstorei8_local">;
854907defm : DSWritePat_mc <DS_WRITE_B16, i32, "truncstorei16_local">;
855- defm : DSWritePat_mc <DS_WRITE_B8, i16, "truncstorei8_local">;
856- defm : DSWritePat_mc <DS_WRITE_B16, i16, "store_local">;
908+ defm : DSWritePat_t16 <DS_WRITE_B8, i16, "truncstorei8_local">;
909+ defm : DSWritePat_t16 <DS_WRITE_B16, i16, "store_local">;
857910
858911foreach vt = Reg32Types.types in {
859912defm : DSWritePat_mc <DS_WRITE_B32, vt, "store_local">;
860913}
861914
862- defm : DSWritePat_mc <DS_WRITE_B8, i16, "atomic_store_8_local">;
915+ defm : DSWritePat_t16 <DS_WRITE_B8, i16, "atomic_store_8_local">;
863916defm : DSWritePat_mc <DS_WRITE_B8, i32, "atomic_store_8_local">;
864- defm : DSWritePat_mc <DS_WRITE_B16, i16, "atomic_store_16_local">;
917+ defm : DSWritePat_t16 <DS_WRITE_B16, i16, "atomic_store_16_local">;
865918defm : DSWritePat_mc <DS_WRITE_B16, i32, "atomic_store_16_local">;
866919defm : DSWritePat_mc <DS_WRITE_B32, i32, "atomic_store_32_local">;
867920defm : DSWritePat_mc <DS_WRITE_B64, i64, "atomic_store_64_local">;
0 commit comments