#include "ir_expression_flattening.h"
#include "glsl_types.h"
+namespace {
+
class ir_mat_op_to_vec_visitor : public ir_hierarchical_visitor {
public:
ir_mat_op_to_vec_visitor()
bool made_progress;
};
+} /* anonymous namespace */
+
static bool
mat_op_to_vec_predicate(ir_instruction *ir)
{
ir_dereference *a,
ir_dereference *b)
{
- int b_col, i;
+ unsigned b_col, i;
ir_assignment *assign;
ir_expression *expr;
mul_expr);
}
- assign = new(mem_ctx) ir_assignment(get_column(result, b_col),
- expr,
- NULL);
+ assign = new(mem_ctx) ir_assignment(get_column(result, b_col), expr);
base_ir->insert_before(assign);
}
}
ir_dereference *a,
ir_dereference *b)
{
- int i;
+ unsigned i;
ir_assignment *assign;
ir_expression *expr;
}
result = result->clone(mem_ctx, NULL);
- assign = new(mem_ctx) ir_assignment(result,
- expr,
- NULL);
+ assign = new(mem_ctx) ir_assignment(result, expr);
base_ir->insert_before(assign);
}
ir_dereference *a,
ir_dereference *b)
{
- int i;
+ unsigned i;
for (i = 0; i < b->type->matrix_columns; i++) {
ir_rvalue *column_result;
get_column(b, i));
column_assign = new(mem_ctx) ir_assignment(column_result,
- column_expr,
- NULL);
+ column_expr);
base_ir->insert_before(column_assign);
}
}
ir_dereference *a,
ir_dereference *b)
{
- int i;
+ unsigned i;
for (i = 0; i < a->type->matrix_columns; i++) {
ir_expression *column_expr;
b->clone(mem_ctx, NULL));
column_assign = new(mem_ctx) ir_assignment(get_column(result, i),
- column_expr,
- NULL);
+ column_expr);
base_ir->insert_before(column_assign);
}
}
any = new(this->mem_ctx) ir_expression(ir_unop_logic_not, any);
ir_assignment *const assign =
- new(mem_ctx) ir_assignment(result->clone(mem_ctx, NULL), any, NULL);
+ new(mem_ctx) ir_assignment(result->clone(mem_ctx, NULL), any);
base_ir->insert_before(assign);
}
*/
for (i = 0; i < orig_expr->get_num_operands(); i++) {
ir_assignment *assign;
+ ir_dereference *deref = orig_expr->operands[i]->as_dereference();
+
+ /* Avoid making a temporary if we don't need to to avoid aliasing. */
+ if (deref &&
+ deref->variable_referenced() != result->variable_referenced()) {
+ op[i] = deref;
+ continue;
+ }
+ /* Otherwise, store the operand in a temporary generally if it's
+ * not a dereference.
+ */
ir_variable *var = new(mem_ctx) ir_variable(orig_expr->operands[i]->type,
"mat_op_to_vec",
ir_var_temporary);
* that others that want to use op[i] have to clone the deref.
*/
op[i] = new(mem_ctx) ir_dereference_variable(var);
- assign = new(mem_ctx) ir_assignment(op[i],
- orig_expr->operands[i],
- NULL);
+ assign = new(mem_ctx) ir_assignment(op[i], orig_expr->operands[i]);
base_ir->insert_before(assign);
}
/* OK, time to break down this matrix operation. */
switch (orig_expr->operation) {
+ case ir_unop_d2f:
+ case ir_unop_f2d:
case ir_unop_neg: {
- const unsigned mask = (1U << result->type->vector_elements) - 1;
-
/* Apply the operation to each column.*/
for (i = 0; i < matrix_columns; i++) {
ir_expression *column_expr;
get_column(op[0], i));
column_assign = new(mem_ctx) ir_assignment(get_column(result, i),
- column_expr,
- NULL,
- mask);
+ column_expr);
assert(column_assign->write_mask != 0);
base_ir->insert_before(column_assign);
}
case ir_binop_sub:
case ir_binop_div:
case ir_binop_mod: {
- const unsigned mask = (1U << result->type->vector_elements) - 1;
-
/* For most operations, the matrix version is just going
* column-wise through and applying the operation to each column
* if available.
get_column(op[1], i));
column_assign = new(mem_ctx) ir_assignment(get_column(result, i),
- column_expr,
- NULL,
- mask);
+ column_expr);
assert(column_assign->write_mask != 0);
base_ir->insert_before(column_assign);
}