[qfcc] Clean up a pile of redundant code

The code was made redundant by distribute_product doing the right thing
for products that can go to 0.
This commit is contained in:
Bill Currie 2023-09-29 11:13:49 +09:00
parent 26dec9ee21
commit f5ba761c75

View file

@ -494,6 +494,7 @@ sum_expr_low (type_t *type, int op, const expr_t *a, const expr_t *b)
}
auto sum = typed_binary_expr (type, op, a, b);
sum = fold_constants (sum);
sum = edag_add_expr (sum);
return sum;
}
@ -756,48 +757,11 @@ scale_expr (type_t *type, const expr_t *a, const expr_t *b)
if (!scale) {
return 0;
}
scale = fold_constants (scale);
scale = edag_add_expr (scale);
scale = cast_expr (type, scale);
scale = edag_add_expr (scale);
return scale;
}
static const expr_t *
check_dot (const expr_t *a, const expr_t *b, int b_count)
{
const expr_t *b_adds[b_count + 1] = {};
const expr_t *b_subs[b_count + 1] = {};
a = traverse_scale (a);
distribute_terms (b, b_adds, b_subs);
const expr_t **s, **d;
for (s = b_adds, d = s; *s; s++) {
auto c = traverse_scale (*s);
if (is_cross (c)) {
if (a == traverse_scale (c->expr.e1)
|| a == traverse_scale (c->expr.e2)) {
continue;
}
}
*d++ = *s;
}
*d = 0;
for (s = b_subs, d = s; *s; s++) {
auto c = traverse_scale (*s);
if (is_cross (c)) {
if (a == traverse_scale (c->expr.e1)
|| a == traverse_scale (c->expr.e2)) {
continue;
}
}
*d++ = *s;
}
*d = 0;
return collect_terms (get_type (b), b_adds, b_subs);
}
static bool __attribute__((pure))
reject_dot (const expr_t *a, const expr_t *b)
{
@ -826,18 +790,6 @@ dot_expr (type_t *type, const expr_t *a, const expr_t *b)
return 0;
}
int a_terms = count_terms (a);
int b_terms = count_terms (b);
if (a_terms && !b_terms) {
a = check_dot (b, a, a_terms);
} else if (!a_terms && b_terms) {
b = check_dot (a, b, b_terms);
}
if (!a || !b) {
return 0;
}
const expr_t *prod = 0;
if (is_scale (a)) {
prod = a->expr.e2;
@ -853,38 +805,12 @@ dot_expr (type_t *type, const expr_t *a, const expr_t *b)
if (!dot) {
return 0;
}
dot = edag_add_expr (dot);
if (prod) {
dot = scale_expr (type, dot, prod);
}
return dot;
}
static const expr_t *
check_cross (const expr_t *a, const expr_t *b, int b_count)
{
const expr_t *b_adds[b_count + 1] = {};
const expr_t *b_subs[b_count + 1] = {};
a = traverse_scale (a);
distribute_terms (b, b_adds, b_subs);
const expr_t **s, **d;
for (s = b_adds, d = s; *s; s++) {
if (a != traverse_scale (*s)) {
*d++ = *s;
}
}
*d = 0;
for (s = b_subs, d = s; *s; s++) {
if (a != traverse_scale (*s)) {
*d++ = *s;
}
}
*d = 0;
return collect_terms (get_type (b), b_adds, b_subs);
}
static bool __attribute__((pure))
reject_cross (const expr_t *a, const expr_t *b)
{
@ -899,24 +825,7 @@ cross_expr (type_t *type, const expr_t *a, const expr_t *b)
return 0;
}
if (traverse_scale (a) == traverse_scale (b)) {
return 0;
}
int a_terms = count_terms (a);
int b_terms = count_terms (b);
if (a_terms && !b_terms) {
a = check_cross (b, a, a_terms);
} else if (!a_terms && b_terms) {
b = check_cross (a, b, b_terms);
}
auto cross = distribute_product (type, CROSS, a, b, reject_cross);
if (!cross) {
return 0;
}
cross = edag_add_expr (cross);
return cross;
}
@ -934,10 +843,6 @@ wedge_expr (type_t *type, const expr_t *a, const expr_t *b)
return 0;
}
auto wedge = distribute_product (type, WEDGE, a, b, reject_wedge);
if (!wedge) {
return 0;
}
wedge = edag_add_expr (wedge);
return wedge;
}