On Wed, May 20, 2020 at 3:18 AM Zebediah Figura <z.figura12(a)gmail.com> wrote:
@@ -633,17 +660,21 @@ static struct hlsl_ir_deref *new_array_deref(struct hlsl_ir_node *array, return NULL; }
- if (!(array = get_var_deref(array))) - return NULL; + if (data_type->reg_size > 1) + {
Doesn't this need to happen even for reg_size == 1 now that we're using a scalar offset?
+ struct hlsl_ir_constant *c; + struct hlsl_ir_node *mul;
- if (!(deref = d3dcompiler_alloc(sizeof(*deref)))) - return NULL; + if (!(c = new_uint_constant(data_type->reg_size * 4, loc))) + return NULL; + list_add_after(&index->entry, &c->node.entry); + if (!(mul = new_binary_expr(HLSL_IR_BINOP_MUL, index, &c->node, loc))) + return NULL; + list_add_after(&c->node.entry, &mul->entry); + index = mul; + }
- init_node(&deref->node, HLSL_IR_DEREF, data_type, loc); - deref->src.type = HLSL_IR_DEREF_ARRAY; - deref->src.v.array.array = array; - deref->src.v.array.index = index; - return deref; + return new_deref(array, index, data_type, loc); }
static void struct_var_initializer(struct list *list, struct hlsl_ir_var *var,
@@ -1513,12 +1490,6 @@ struct hlsl_ir_node *make_assignment(struct hlsl_ir_node *lhs, enum parse_assign lhs = lhs_inner; }
- if (!validate_lhs_deref(lhs)) - { - d3dcompiler_free(assign); - return NULL; - } - TRACE("Creating proper assignment expression.\n"); if (writemask == BWRITERSP_WRITEMASK_ALL) type = lhs->data_type; @@ -1562,26 +1533,12 @@ struct hlsl_ir_node *make_assignment(struct hlsl_ir_node *lhs, enum parse_assign enum hlsl_ir_expr_op op = op_from_assignment(assign_op); struct hlsl_ir_node *expr;
- if (assign->lhs.type != HLSL_IR_DEREF_VAR) - { - FIXME("LHS expression not supported in compound assignments yet.\n"); - assign->rhs = rhs; - } - else - { - TRACE("Adding an expression for the compound assignment.\n"); - expr = new_binary_expr(op, lhs, rhs, lhs->loc); - list_add_after(&rhs->entry, &expr->entry); - assign->rhs = expr; - } - } - else - { - list_remove(&lhs->entry); - /* Don't recursively free the deref; we just copied its members. */ - d3dcompiler_free(lhs); - assign->rhs = rhs; + TRACE("Adding an expression for the compound assignment.\n"); + expr = new_binary_expr(op, lhs, rhs, lhs->loc); + list_add_after(&rhs->entry, &expr->entry); + rhs = expr; } + assign->rhs = rhs;
I guess this is one of the cases where using a struct hlsl_deref for both lvalues and rvalues comes in handy (to some degree).