From 387e698bde75b3f6ae7475d3f79e161d47d4b689 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Mon, 4 Feb 2019 12:48:49 +0100 Subject: [PATCH] amd: Implement quad_vote intrinsics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Daniel Schürmann Reviewed-by: Georg Lehmann Part-of: --- 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)) {