From a3e777a89a241a363b8ba41d8867b58ac2a1baeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Tue, 22 Mar 2022 09:02:14 -0400 Subject: [PATCH] ac/llvm: add AC_WAIT_EXP for ac_build_waitcnt Reviewed-by: Mihai Preda Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/amd/llvm/ac_llvm_build.c | 7 +++++-- src/amd/llvm/ac_llvm_build.h | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/amd/llvm/ac_llvm_build.c b/src/amd/llvm/ac_llvm_build.c index aae410de3da..8fb33d72259 100644 --- a/src/amd/llvm/ac_llvm_build.c +++ b/src/amd/llvm/ac_llvm_build.c @@ -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), diff --git a/src/amd/llvm/ac_llvm_build.h b/src/amd/llvm/ac_llvm_build.h index 42928a4e66b..51c70469427 100644 --- a/src/amd/llvm/ac_llvm_build.h +++ b/src/amd/llvm/ac_llvm_build.h @@ -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;