@@ -137,7 +137,18 @@ class FLAT_Real <bits<7> op, FLAT_Pseudo ps, string opName = ps.Mnemonic> :
137137 // unsigned for flat accesses.
138138 bits<13> offset;
139139 // GFX90A+ only: instruction uses AccVGPR for data
140- bits<1> acc = !if(ps.has_vdst, vdst{9}, !if(ps.has_data, vdata{9}, 0));
140+ defvar DstOpIsAV = !if(ps.has_vdst,
141+ VDstOperandIsAV<ps.OutOperandList>.ret, 0);
142+ defvar DstOpIsAGPR = !if(ps.has_vdst,
143+ VDstOperandIsAGPR<ps.OutOperandList>.ret, 0);
144+ defvar DataOpIsAV = !if(ps.has_data,
145+ VDataOperandIsAV<ps.InOperandList>.ret, 0);
146+ defvar DataOpIsAGPR = !if(ps.has_data,
147+ VDataOperandIsAGPR<ps.InOperandList>.ret, 0);
148+
149+ bits<1> acc = !if(ps.has_vdst,
150+ !if(DstOpIsAV, vdst{9}, DstOpIsAGPR),
151+ !if(DataOpIsAV, vdata{9}, DataOpIsAGPR));
141152
142153 // We don't use tfe right now, and it was removed in gfx9.
143154 bits<1> tfe = 0;
@@ -860,6 +871,30 @@ multiclass FLAT_Global_Atomic_Pseudo_RTN<
860871 let enabled_saddr = 1;
861872 let FPAtomic = data_vt.isFP;
862873 }
874+
875+ defvar vdst_op_agpr = getEquivalentAGPROperand<vdst_op>.ret;
876+ defvar data_op_agpr = getEquivalentAGPROperand<data_op>.ret;
877+
878+ let SubtargetPredicate = isGFX90APlus in {
879+ def _RTN_agpr : FLAT_AtomicRet_Pseudo <opName,
880+ (outs vdst_op_agpr:$vdst),
881+ (ins VReg_64:$vaddr, data_op_agpr:$vdata, flat_offset:$offset, CPol_GLC1:$cpol),
882+ " $vdst, $vaddr, $vdata, off$offset$cpol">,
883+ GlobalSaddrTable<0, opName#"_rtn_agpr"> {
884+ let has_saddr = 1;
885+ let FPAtomic = data_vt.isFP;
886+ }
887+
888+ def _SADDR_RTN_agpr : FLAT_AtomicRet_Pseudo <opName,
889+ (outs vdst_op_agpr:$vdst),
890+ (ins VGPR_32:$vaddr, data_op_agpr:$vdata, SReg_64_XEXEC_XNULL:$saddr, flat_offset:$offset, CPol_GLC1:$cpol),
891+ " $vdst, $vaddr, $vdata, $saddr$offset$cpol">,
892+ GlobalSaddrTable<1, opName#"_rtn_agpr"> {
893+ let has_saddr = 1;
894+ let enabled_saddr = 1;
895+ let FPAtomic = data_vt.isFP;
896+ }
897+ }
863898 }
864899}
865900
@@ -2637,8 +2672,10 @@ multiclass FLAT_Global_Real_Atomics_vi<bits<7> op,
26372672 FLAT_Real_AllAddr_vi<op, has_sccb> {
26382673 def _RTN_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_RTN"), has_sccb>;
26392674 def _SADDR_RTN_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_SADDR_RTN"), has_sccb>;
2640- }
26412675
2676+ def _RTN_agpr_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_RTN_agpr"), has_sccb>;
2677+ def _SADDR_RTN_agpr_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_SADDR_RTN_agpr"), has_sccb>;
2678+ }
26422679
26432680defm FLAT_ATOMIC_SWAP : FLAT_Real_Atomics_vi <0x40>;
26442681defm FLAT_ATOMIC_CMPSWAP : FLAT_Real_Atomics_vi <0x41>;
0 commit comments