diff --git a/llvm/lib/Target/AMDGPU/FLATInstructions.td b/llvm/lib/Target/AMDGPU/FLATInstructions.td index a1306565bbe29..7e5ae25ff30e6 100644 --- a/llvm/lib/Target/AMDGPU/FLATInstructions.td +++ b/llvm/lib/Target/AMDGPU/FLATInstructions.td @@ -228,15 +228,14 @@ class GlobalSaddrTable { // saddr is 32-bit (which isn't handled here yet). class FLAT_Load_Pseudo< string opName, RegisterOperand vdata_op, bit HasTiedOutput = 0, - bit HasSaddr = 0, bit EnableSaddr = 0> + bit HasSaddr = 0, bit EnableSaddr = 0, + RegisterClass VaddrRC = !if(EnableSaddr, VGPR_32, VReg_64)> : FLAT_Pseudo { let OutOperandList = (outs vdata_op:$vdst); let InOperandList = !con( - !if(EnableSaddr, - (ins SReg_64_XEXEC_XNULL:$saddr, VGPR_32:$vaddr), - (ins VReg_64:$vaddr)), - (ins flat_offset:$offset), + !if(EnableSaddr, (ins SReg_64_XEXEC_XNULL:$saddr), (ins)), + (ins VaddrRC:$vaddr, flat_offset:$offset), // FIXME: Operands with default values do not work with following // non-optional operands. !if(HasTiedOutput, (ins CPol:$cpol, vdata_op:$vdst_in), @@ -268,15 +267,13 @@ multiclass FLAT_Flat_Load_Pseudo_t16 { } class FLAT_Store_Pseudo : FLAT_Pseudo< - opName, - (outs), - !con( - !if(EnableSaddr, - (ins VGPR_32:$vaddr, vdataClass:$vdata, SReg_64_XEXEC_XNULL:$saddr), - (ins VReg_64:$vaddr, vdataClass:$vdata)), - (ins flat_offset:$offset, CPol_0:$cpol)), - " $vaddr, $vdata"#!if(HasSaddr, !if(EnableSaddr, ", $saddr", ", off"), "")#"$offset$cpol"> { + bit HasSaddr = 0, bit EnableSaddr = 0, + RegisterClass VaddrRC = !if(EnableSaddr, VGPR_32, VReg_64)> : FLAT_Pseudo { + let InOperandList = !con( + (ins VaddrRC:$vaddr, vdataClass:$vdata), + !if(EnableSaddr, (ins SReg_64_XEXEC_XNULL:$saddr), (ins)), + (ins flat_offset:$offset, CPol_0:$cpol)); + let AsmOperands = " $vaddr, $vdata"#!if(HasSaddr, !if(EnableSaddr, ", $saddr", ", off"), "")#"$offset$cpol"; let mayLoad = 0; let mayStore = 1; let has_vdst = 0; @@ -833,99 +830,83 @@ multiclass FLAT_Atomic_Pseudo< defm "" : FLAT_Atomic_Pseudo_RTN; } -multiclass FLAT_Global_Atomic_Pseudo_NO_RTN< +class FLAT_Global_Atomic_Pseudo_NO_RTN< string opName, RegisterOperand vdst_op, ValueType vt, ValueType data_vt = vt, - RegisterOperand data_op = vdst_op> { - - let is_flat_global = 1 in { - def "" : FLAT_AtomicNoRet_Pseudo , - GlobalSaddrTable<0, opName> { - let has_saddr = 1; - let FPAtomic = data_vt.isFP; - } - - def _SADDR : FLAT_AtomicNoRet_Pseudo , - GlobalSaddrTable<1, opName> { - let has_saddr = 1; - let enabled_saddr = 1; - let FPAtomic = data_vt.isFP; - } - } + RegisterOperand data_op = vdst_op, + bit EnableSaddr = false, + RegisterClass VaddrRC = !if(EnableSaddr, VGPR_32, VReg_64)> + : FLAT_AtomicNoRet_Pseudo, GlobalSaddrTable { + let InOperandList = !con( + (ins VaddrRC:$vaddr, data_op:$vdata), + !if(EnableSaddr, (ins SReg_64_XEXEC_XNULL:$saddr), (ins)), + (ins flat_offset:$offset, CPol_0:$cpol)); + let AsmOperands = " $vaddr, $vdata, "#!if(EnableSaddr, "$saddr", "off")#"$offset$cpol"; + let has_saddr = 1; + let enabled_saddr = EnableSaddr; + let FPAtomic = data_vt.isFP; + let is_flat_global = 1; } -multiclass FLAT_Global_Atomic_Pseudo_RTN< - string opName, +multiclass FLAT_Global_Atomic_Pseudo_Helper_NO_RTN { + def "" : FLAT_Global_Atomic_Pseudo_NO_RTN; + def _SADDR : FLAT_Global_Atomic_Pseudo_NO_RTN; +} - defvar vdst_op_vgpr = getEquivalentVGPROperand.ret; - defvar data_op_vgpr = getEquivalentVGPROperand.ret; - - let is_flat_global = 1 in { - def _RTN : FLAT_AtomicRet_Pseudo , - GlobalSaddrTable<0, opName#"_rtn"> { - let has_saddr = 1; - let FPAtomic = data_vt.isFP; - } +class FLAT_Global_Atomic_Pseudo_RTN< + string opName, + RegisterOperand vdst_op, + ValueType vt, + ValueType data_vt = vt, + RegisterOperand data_op = vdst_op, + bit EnableSaddr = false, + bit IsVGPR = false, + RegisterClass VaddrRC = !if(EnableSaddr, VGPR_32, VReg_64)> + : FLAT_AtomicRet_Pseudo, GlobalSaddrTable { - def _SADDR_RTN : FLAT_AtomicRet_Pseudo , - GlobalSaddrTable<1, opName#"_rtn"> { - let has_saddr = 1; - let enabled_saddr = 1; - let FPAtomic = data_vt.isFP; - } + defvar vdst_rc= !if(IsVGPR, getEquivalentVGPROperand.ret, getEquivalentAGPROperand.ret); + defvar data_rc = !if(IsVGPR, getEquivalentVGPROperand.ret, getEquivalentAGPROperand.ret); - defvar vdst_op_agpr = getEquivalentAGPROperand.ret; - defvar data_op_agpr = getEquivalentAGPROperand.ret; + let OutOperandList = (outs vdst_rc:$vdst); + let InOperandList = !con( + (ins VaddrRC:$vaddr, data_rc:$vdata), + !if(EnableSaddr, (ins SReg_64_XEXEC_XNULL:$saddr), (ins)), + (ins flat_offset:$offset, CPol_GLC1:$cpol)); + let AsmOperands = " $vdst, $vaddr, $vdata, "#!if(EnableSaddr, "$saddr", "off")#"$offset$cpol"; + let has_saddr = 1; + let enabled_saddr = EnableSaddr; + let FPAtomic = data_vt.isFP; + let is_flat_global = 1; +} +multiclass FLAT_Global_Atomic_Pseudo_Helper_RTN { + def _RTN : FLAT_Global_Atomic_Pseudo_RTN; + def _SADDR_RTN : FLAT_Global_Atomic_Pseudo_RTN; let SubtargetPredicate = isGFX90APlus in { - def _RTN_agpr : FLAT_AtomicRet_Pseudo , - GlobalSaddrTable<0, opName#"_rtn_agpr"> { - let has_saddr = 1; - let FPAtomic = data_vt.isFP; - } - - def _SADDR_RTN_agpr : FLAT_AtomicRet_Pseudo , - GlobalSaddrTable<1, opName#"_rtn_agpr"> { - let has_saddr = 1; - let enabled_saddr = 1; - let FPAtomic = data_vt.isFP; - } - } + def _RTN_agpr : FLAT_Global_Atomic_Pseudo_RTN; + def _SADDR_RTN_agpr : FLAT_Global_Atomic_Pseudo_RTN; } } + multiclass FLAT_Global_Atomic_Pseudo< string opName, RegisterOperand vdst_rc, ValueType vt, ValueType data_vt = vt, RegisterOperand data_rc = vdst_rc> { - defm "" : FLAT_Global_Atomic_Pseudo_NO_RTN; - defm "" : FLAT_Global_Atomic_Pseudo_RTN; + defm "" : FLAT_Global_Atomic_Pseudo_Helper_NO_RTN; + defm "" : FLAT_Global_Atomic_Pseudo_Helper_RTN; } //===----------------------------------------------------------------------===// @@ -1356,19 +1337,19 @@ let SubtargetPredicate = isGFX10Plus in { } // End SubtargetPredicate = isGFX10Plus let SubtargetPredicate = HasAtomicFaddNoRtnInsts in - defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_NO_RTN < + defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_Helper_NO_RTN < "global_atomic_add_f32", AVLdSt_32, f32 >; let SubtargetPredicate = HasAtomicBufferGlobalPkAddF16NoRtnInsts in - defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_NO_RTN < + defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_Helper_NO_RTN < "global_atomic_pk_add_f16", AVLdSt_32, v2f16 >; let SubtargetPredicate = HasAtomicFaddRtnInsts in - defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_RTN < + defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_Helper_RTN < "global_atomic_add_f32", AVLdSt_32, f32 >; let SubtargetPredicate = HasAtomicBufferGlobalPkAddF16Insts in - defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_RTN < + defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_Helper_RTN < "global_atomic_pk_add_f16", AVLdSt_32, v2f16 >;