ac/llvm: add AC_WAIT_EXP for ac_build_waitcnt
Reviewed-by: Mihai Preda <mhpreda@gmail.com> Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15966>
This commit is contained in:
@@ -2461,10 +2461,13 @@ void ac_build_waitcnt(struct ac_llvm_context *ctx, unsigned wait_flags)
|
|||||||
if (!wait_flags)
|
if (!wait_flags)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
unsigned expcnt = 7;
|
||||||
unsigned lgkmcnt = 63;
|
unsigned lgkmcnt = 63;
|
||||||
unsigned vmcnt = ctx->chip_class >= GFX9 ? 63 : 15;
|
unsigned vmcnt = ctx->chip_class >= GFX9 ? 63 : 15;
|
||||||
unsigned vscnt = 63;
|
unsigned vscnt = 63;
|
||||||
|
|
||||||
|
if (wait_flags & AC_WAIT_EXP)
|
||||||
|
expcnt = 0;
|
||||||
if (wait_flags & AC_WAIT_LGKM)
|
if (wait_flags & AC_WAIT_LGKM)
|
||||||
lgkmcnt = 0;
|
lgkmcnt = 0;
|
||||||
if (wait_flags & AC_WAIT_VLOAD)
|
if (wait_flags & AC_WAIT_VLOAD)
|
||||||
@@ -2480,12 +2483,12 @@ void ac_build_waitcnt(struct ac_llvm_context *ctx, unsigned wait_flags)
|
|||||||
/* There is no intrinsic for vscnt(0), so use a fence. */
|
/* There is no intrinsic for vscnt(0), so use a fence. */
|
||||||
if ((wait_flags & AC_WAIT_LGKM && wait_flags & AC_WAIT_VLOAD && wait_flags & AC_WAIT_VSTORE) ||
|
if ((wait_flags & AC_WAIT_LGKM && wait_flags & AC_WAIT_VLOAD && wait_flags & AC_WAIT_VSTORE) ||
|
||||||
vscnt == 0) {
|
vscnt == 0) {
|
||||||
|
assert(!(wait_flags & AC_WAIT_EXP));
|
||||||
LLVMBuildFence(ctx->builder, LLVMAtomicOrderingRelease, false, "");
|
LLVMBuildFence(ctx->builder, LLVMAtomicOrderingRelease, false, "");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned simm16 = (lgkmcnt << 8) | (7 << 4) | /* expcnt */
|
unsigned simm16 = (lgkmcnt << 8) | (expcnt << 4) | (vmcnt & 0xf) | ((vmcnt >> 4) << 14);
|
||||||
(vmcnt & 0xf) | ((vmcnt >> 4) << 14);
|
|
||||||
|
|
||||||
LLVMValueRef args[1] = {
|
LLVMValueRef args[1] = {
|
||||||
LLVMConstInt(ctx->i32, simm16, false),
|
LLVMConstInt(ctx->i32, simm16, false),
|
||||||
|
@@ -52,6 +52,7 @@ enum
|
|||||||
#define AC_WAIT_LGKM (1 << 0) /* LDS, GDS, constant, message */
|
#define AC_WAIT_LGKM (1 << 0) /* LDS, GDS, constant, message */
|
||||||
#define AC_WAIT_VLOAD (1 << 1) /* VMEM load/sample instructions */
|
#define AC_WAIT_VLOAD (1 << 1) /* VMEM load/sample instructions */
|
||||||
#define AC_WAIT_VSTORE (1 << 2) /* VMEM store instructions */
|
#define AC_WAIT_VSTORE (1 << 2) /* VMEM store instructions */
|
||||||
|
#define AC_WAIT_EXP (1 << 3) /* EXP instructions */
|
||||||
|
|
||||||
struct ac_llvm_flow;
|
struct ac_llvm_flow;
|
||||||
struct ac_llvm_compiler;
|
struct ac_llvm_compiler;
|
||||||
|
Reference in New Issue
Block a user