ac/llvm: add AC_WAIT_EXP for ac_build_waitcnt
authorMarek Olšák <marek.olsak@amd.com>
Tue, 22 Mar 2022 13:02:14 +0000 (09:02 -0400)
committerMarge Bot <emma+marge@anholt.net>
Sat, 23 Apr 2022 01:45:17 +0000 (01:45 +0000)
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>

src/amd/llvm/ac_llvm_build.c
src/amd/llvm/ac_llvm_build.h

index aae410d..8fb33d7 100644 (file)
@@ -2461,10 +2461,13 @@ void ac_build_waitcnt(struct ac_llvm_context *ctx, unsigned wait_flags)
    if (!wait_flags)
       return;
 
+   unsigned expcnt = 7;
    unsigned lgkmcnt = 63;
    unsigned vmcnt = ctx->chip_class >= GFX9 ? 63 : 15;
    unsigned vscnt = 63;
 
+   if (wait_flags & AC_WAIT_EXP)
+      expcnt = 0;
    if (wait_flags & AC_WAIT_LGKM)
       lgkmcnt = 0;
    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. */
    if ((wait_flags & AC_WAIT_LGKM && wait_flags & AC_WAIT_VLOAD && wait_flags & AC_WAIT_VSTORE) ||
        vscnt == 0) {
+      assert(!(wait_flags & AC_WAIT_EXP));
       LLVMBuildFence(ctx->builder, LLVMAtomicOrderingRelease, false, "");
       return;
    }
 
-   unsigned simm16 = (lgkmcnt << 8) | (7 << 4) | /* expcnt */
-                     (vmcnt & 0xf) | ((vmcnt >> 4) << 14);
+   unsigned simm16 = (lgkmcnt << 8) | (expcnt << 4) | (vmcnt & 0xf) | ((vmcnt >> 4) << 14);
 
    LLVMValueRef args[1] = {
       LLVMConstInt(ctx->i32, simm16, false),
index 42928a4..51c7046 100644 (file)
@@ -52,6 +52,7 @@ enum
 #define AC_WAIT_LGKM   (1 << 0) /* LDS, GDS, constant, message */
 #define AC_WAIT_VLOAD  (1 << 1) /* VMEM load/sample 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_compiler;