diff options
author | Kenneth Graunke <[email protected]> | 2016-08-17 15:02:59 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2016-08-18 01:27:15 -0700 |
commit | e8543feba790b68edfcacc9554967118029b88f8 (patch) | |
tree | 2cdf51995c65d144eb4c7efd325bc7d058b723d5 /src | |
parent | 241870fe5b91c6efaa77a68dc9ed4a335dc76650 (diff) |
nir/search: Fold src_is_bool()/alu_instr_is_bool() into src_is_type().
I don't want src_is_bool() and src_is_type(x, nir_type_bool) to behave
differently. Having the logic spread out over three functions makes it
harder to decide where to put new logic, as well.
So, combine them all. It's a bit simpler because there's now only one
recursive function rather than a pair of mutually recursive functions.
Signed-off-by: Kenneth Graunke <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/nir/nir_search.c | 50 |
1 files changed, 19 insertions, 31 deletions
diff --git a/src/compiler/nir/nir_search.c b/src/compiler/nir/nir_search.c index bd123126ea0..bfa00c24a41 100644 --- a/src/compiler/nir/nir_search.c +++ b/src/compiler/nir/nir_search.c @@ -42,34 +42,6 @@ match_expression(const nir_search_expression *expr, nir_alu_instr *instr, static const uint8_t identity_swizzle[] = { 0, 1, 2, 3 }; -static bool alu_instr_is_bool(nir_alu_instr *instr); - -static bool -src_is_bool(nir_src src) -{ - if (!src.is_ssa) - return false; - if (src.ssa->parent_instr->type != nir_instr_type_alu) - return false; - return alu_instr_is_bool(nir_instr_as_alu(src.ssa->parent_instr)); -} - -static bool -alu_instr_is_bool(nir_alu_instr *instr) -{ - switch (instr->op) { - case nir_op_iand: - case nir_op_ior: - case nir_op_ixor: - return src_is_bool(instr->src[0].src) && src_is_bool(instr->src[1].src); - case nir_op_inot: - return src_is_bool(instr->src[0].src); - default: - return (nir_alu_type_get_base_type(nir_op_infos[instr->op].output_type) - == nir_type_bool); - } -} - /** * Check if a source produces a value of the given type. * @@ -83,13 +55,29 @@ src_is_type(nir_src src, nir_alu_type type) if (!src.is_ssa) return false; + /* Turn nir_type_bool32 into nir_type_bool...they're the same thing. */ + if (nir_alu_type_get_base_type(type) == nir_type_bool) + type = nir_type_bool; + if (src.ssa->parent_instr->type == nir_instr_type_alu) { nir_alu_instr *src_alu = nir_instr_as_alu(src.ssa->parent_instr); nir_alu_type output_type = nir_op_infos[src_alu->op].output_type; - return nir_alu_type_get_base_type(output_type) == type || - (nir_alu_type_get_base_type(type) == nir_type_bool && - alu_instr_is_bool(src_alu)); + if (type == nir_type_bool) { + switch (src_alu->op) { + case nir_op_iand: + case nir_op_ior: + case nir_op_ixor: + return src_is_type(src_alu->src[0].src, nir_type_bool) && + src_is_type(src_alu->src[1].src, nir_type_bool); + case nir_op_inot: + return src_is_type(src_alu->src[0].src, nir_type_bool); + default: + break; + } + } + + return nir_alu_type_get_base_type(output_type) == type; } /* don't know */ |