let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
let mayLoad = 1;
let mayStore = 0;
+ let maybeAtomic = 1;
}
// FIXME: tfe can't be an operand because it requires a separate
let PseudoInstr = opName # "_" # getAddrName<addrKindCopy>.ret;
let mayLoad = 0;
let mayStore = 1;
+ let maybeAtomic = 1;
}
multiclass MUBUF_Pseudo_Stores<string opName, RegisterClass vdataClass,
let DisableWQM = 1;
let has_glc = 0;
let has_tfe = 0;
+ let maybeAtomic = 1;
}
class MUBUF_AtomicNoRet_Pseudo<string opName, int addrKind,
let has_saddr = HasSaddr;
let enabled_saddr = EnableSaddr;
let PseudoInstr = opName#!if(!and(HasSaddr, EnableSaddr), "_SADDR", "");
+ let maybeAtomic = 1;
}
class FLAT_Store_Pseudo <string opName, RegisterClass vdataClass,
let has_saddr = HasSaddr;
let enabled_saddr = EnableSaddr;
let PseudoInstr = opName#!if(!and(HasSaddr, EnableSaddr), "_SADDR", "");
+ let maybeAtomic = 1;
}
multiclass FLAT_Global_Load_Pseudo<string opName, RegisterClass regClass> {
let enabled_saddr = EnableSaddr;
let has_vaddr = !if(EnableSaddr, 0, 1);
let PseudoInstr = opName#!if(EnableSaddr, "_SADDR", "");
+ let maybeAtomic = 1;
}
class FLAT_Scratch_Store_Pseudo <string opName, RegisterClass vdataClass, bit EnableSaddr = 0> : FLAT_Pseudo<
let has_saddr = 1;
let enabled_saddr = EnableSaddr;
let has_vaddr = !if(EnableSaddr, 0, 1);
-
let PseudoInstr = opName#!if(EnableSaddr, "_SADDR", "");
+ let maybeAtomic = 1;
}
multiclass FLAT_Scratch_Load_Pseudo<string opName, RegisterClass regClass> {
let has_glc = 0;
let glcValue = 0;
let has_vdst = 0;
+ let maybeAtomic = 1;
}
class FLAT_AtomicRet_Pseudo<string opName, dag outs, dag ins,
FIXED_SIZE = UINT64_C(1) << 40,
VOPAsmPrefer32Bit = UINT64_C(1) << 41,
HasFPClamp = UINT64_C(1) << 42,
- VOP3_OPSEL = UINT64_C(1) << 43
+ VOP3_OPSEL = UINT64_C(1) << 43,
+ maybeAtomic = UINT64_C(1) << 44
};
// v_cmp_class_* etc. use a 10-bit mask for what operation is checked.
field bit FLAT = 0;
field bit DS = 0;
- // Pseudo instruction formats.
+ // Pseudo instruction formats.
field bit VGPRSpill = 0;
field bit SGPRSpill = 0;
// modifier (gfx9 only).
field bit VOP3_OPSEL = 0;
+ // Is it possible for this instruction to be atomic?
+ field bit maybeAtomic = 0;
+
// These need to be kept in sync with the enum in SIInstrFlags.
let TSFlags{0} = SALU;
let TSFlags{1} = VALU;
let TSFlags{42} = FPClamp;
let TSFlags{43} = VOP3_OPSEL;
+ let TSFlags{44} = maybeAtomic;
+
let SchedRW = [Write32Bit];
field bits<1> DisableSIDecoder = 0;
[(atomic_fence (i32 imm:$ordering), (i32 imm:$scope))],
"ATOMIC_FENCE $ordering, $scope"> {
let hasSideEffects = 1;
+ let maybeAtomic = 1;
}
let hasSideEffects = 0, mayLoad = 0, mayStore = 0, Uses = [EXEC] in {