nir: Generalize nir_intrinsic_vote_eq

The SPIR-V extension wants us to be able to do an AllEqual on any vector
or scalar type.  This has two implications:

 1) We need to be able to handle vectors so we switch the vote_eq
    intrinsics to be vectorized intrinsics.

 2) We need to handle floats which have different behavior with respect
    to +-0, NaN, etc. than the integer variant so we need two variants.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
Jason Ekstrand
2017-08-28 17:33:33 -07:00
parent 9812fce60b
commit 44681e4795
6 changed files with 11 additions and 7 deletions

View File

@@ -4563,7 +4563,7 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
result = LLVMBuildSExt(ctx->ac.builder, tmp, ctx->ac.i32, ""); result = LLVMBuildSExt(ctx->ac.builder, tmp, ctx->ac.i32, "");
break; break;
} }
case nir_intrinsic_vote_eq: { case nir_intrinsic_vote_ieq: {
LLVMValueRef tmp = ac_build_vote_eq(&ctx->ac, get_src(ctx, instr->src[0])); LLVMValueRef tmp = ac_build_vote_eq(&ctx->ac, get_src(ctx, instr->src[0]));
result = LLVMBuildSExt(ctx->ac.builder, tmp, ctx->ac.i32, ""); result = LLVMBuildSExt(ctx->ac.builder, tmp, ctx->ac.i32, "");
break; break;

View File

@@ -814,7 +814,7 @@ nir_visitor::visit(ir_call *ir)
op = nir_intrinsic_vote_all; op = nir_intrinsic_vote_all;
break; break;
case ir_intrinsic_vote_eq: case ir_intrinsic_vote_eq:
op = nir_intrinsic_vote_eq; op = nir_intrinsic_vote_ieq;
break; break;
case ir_intrinsic_ballot: case ir_intrinsic_ballot:
op = nir_intrinsic_ballot; op = nir_intrinsic_ballot;
@@ -1163,8 +1163,9 @@ nir_visitor::visit(ir_call *ir)
} }
case nir_intrinsic_vote_any: case nir_intrinsic_vote_any:
case nir_intrinsic_vote_all: case nir_intrinsic_vote_all:
case nir_intrinsic_vote_eq: { case nir_intrinsic_vote_ieq: {
nir_ssa_dest_init(&instr->instr, &instr->dest, 1, 32, NULL); nir_ssa_dest_init(&instr->instr, &instr->dest, 1, 32, NULL);
instr->num_components = 1;
ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head(); ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
instr->src[0] = nir_src_for_ssa(evaluate_rvalue(value)); instr->src[0] = nir_src_for_ssa(evaluate_rvalue(value));

View File

@@ -135,7 +135,8 @@ INTRINSIC(discard_if, 1, ARR(1), false, 0, 0, 0, xx, xx, xx, 0)
/** ARB_shader_group_vote intrinsics */ /** ARB_shader_group_vote intrinsics */
INTRINSIC(vote_any, 1, ARR(1), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE) INTRINSIC(vote_any, 1, ARR(1), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE)
INTRINSIC(vote_all, 1, ARR(1), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE) INTRINSIC(vote_all, 1, ARR(1), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE)
INTRINSIC(vote_eq, 1, ARR(1), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE) INTRINSIC(vote_feq, 1, ARR(0), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE)
INTRINSIC(vote_ieq, 1, ARR(0), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE)
/** Ballot ALU operations from SPIR-V. /** Ballot ALU operations from SPIR-V.
* *

View File

@@ -121,7 +121,8 @@ lower_subgroups_intrin(nir_builder *b, nir_intrinsic_instr *intrin,
return nir_ssa_for_src(b, intrin->src[0], 1); return nir_ssa_for_src(b, intrin->src[0], 1);
break; break;
case nir_intrinsic_vote_eq: case nir_intrinsic_vote_feq:
case nir_intrinsic_vote_ieq:
if (options->lower_vote_trivial) if (options->lower_vote_trivial)
return nir_imm_int(b, NIR_TRUE); return nir_imm_int(b, NIR_TRUE);
break; break;

View File

@@ -50,7 +50,8 @@ opt_intrinsics_impl(nir_function_impl *impl)
if (nir_src_as_const_value(intrin->src[0])) if (nir_src_as_const_value(intrin->src[0]))
replacement = nir_ssa_for_src(&b, intrin->src[0], 1); replacement = nir_ssa_for_src(&b, intrin->src[0], 1);
break; break;
case nir_intrinsic_vote_eq: case nir_intrinsic_vote_feq:
case nir_intrinsic_vote_ieq:
if (nir_src_as_const_value(intrin->src[0])) if (nir_src_as_const_value(intrin->src[0]))
replacement = nir_imm_int(&b, NIR_TRUE); replacement = nir_imm_int(&b, NIR_TRUE);
break; break;

View File

@@ -4423,7 +4423,7 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
bld.MOV(retype(dest, BRW_REGISTER_TYPE_D), component(res1, 0)); bld.MOV(retype(dest, BRW_REGISTER_TYPE_D), component(res1, 0));
break; break;
} }
case nir_intrinsic_vote_eq: { case nir_intrinsic_vote_ieq: {
fs_reg value = get_nir_src(instr->src[0]); fs_reg value = get_nir_src(instr->src[0]);
fs_reg uniformized = bld.emit_uniformize(value); fs_reg uniformized = bld.emit_uniformize(value);
const fs_builder ubld = bld.exec_all().group(1, 0); const fs_builder ubld = bld.exec_all().group(1, 0);