X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fnir%2Fnir_search.h;h=c5d7ba3895ea60fdd48bbf61d8ef6d4326dc235c;hb=3cc914921e69b4458d4480a64aafe0f2823c76e2;hp=526a498cd47e1a814a1f8196e3af9b1f11e9e872;hpb=7ce86e69381ebbff495f6a3f6fd716f58df9bd10;p=mesa.git diff --git a/src/compiler/nir/nir_search.h b/src/compiler/nir/nir_search.h index 526a498cd47..c5d7ba3895e 100644 --- a/src/compiler/nir/nir_search.h +++ b/src/compiler/nir/nir_search.h @@ -93,8 +93,11 @@ typedef struct { * variables to require, for example, power-of-two in order for the search * to match. */ - bool (*cond)(nir_alu_instr *instr, unsigned src, + bool (*cond)(struct hash_table *range_ht, nir_alu_instr *instr, unsigned src, unsigned num_components, const uint8_t *swizzle); + + /** Swizzle (for replace only) */ + uint8_t swizzle[NIR_MAX_VEC_COMPONENTS]; } nir_search_variable; typedef struct { @@ -160,6 +163,25 @@ typedef struct { bool (*cond)(nir_alu_instr *instr); } nir_search_expression; +struct per_op_table { + const uint16_t *filter; + unsigned num_filtered_states; + const uint16_t *table; +}; + +struct transform { + const nir_search_expression *search; + const nir_search_value *replace; + unsigned condition_offset; +}; + +/* Note: these must match the start states created in + * TreeAutomaton._build_table() + */ + +/* WILDCARD_STATE = 0 is set by zeroing the state array */ +static const uint16_t CONST_STATE = 1; + NIR_DEFINE_CAST(nir_search_value_as_variable, nir_search_value, nir_search_variable, value, type, nir_search_value_variable) @@ -172,7 +194,14 @@ NIR_DEFINE_CAST(nir_search_value_as_expression, nir_search_value, nir_ssa_def * nir_replace_instr(struct nir_builder *b, nir_alu_instr *instr, + struct hash_table *range_ht, const nir_search_expression *search, const nir_search_value *replace); +bool +nir_algebraic_impl(nir_function_impl *impl, + const bool *condition_flags, + const struct transform **transforms, + const uint16_t *transform_counts, + const struct per_op_table *pass_op_table); #endif /* _NIR_SEARCH_ */