diff options
author | Jason Ekstrand <[email protected]> | 2017-08-28 17:33:33 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2018-03-07 12:13:47 -0800 |
commit | 44681e47955687d5590779fdc44373d3fb204fdc (patch) | |
tree | 147add39a1abf8411c643b306e510fb71f14624c /src/compiler/nir | |
parent | 9812fce60b6ffbcd136b66bfb609143449ad3f7c (diff) |
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 <[email protected]>
Diffstat (limited to 'src/compiler/nir')
-rw-r--r-- | src/compiler/nir/nir_intrinsics.h | 3 | ||||
-rw-r--r-- | src/compiler/nir/nir_lower_subgroups.c | 3 | ||||
-rw-r--r-- | src/compiler/nir/nir_opt_intrinsics.c | 3 |
3 files changed, 6 insertions, 3 deletions
diff --git a/src/compiler/nir/nir_intrinsics.h b/src/compiler/nir/nir_intrinsics.h index 46f67a908ed..7543d83e786 100644 --- a/src/compiler/nir/nir_intrinsics.h +++ b/src/compiler/nir/nir_intrinsics.h @@ -135,7 +135,8 @@ INTRINSIC(discard_if, 1, ARR(1), false, 0, 0, 0, xx, xx, xx, 0) /** ARB_shader_group_vote intrinsics */ 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_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. * diff --git a/src/compiler/nir/nir_lower_subgroups.c b/src/compiler/nir/nir_lower_subgroups.c index e45a7d723ac..3753b5e6427 100644 --- a/src/compiler/nir/nir_lower_subgroups.c +++ b/src/compiler/nir/nir_lower_subgroups.c @@ -121,7 +121,8 @@ lower_subgroups_intrin(nir_builder *b, nir_intrinsic_instr *intrin, return nir_ssa_for_src(b, intrin->src[0], 1); break; - case nir_intrinsic_vote_eq: + case nir_intrinsic_vote_feq: + case nir_intrinsic_vote_ieq: if (options->lower_vote_trivial) return nir_imm_int(b, NIR_TRUE); break; diff --git a/src/compiler/nir/nir_opt_intrinsics.c b/src/compiler/nir/nir_opt_intrinsics.c index eb394af0c10..37f08c77ef1 100644 --- a/src/compiler/nir/nir_opt_intrinsics.c +++ b/src/compiler/nir/nir_opt_intrinsics.c @@ -50,7 +50,8 @@ opt_intrinsics_impl(nir_function_impl *impl) if (nir_src_as_const_value(intrin->src[0])) replacement = nir_ssa_for_src(&b, intrin->src[0], 1); 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])) replacement = nir_imm_int(&b, NIR_TRUE); break; |