Module: Mesa
Branch: main
Commit: 387e698bde75b3f6ae7475d3f79e161d47d4b689
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=387e698bde75b3f6ae7475d3f79e161d47d4b689

Author: Connor Abbott <[email protected]>
Date:   Mon Feb  4 12:48:49 2019 +0100

amd: Implement quad_vote intrinsics

Co-authored-by: Daniel Schürmann <[email protected]>
Reviewed-by: Georg Lehmann <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/218>

---

 src/amd/compiler/aco_instruction_selection.cpp | 16 ++++++++++++++++
 src/amd/llvm/ac_nir_to_llvm.c                  |  9 +++++++++
 2 files changed, 25 insertions(+)

diff --git a/src/amd/compiler/aco_instruction_selection.cpp 
b/src/amd/compiler/aco_instruction_selection.cpp
index 72d51ac4351..0f2c632a501 100644
--- a/src/amd/compiler/aco_instruction_selection.cpp
+++ b/src/amd/compiler/aco_instruction_selection.cpp
@@ -8580,6 +8580,22 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* 
instr)
       set_wqm(ctx);
       break;
    }
+   case nir_intrinsic_quad_vote_any: {
+      Temp src = get_ssa_temp(ctx, instr->src[0].ssa);
+      src = bld.sop2(Builder::s_and, bld.def(bld.lm), bld.def(s1, scc), src, 
Operand(exec, bld.lm));
+      bld.sop1(Builder::s_wqm, Definition(get_ssa_temp(ctx, &instr->def)), 
bld.def(s1, scc), src);
+      set_wqm(ctx, true);
+      break;
+   }
+   case nir_intrinsic_quad_vote_all: {
+      Temp src = get_ssa_temp(ctx, instr->src[0].ssa);
+      src = bld.sop1(Builder::s_not, bld.def(bld.lm), bld.def(s1, scc), src);
+      src = bld.sop2(Builder::s_and, bld.def(bld.lm), bld.def(s1, scc), src, 
Operand(exec, bld.lm));
+      src = bld.sop1(Builder::s_wqm, bld.def(bld.lm), bld.def(s1, scc), src);
+      bld.sop1(Builder::s_not, Definition(get_ssa_temp(ctx, &instr->def)), 
bld.def(s1, scc), src);
+      set_wqm(ctx, true);
+      break;
+   }
    case nir_intrinsic_reduce:
    case nir_intrinsic_inclusive_scan:
    case nir_intrinsic_exclusive_scan: {
diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c
index 701d17184d7..28cd089b515 100644
--- a/src/amd/llvm/ac_nir_to_llvm.c
+++ b/src/amd/llvm/ac_nir_to_llvm.c
@@ -3374,6 +3374,15 @@ static bool visit_intrinsic(struct ac_nir_context *ctx, 
nir_intrinsic_instr *ins
       result = ac_build_vote_any(&ctx->ac, get_src(ctx, instr->src[0]));
       break;
    }
+   case nir_intrinsic_quad_vote_any: {
+      result = ac_build_wqm_vote(&ctx->ac, get_src(ctx, instr->src[0]));
+      break;
+   }
+   case nir_intrinsic_quad_vote_all: {
+      LLVMValueRef src = LLVMBuildNot(ctx->ac.builder, get_src(ctx, 
instr->src[0]), "");
+      result = LLVMBuildNot(ctx->ac.builder, ac_build_wqm_vote(&ctx->ac, src), 
"");
+      break;
+   }
    case nir_intrinsic_shuffle:
       if (ctx->ac.gfx_level == GFX8 || ctx->ac.gfx_level == GFX9 ||
           (ctx->ac.gfx_level >= GFX10 && ctx->ac.wave_size == 32)) {

Reply via email to