@@ -205,13 +205,13 @@ class GlobalSaddrTable <bit is_saddr, string Name = ""> {
205205class FLAT_Load_Pseudo <string opName, RegisterClass regClass,
206206 bit HasTiedOutput = 0,
207207 bit HasSaddr = 0, bit EnableSaddr = 0,
208+ RegisterClass VaddrRC = !if(EnableSaddr, VGPR_32, VReg_64),
208209 RegisterOperand vdata_op = getLdStRegisterOperand<regClass>.ret> : FLAT_Pseudo<
209210 opName,
210211 (outs vdata_op:$vdst),
211212 !con(
212213 !if(EnableSaddr,
213- (ins SReg_64_XEXEC_XNULL:$saddr, VGPR_32:$vaddr),
214- (ins VReg_64:$vaddr)),
214+ (ins SReg_64_XEXEC_XNULL:$saddr), (ins)), (ins VaddrRC:$vaddr),
215215 (ins flat_offset:$offset),
216216 // FIXME: Operands with default values do not work with following non-optional operands.
217217 !if(HasTiedOutput, (ins CPol:$cpol, vdata_op:$vdst_in),
@@ -227,14 +227,13 @@ class FLAT_Load_Pseudo <string opName, RegisterClass regClass,
227227}
228228
229229class FLAT_Store_Pseudo <string opName, RegisterClass vdataClass,
230- bit HasSaddr = 0, bit EnableSaddr = 0> : FLAT_Pseudo<
230+ bit HasSaddr = 0, bit EnableSaddr = 0,
231+ RegisterClass VaddrRC = !if(EnableSaddr, VGPR_32, VReg_64),
232+ RegisterOperand vdata_op = getLdStRegisterOperand<vdataClass>.ret> : FLAT_Pseudo<
231233 opName,
232234 (outs),
233- !con(
234- !if(EnableSaddr,
235- (ins VGPR_32:$vaddr, getLdStRegisterOperand<vdataClass>.ret:$vdata, SReg_64_XEXEC_XNULL:$saddr),
236- (ins VReg_64:$vaddr, getLdStRegisterOperand<vdataClass>.ret:$vdata)),
237- (ins flat_offset:$offset, CPol_0:$cpol)),
235+ !con((ins VaddrRC:$vaddr, vdata_op:$vdata), !if(EnableSaddr, (ins SReg_64_XEXEC_XNULL:$saddr), (ins)),
236+ (ins flat_offset:$offset, CPol_0:$cpol)),
238237 " $vaddr, $vdata"#!if(HasSaddr, !if(EnableSaddr, ", $saddr", ", off"), "")#"$offset$cpol"> {
239238 let mayLoad = 0;
240239 let mayStore = 1;
@@ -569,65 +568,65 @@ multiclass FLAT_Atomic_Pseudo<
569568 defm "" : FLAT_Atomic_Pseudo_RTN<opName, vdst_rc, vt, data_vt, data_rc, data_op>;
570569}
571570
572- multiclass FLAT_Global_Atomic_Pseudo_NO_RTN<
571+ class FLAT_Global_Atomic_Pseudo_NO_RTN<
573572 string opName,
574573 RegisterClass vdst_rc,
575574 ValueType vt,
576575 ValueType data_vt = vt,
577576 RegisterClass data_rc = vdst_rc,
578- RegisterOperand data_op = getLdStRegisterOperand<data_rc>.ret> {
579-
580- let is_flat_global = 1 in {
581- def "" : FLAT_AtomicNoRet_Pseudo <opName,
577+ bit EnableSaddr = 0,
578+ RegisterClass VaddrRC = !if(EnableSaddr, VGPR_32, VReg_64),
579+ RegisterOperand data_op = getLdStRegisterOperand<data_rc>.ret> :
580+ FLAT_AtomicNoRet_Pseudo <opName,
582581 (outs),
583- (ins VReg_64:$vaddr, data_op:$vdata, flat_offset:$offset, CPol_0:$cpol),
584- " $vaddr, $vdata, off$offset$cpol">,
582+ !con((ins VaddrRC:$vaddr, data_op:$vdata), !if(EnableSaddr, (ins SReg_64_XEXEC_XNULL:$saddr), (ins)),
583+ (ins flat_offset:$offset, CPol_0:$cpol)),
584+ " $vaddr, $vdata, "#!if(EnableSaddr, "$saddr", "off")#"$offset$cpol">,
585585 GlobalSaddrTable<0, opName> {
586- let has_saddr = 1;
587- let FPAtomic = data_vt.isFP;
588- }
586+ let has_saddr = 1;
587+ let enabled_saddr = EnableSaddr;
588+ let FPAtomic = data_vt.isFP;
589+ let is_flat_global = 1;
590+ }
589591
590- def _SADDR : FLAT_AtomicNoRet_Pseudo <opName,
591- (outs),
592- (ins VGPR_32:$vaddr, data_op:$vdata, SReg_64_XEXEC_XNULL:$saddr, flat_offset:$offset, CPol_0:$cpol),
593- " $vaddr, $vdata, $saddr$offset$cpol">,
594- GlobalSaddrTable<1, opName> {
595- let has_saddr = 1;
596- let enabled_saddr = 1;
597- let FPAtomic = data_vt.isFP;
598- }
599- }
592+ multiclass FLAT_Global_Atomic_Pseudo_Helper_NO_RTN<string opName,
593+ RegisterClass vdst_rc,
594+ ValueType vt,
595+ ValueType data_vt = vt,
596+ RegisterClass data_rc = vdst_rc> {
597+ def "" : FLAT_Global_Atomic_Pseudo_NO_RTN<opName, vdst_rc, vt, data_vt, data_rc, 0>;
598+ def _SADDR : FLAT_Global_Atomic_Pseudo_NO_RTN<opName, vdst_rc, vt, data_vt, data_rc, 1>;
600599}
601600
602- multiclass FLAT_Global_Atomic_Pseudo_RTN<
601+ class FLAT_Global_Atomic_Pseudo_RTN<
603602 string opName,
604603 RegisterClass vdst_rc,
605604 ValueType vt,
606605 ValueType data_vt = vt,
607606 RegisterClass data_rc = vdst_rc,
607+ bit EnableSaddr = 0,
608+ RegisterClass VaddrRC = !if(EnableSaddr, VGPR_32, VReg_64),
608609 RegisterOperand data_op = getLdStRegisterOperand<data_rc>.ret,
609- RegisterOperand vdst_op = getLdStRegisterOperand<vdst_rc>.ret> {
610-
611- let is_flat_global = 1 in {
612- def _RTN : FLAT_AtomicRet_Pseudo <opName,
610+ RegisterOperand vdst_op = getLdStRegisterOperand<vdst_rc>.ret> :
611+ FLAT_AtomicRet_Pseudo <opName,
613612 (outs vdst_op:$vdst),
614- (ins VReg_64:$vaddr, data_op:$vdata, flat_offset:$offset, CPol_GLC1:$cpol),
615- " $vdst, $vaddr, $vdata, off$offset$cpol">,
613+ !con((ins VaddrRC:$vaddr, data_op:$vdata), !if(EnableSaddr, (ins SReg_64_XEXEC_XNULL:$saddr), (ins)),
614+ (ins flat_offset:$offset, CPol_GLC1:$cpol)),
615+ " $vdst, $vaddr, $vdata, "#!if(EnableSaddr, "$saddr", "off")#"$offset$cpol">,
616616 GlobalSaddrTable<0, opName#"_rtn"> {
617- let has_saddr = 1;
618- let FPAtomic = data_vt.isFP;
619- }
617+ let has_saddr = 1;
618+ let enabled_saddr = EnableSaddr;
619+ let FPAtomic = data_vt.isFP;
620+ let is_flat_global = 1;
621+ }
620622
621- def _SADDR_RTN : FLAT_AtomicRet_Pseudo <opName,
622- (outs vdst_op:$vdst),
623- (ins VGPR_32:$vaddr, data_op:$vdata, SReg_64_XEXEC_XNULL:$saddr, flat_offset:$offset, CPol_GLC1:$cpol),
624- " $vdst, $vaddr, $vdata, $saddr$offset$cpol">,
625- GlobalSaddrTable<1, opName#"_rtn"> {
626- let has_saddr = 1;
627- let enabled_saddr = 1;
628- let FPAtomic = data_vt.isFP;
629- }
630- }
623+ multiclass FLAT_Global_Atomic_Pseudo_Helper_RTN<string opName,
624+ RegisterClass vdst_rc,
625+ ValueType vt,
626+ ValueType data_vt = vt,
627+ RegisterClass data_rc = vdst_rc> {
628+ def _RTN : FLAT_Global_Atomic_Pseudo_RTN<opName, vdst_rc, vt, data_vt, data_rc, 0>;
629+ def _SADDR_RTN : FLAT_Global_Atomic_Pseudo_RTN<opName, vdst_rc, vt, data_vt, data_rc, 1>;
631630}
632631
633632multiclass FLAT_Global_Atomic_Pseudo<
@@ -636,8 +635,8 @@ multiclass FLAT_Global_Atomic_Pseudo<
636635 ValueType vt,
637636 ValueType data_vt = vt,
638637 RegisterClass data_rc = vdst_rc> {
639- defm "" : FLAT_Global_Atomic_Pseudo_NO_RTN <opName, vdst_rc, vt, data_vt, data_rc>;
640- defm "" : FLAT_Global_Atomic_Pseudo_RTN <opName, vdst_rc, vt, data_vt, data_rc>;
638+ defm "" : FLAT_Global_Atomic_Pseudo_Helper_NO_RTN <opName, vdst_rc, vt, data_vt, data_rc>;
639+ defm "" : FLAT_Global_Atomic_Pseudo_Helper_RTN <opName, vdst_rc, vt, data_vt, data_rc>;
641640}
642641
643642//===----------------------------------------------------------------------===//
@@ -1018,19 +1017,19 @@ let SubtargetPredicate = isGFX10Plus in {
10181017} // End SubtargetPredicate = isGFX10Plus
10191018
10201019let OtherPredicates = [HasAtomicFaddNoRtnInsts] in
1021- defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_NO_RTN <
1020+ defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_Helper_NO_RTN <
10221021 "global_atomic_add_f32", VGPR_32, f32
10231022 >;
10241023let OtherPredicates = [HasAtomicBufferGlobalPkAddF16NoRtnInsts] in
1025- defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_NO_RTN <
1024+ defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_Helper_NO_RTN <
10261025 "global_atomic_pk_add_f16", VGPR_32, v2f16
10271026 >;
10281027let OtherPredicates = [HasAtomicFaddRtnInsts] in
1029- defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_RTN <
1028+ defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_Helper_RTN <
10301029 "global_atomic_add_f32", VGPR_32, f32
10311030 >;
10321031let OtherPredicates = [HasAtomicBufferGlobalPkAddF16Insts] in
1033- defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_RTN <
1032+ defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_Helper_RTN <
10341033 "global_atomic_pk_add_f16", VGPR_32, v2f16
10351034 >;
10361035
0 commit comments