[qfcc] Support expanding constant expressions

This makes a slight improvement to the commutator product in that it
removes the expand statement, but there's still the problem of (a+a)/2.
However, at least now the product is correct and slightly less abysmal.
This commit is contained in:
Bill Currie 2024-01-19 15:36:47 +09:00
parent aa9be53b6e
commit 8994042a47
3 changed files with 7 additions and 3 deletions

View file

@ -542,7 +542,7 @@ expr_t *new_horizontal_expr (int op, const expr_t *vec, type_t *type);
const expr_t *new_swizzle_expr (const expr_t *src, const char *swizzle);
expr_t *new_extend_expr (const expr_t *src, type_t *type, int ext, bool rev);
const expr_t *new_extend_expr (const expr_t *src, type_t *type, int ext, bool rev);
/** Create a new def reference (non-temporary variable) expression node.

View file

@ -240,6 +240,10 @@ evaluate_constexpr (const expr_t *e)
if (!is_constant (e->alias.expr)) {
return e;
}
} else if (e->type == ex_extend) {
if (!is_constant (e->extend.src)) {
return e;
}
} else {
return e;
}

View file

@ -660,7 +660,7 @@ new_swizzle_expr (const expr_t *src, const char *swizzle)
return expr;
}
expr_t *
const expr_t *
new_extend_expr (const expr_t *src, type_t *type, int ext, bool rev)
{
expr_t *expr = new_expr ();
@ -669,7 +669,7 @@ new_extend_expr (const expr_t *src, type_t *type, int ext, bool rev)
expr->extend.extend = ext;
expr->extend.reverse = rev;
expr->extend.type = type;
return expr;
return evaluate_constexpr (expr);
}
expr_t *