* never match anything.
*/
nir_alu_type type;
+
+ /** Optional condition fxn ptr
+ *
+ * This is only allowed in search expressions, and allows additional
+ * constraints to be placed on the match. Typically used for 'is_constant'
+ * variables to require, for example, power-of-two in order for the search
+ * to match.
+ */
+ bool (*cond)(nir_alu_instr *instr, unsigned src,
+ unsigned num_components, const uint8_t *swizzle);
} nir_search_variable;
typedef struct {
nir_op opcode;
const nir_search_value *srcs[4];
+
+ /** Optional condition fxn ptr
+ *
+ * This allows additional constraints on expression matching, it is
+ * typically used to match an expressions uses such as the number of times
+ * the expression is used, and whether its used by an if.
+ */
+ bool (*cond)(nir_alu_instr *instr);
} nir_search_expression;
NIR_DEFINE_CAST(nir_search_value_as_variable, nir_search_value,
- nir_search_variable, value)
+ nir_search_variable, value,
+ type, nir_search_value_variable)
NIR_DEFINE_CAST(nir_search_value_as_constant, nir_search_value,
- nir_search_constant, value)
+ nir_search_constant, value,
+ type, nir_search_value_constant)
NIR_DEFINE_CAST(nir_search_value_as_expression, nir_search_value,
- nir_search_expression, value)
+ nir_search_expression, value,
+ type, nir_search_value_expression)
nir_alu_instr *
nir_replace_instr(nir_alu_instr *instr, const nir_search_expression *search,