diff options
author | Marek Olšák <[email protected]> | 2019-06-24 16:13:24 -0400 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2019-07-03 15:51:13 -0400 |
commit | 969e5176c23252b92fbeca0dc4109a1b06de06c5 (patch) | |
tree | 65deab045607a76765626f430e9aa18c3b997afd /src/amd/common/ac_llvm_build.c | |
parent | 214ddfb6884879a73168b55c306680c7d49d19f5 (diff) |
ac: rework ac_build_waitcnt for gfx10
Acked-by: Bas Nieuwenhuizen <[email protected]>
Diffstat (limited to 'src/amd/common/ac_llvm_build.c')
-rw-r--r-- | src/amd/common/ac_llvm_build.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index eb71a69eebd..4c48fe1d1d7 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -2882,13 +2882,49 @@ LLVMValueRef ac_build_fmad(struct ac_llvm_context *ctx, LLVMValueRef s0, LLVMBuildFMul(ctx->builder, s0, s1, ""), s2, ""); } -void ac_build_waitcnt(struct ac_llvm_context *ctx, unsigned simm16) +void ac_build_waitcnt(struct ac_llvm_context *ctx, unsigned wait_flags) { + if (!wait_flags) + return; + + unsigned lgkmcnt = 63; + unsigned expcnt = 7; + unsigned vmcnt = ctx->chip_class >= GFX9 ? 63 : 15; + unsigned vscnt = 63; + + if (wait_flags & AC_WAIT_LGKM) + lgkmcnt = 0; + if (wait_flags & AC_WAIT_EXP) + expcnt = 0; + if (wait_flags & AC_WAIT_VLOAD) + vmcnt = 0; + + if (wait_flags & AC_WAIT_VSTORE) { + if (ctx->chip_class >= GFX10) + vscnt = 0; + else + vmcnt = 0; + } + + unsigned simm16 = (lgkmcnt << 8) | + (expcnt << 4) | + (vmcnt & 0xf) | + ((vmcnt >> 4) << 14); + LLVMValueRef args[1] = { LLVMConstInt(ctx->i32, simm16, false), }; ac_build_intrinsic(ctx, "llvm.amdgcn.s.waitcnt", ctx->voidt, args, 1, 0); + + /* TODO: add llvm.amdgcn.s.waitcnt.vscnt into LLVM: */ + if (0 && ctx->chip_class >= GFX10 && vscnt == 0) { + LLVMValueRef args[1] = { + LLVMConstInt(ctx->i32, vscnt, false), + }; + ac_build_intrinsic(ctx, "llvm.amdgcn.s.waitcnt.vscnt", + ctx->voidt, args, 1, 0); + } } LLVMValueRef ac_build_fmed3(struct ac_llvm_context *ctx, LLVMValueRef src0, |