mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-22 12:31:10 +00:00
[qfcc] Extract sub-vectors through summed extends
This goes a ways towards minimizing extend expressions, even finding zeros and thus eliminating whole branches of expressions, but shows the need for better handling of chained sums of extends.
This commit is contained in:
parent
f3a1239095
commit
924c13f925
1 changed files with 160 additions and 102 deletions
|
@ -65,21 +65,40 @@ is_neg (const expr_t *e)
|
|||
return e->type == ex_uexpr && e->e.expr.op == '-';
|
||||
}
|
||||
|
||||
static expr_t *
|
||||
ext_expr (expr_t *src, type_t *type, int extend, bool reverse)
|
||||
{
|
||||
if (!src) {
|
||||
return 0;
|
||||
}
|
||||
return new_extend_expr (src, type, extend, reverse);
|
||||
}
|
||||
|
||||
static expr_t *
|
||||
neg_expr (expr_t *e)
|
||||
{
|
||||
if (!e) {
|
||||
// propagated zero
|
||||
return 0;
|
||||
}
|
||||
if (is_neg (e)) {
|
||||
return e->e.expr.e1;
|
||||
}
|
||||
auto type = get_type (e);
|
||||
e = new_unary_expr ('-', e);
|
||||
e->e.expr.type = type;
|
||||
return e;
|
||||
return fold_constants (e);
|
||||
}
|
||||
|
||||
static expr_t *
|
||||
alias_expr (type_t *type, expr_t *e, int offset)
|
||||
{
|
||||
if (type == get_type (e)) {
|
||||
if (offset) {
|
||||
internal_error (e, "offset alias to same type");
|
||||
}
|
||||
return e;
|
||||
}
|
||||
bool neg = false;
|
||||
if (is_neg (e)) {
|
||||
neg = true;
|
||||
|
@ -95,6 +114,37 @@ alias_expr (type_t *type, expr_t *e, int offset)
|
|||
static expr_t *
|
||||
offset_cast (type_t *type, expr_t *expr, int offset)
|
||||
{
|
||||
if (type->meta != ty_basic) {
|
||||
internal_error (expr, "offset cast to non-basic type");
|
||||
}
|
||||
if (expr->type == ex_expr && expr->e.expr.op == '+') {
|
||||
auto e1 = expr->e.expr.e1;
|
||||
auto e2 = expr->e.expr.e2;
|
||||
if (e1->type == ex_extend) {
|
||||
auto ext = e1->e.extend;
|
||||
if (type_width (get_type (ext.src)) == type_width (type)) {
|
||||
return alias_expr (type, ext.src, 0);
|
||||
}
|
||||
}
|
||||
if (e2->type == ex_extend) {
|
||||
auto ext = e2->e.extend;
|
||||
if (type_width (get_type (ext.src)) == type_width (type)) {
|
||||
return alias_expr (type, ext.src, 0);
|
||||
}
|
||||
if (offset >= type_width (get_type (ext.src))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (expr->type == ex_extend) {
|
||||
auto ext = expr->e.extend;
|
||||
if (type_width (get_type (ext.src)) == type_width (type)) {
|
||||
return alias_expr (type, ext.src, 0);
|
||||
}
|
||||
if (offset >= type_width (get_type (ext.src))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
offset *= type_size (base_type (get_type (expr)));
|
||||
return alias_expr (type, expr, offset);
|
||||
}
|
||||
|
@ -257,38 +307,33 @@ promote_scalar (type_t *dst_type, expr_t *scalar)
|
|||
}
|
||||
|
||||
static expr_t *
|
||||
scalar_product (expr_t *e1, expr_t *e2)
|
||||
sum_expr (type_t *type, expr_t *a, expr_t *b)
|
||||
{
|
||||
auto scalar = is_scalar (get_type (e1)) ? e1 : e2;
|
||||
auto vector = is_scalar (get_type (e1)) ? e2 : e1;
|
||||
auto algebra = algebra_get (get_type (vector));
|
||||
auto layout = &algebra->layout;
|
||||
|
||||
scalar = promote_scalar (algebra->type, scalar);
|
||||
|
||||
expr_t *components[layout->count] = {};
|
||||
vector = mvec_expr (vector, algebra);
|
||||
mvec_scatter (components, vector, algebra);
|
||||
|
||||
for (int i = 0; i < layout->count; i++) {
|
||||
if (!components[i]) {
|
||||
continue;
|
||||
}
|
||||
auto comp_type = get_type (components[i]);
|
||||
if (type_width (comp_type) == 1) {
|
||||
auto prod = new_binary_expr ('*', components[i], scalar);
|
||||
prod->e.expr.type = comp_type;
|
||||
components[i] = fold_constants (prod);
|
||||
} else if (type_width (comp_type) > 4) {
|
||||
internal_error (vector, "scalar * %d-vector not implemented",
|
||||
type_width (comp_type));
|
||||
} else {
|
||||
auto prod = new_binary_expr (SCALE, components[i], scalar);
|
||||
prod->e.expr.type = comp_type;
|
||||
components[i] = fold_constants (prod);
|
||||
if (!a) {
|
||||
return b;
|
||||
}
|
||||
if (!b) {
|
||||
return a;
|
||||
}
|
||||
expr_t *ext = 0;
|
||||
if (a->type == ex_extend && b->type == ex_extend) {
|
||||
if (a->e.extend.extend == b->e.extend.extend
|
||||
&& a->e.extend.reverse == b->e.extend.reverse
|
||||
&& a->e.extend.type == b->e.extend.type) {
|
||||
ext = a; // for copying extend info;
|
||||
a = a->e.extend.src;
|
||||
b = b->e.extend.src;
|
||||
}
|
||||
}
|
||||
return mvec_gather (components, algebra);
|
||||
auto sum = new_binary_expr ('+', a, b);
|
||||
if (ext) {
|
||||
sum->e.expr.type = get_type (a);
|
||||
auto extend = ext->e.extend;
|
||||
sum = ext_expr (sum, type, extend.extend, extend.reverse);
|
||||
} else {
|
||||
sum->e.expr.type = type;
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -302,8 +347,11 @@ component_sum (int op, expr_t **c, expr_t **a, expr_t **b,
|
|||
internal_error (a[i], "tangled multivec types");
|
||||
}
|
||||
auto sum_type = get_type (a[i]);
|
||||
c[i] = new_binary_expr (op, a[i], b[i]);
|
||||
c[i]->e.expr.type = sum_type;
|
||||
if (op == '+') {
|
||||
c[i] = sum_expr (sum_type, a[i], b[i]);
|
||||
} else {
|
||||
c[i] = sum_expr (sum_type, a[i], neg_expr (b[i]));
|
||||
}
|
||||
c[i] = fold_constants (c[i]);
|
||||
} else if (a[i]) {
|
||||
c[i] = a[i];
|
||||
|
@ -311,7 +359,7 @@ component_sum (int op, expr_t **c, expr_t **a, expr_t **b,
|
|||
if (op == '+') {
|
||||
c[i] = b[i];
|
||||
} else {
|
||||
c[i] = scalar_product (new_float_expr (-1), b[i]);
|
||||
c[i] = neg_expr (b[i]);
|
||||
c[i] = fold_constants (c[i]);
|
||||
}
|
||||
} else {
|
||||
|
@ -320,17 +368,13 @@ component_sum (int op, expr_t **c, expr_t **a, expr_t **b,
|
|||
}
|
||||
}
|
||||
|
||||
static expr_t *
|
||||
sum_expr (type_t *type, expr_t *a, expr_t *b)
|
||||
{
|
||||
auto sum = new_binary_expr ('+', a, b);
|
||||
sum->e.expr.type = type;
|
||||
return sum;
|
||||
}
|
||||
|
||||
static expr_t *
|
||||
scale_expr (type_t *type, expr_t *a, expr_t *b)
|
||||
{
|
||||
if (!a || !b) {
|
||||
// propagated zero
|
||||
return 0;
|
||||
}
|
||||
if (!is_scalar (get_type (b)) || !is_real (get_type (b))) {
|
||||
internal_error (b, "not a real scalar type");
|
||||
}
|
||||
|
@ -363,6 +407,10 @@ scale_expr (type_t *type, expr_t *a, expr_t *b)
|
|||
static expr_t *
|
||||
dot_expr (type_t *type, expr_t *a, expr_t *b)
|
||||
{
|
||||
if (!a || !b) {
|
||||
// propagated zero
|
||||
return 0;
|
||||
}
|
||||
bool neg = false;
|
||||
if (is_neg (a)) {
|
||||
neg = !neg;
|
||||
|
@ -385,6 +433,10 @@ dot_expr (type_t *type, expr_t *a, expr_t *b)
|
|||
static expr_t *
|
||||
cross_expr (type_t *type, expr_t *a, expr_t *b)
|
||||
{
|
||||
if (!a || !b) {
|
||||
// propagated zero
|
||||
return 0;
|
||||
}
|
||||
bool neg = false;
|
||||
if (is_neg (a)) {
|
||||
neg = !neg;
|
||||
|
@ -407,6 +459,10 @@ cross_expr (type_t *type, expr_t *a, expr_t *b)
|
|||
static expr_t *
|
||||
wedge_expr (type_t *type, expr_t *a, expr_t *b)
|
||||
{
|
||||
if (!a || !b) {
|
||||
// propagated zero
|
||||
return 0;
|
||||
}
|
||||
bool neg = false;
|
||||
if (is_neg (a)) {
|
||||
neg = !neg;
|
||||
|
@ -463,7 +519,7 @@ pga3_x_y_z_w_dot_yz_zx_xy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto vtype = vector_type (stype, 3);
|
||||
auto dot_type = algebra_mvec_type (alg, 0x01);
|
||||
auto va = offset_cast (vtype, a, 0);
|
||||
c[0] = new_extend_expr (cross_expr (vtype, b, va), dot_type, 0, false);
|
||||
c[0] = ext_expr (cross_expr (vtype, b, va), dot_type, 0, false);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -473,7 +529,7 @@ pga3_x_y_z_w_dot_wx_wy_wz (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto vtype = vector_type (stype, 3);
|
||||
auto va = offset_cast (vtype, a, 0);
|
||||
auto cs = neg_expr (dot_expr (stype, b, va));
|
||||
c[0] = new_extend_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
c[0] = ext_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -484,7 +540,7 @@ pga3_x_y_z_w_dot_wxyz (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto va = offset_cast (vtype, a, 0);
|
||||
auto sb = offset_cast (stype, b, 0);
|
||||
auto cv = scale_expr (vtype, va, sb);
|
||||
c[5] = new_extend_expr (cv, algebra_mvec_type (alg, 0x20), 0, false);
|
||||
c[5] = ext_expr (cv, algebra_mvec_type (alg, 0x20), 0, false);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -495,7 +551,7 @@ pga3_x_y_z_w_dot_wzy_wxz_wyx_xyz (expr_t **c, expr_t *a, expr_t *b,
|
|||
auto vtype = vector_type (stype, 3);
|
||||
auto bvtype = algebra_mvec_type (alg, 0x02);
|
||||
auto bmtype = algebra_mvec_type (alg, 0x08);
|
||||
auto va = offset_cast (bvtype, a, 0);
|
||||
auto va = offset_cast (vtype, a, 0);
|
||||
auto vb = offset_cast (vtype, b, 0);
|
||||
auto sb = offset_cast (stype, b, 3);
|
||||
c[1] = scale_expr (bvtype, va, sb);
|
||||
|
@ -509,7 +565,7 @@ pga3_yz_zx_xy_dot_x_y_z_w (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto vtype = vector_type (stype, 3);
|
||||
auto dot_type = algebra_mvec_type (alg, 0x01);
|
||||
auto vb = offset_cast (vtype, b, 0);
|
||||
c[0] = new_extend_expr (cross_expr (vtype, vb, a), dot_type, 0, false);
|
||||
c[0] = ext_expr (cross_expr (vtype, vb, a), dot_type, 0, false);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -523,8 +579,9 @@ static void
|
|||
pga3_yz_zx_xy_dot_wxyz (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
||||
{
|
||||
auto stype = alg->type;
|
||||
auto vtype = vector_type (stype, 3);
|
||||
auto bmtype = algebra_mvec_type (alg, 0x08);
|
||||
auto va = offset_cast (bmtype, a, 0);
|
||||
auto va = offset_cast (vtype, a, 0);
|
||||
auto sb = offset_cast (stype, b, 0);
|
||||
c[3] = neg_expr (scale_expr (bmtype, va, sb));
|
||||
}
|
||||
|
@ -543,8 +600,8 @@ pga3_yz_zx_xy_dot_wzy_wxz_wyx_xyz (expr_t **c, expr_t *a, expr_t *b,
|
|||
auto cv = scale_expr (vtype, a, sb);
|
||||
auto cs = dot_expr (stype, a, vb);
|
||||
|
||||
cv = new_extend_expr (neg_expr (cv), dot_type, 0, false);
|
||||
cs = new_extend_expr (cs, dot_type, 0, true);
|
||||
cv = ext_expr (neg_expr (cv), dot_type, 0, false);
|
||||
cs = ext_expr (cs, dot_type, 0, true);
|
||||
c[0] = sum_expr (dot_type, cv, cs);
|
||||
}
|
||||
|
||||
|
@ -555,7 +612,7 @@ pga3_wx_wy_wz_dot_x_y_z_w (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto vtype = vector_type (stype, 3);
|
||||
auto vb = offset_cast (vtype, b, 0);
|
||||
auto cs = dot_expr (stype, a, vb);
|
||||
c[0] = new_extend_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
c[0] = ext_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -572,9 +629,10 @@ static void
|
|||
pga3_wxyz_dot_yz_zx_xy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
||||
{
|
||||
auto stype = alg->type;
|
||||
auto vtype = vector_type (stype, 3);
|
||||
auto bmtype = algebra_mvec_type (alg, 0x08);
|
||||
auto sa = offset_cast (stype, a, 0);
|
||||
auto vb = offset_cast (bmtype, b, 0);
|
||||
auto vb = offset_cast (vtype, b, 0);
|
||||
c[3] = neg_expr (scale_expr (bmtype, vb, sa));
|
||||
}
|
||||
|
||||
|
@ -585,7 +643,7 @@ pga3_wxyz_dot_wzy_wxz_wyx_xyz (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto sa = offset_cast (stype, a, 0);
|
||||
auto sb = offset_cast (stype, b, 3);
|
||||
auto cs = neg_expr (scale_expr (stype, sa, sb));
|
||||
c[0] = new_extend_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
c[0] = ext_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -617,8 +675,8 @@ pga3_wzy_wxz_wyx_xyz_dot_yz_zx_xy (expr_t **c, expr_t *a, expr_t *b,
|
|||
auto cv = scale_expr (vtype, b, sa);
|
||||
auto cs = dot_expr (stype, b, va);
|
||||
|
||||
cv = new_extend_expr (neg_expr (cv), dot_type, 0, false);
|
||||
cs = new_extend_expr (cs, dot_type, 0, true);
|
||||
cv = ext_expr (neg_expr (cv), dot_type, 0, false);
|
||||
cs = ext_expr (cs, dot_type, 0, true);
|
||||
c[0] = sum_expr (dot_type, cv, cs);
|
||||
}
|
||||
|
||||
|
@ -629,7 +687,7 @@ pga3_wzy_wxz_wyx_xyz_dot_wxyz (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto sa = offset_cast (stype, a, 3);
|
||||
auto sb = offset_cast (stype, b, 0);
|
||||
auto cs = scale_expr (stype, sa, sb);
|
||||
c[0] = new_extend_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
c[0] = ext_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -707,8 +765,8 @@ pga2_yw_wx_xy_dot_x_y_w (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto vb = offset_cast (wtype, b, 0);
|
||||
auto cv = new_swizzle_expr (vb, "y-x");
|
||||
auto cs = wedge_expr (stype, vb, va);
|
||||
cv = new_extend_expr (scale_expr (wtype, cv, sa), vtype, 0, false);
|
||||
cs = new_extend_expr (cs, dot_type, 0, true);
|
||||
cv = ext_expr (scale_expr (wtype, cv, sa), vtype, 0, false);
|
||||
cs = ext_expr (cs, dot_type, 0, true);
|
||||
c[2] = sum_expr (dot_type, cv, cs);
|
||||
}
|
||||
|
||||
|
@ -719,7 +777,7 @@ pga2_yw_wx_xy_dot_wxy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto sa = offset_cast (stype, a, 2);
|
||||
auto sb = offset_cast (stype, b, 0);
|
||||
auto cs = neg_expr (scale_expr (stype, sa, sb));
|
||||
c[0] = new_extend_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
c[0] = ext_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -733,8 +791,8 @@ pga2_x_y_w_dot_yw_wx_xy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto sb = offset_cast (stype, b, 2);
|
||||
auto cv = scale_expr (wtype, new_swizzle_expr (va, "-yx"), sb);
|
||||
auto cs = wedge_expr (stype, vb, va);
|
||||
cv = new_extend_expr (cv, dot_type, 0, false);
|
||||
cs = new_extend_expr (cs, dot_type, 0, true);
|
||||
cv = ext_expr (cv, dot_type, 0, false);
|
||||
cs = ext_expr (cs, dot_type, 0, true);
|
||||
c[2] = sum_expr (dot_type, cs, cv);
|
||||
}
|
||||
|
||||
|
@ -758,7 +816,7 @@ pga2_x_y_w_dot_wxy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto va = offset_cast (vtype, a, 0);
|
||||
auto cv = scale_expr (vtype, va, b);
|
||||
|
||||
c[0] = new_extend_expr (cv, dot_type, 0, false);
|
||||
c[0] = ext_expr (cv, dot_type, 0, false);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -768,7 +826,7 @@ pga2_wxy_dot_yw_wx_xy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto sa = offset_cast (stype, a, 0);
|
||||
auto sb = offset_cast (stype, b, 2);
|
||||
auto cs = neg_expr (scale_expr (stype, sa, sb));
|
||||
c[0] = new_extend_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
c[0] = ext_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -780,7 +838,7 @@ pga2_wxy_dot_x_y_w (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto sa = offset_cast (stype, a, 0);
|
||||
auto vb = offset_cast (vtype, b, 0);
|
||||
auto cv = scale_expr (vtype, vb, sa);
|
||||
c[0] = new_extend_expr (cv, dot_type, 0, false);
|
||||
c[0] = ext_expr (cv, dot_type, 0, false);
|
||||
}
|
||||
|
||||
static pga_func pga2_dot_funcs[4][4] = {
|
||||
|
@ -887,8 +945,8 @@ pga3_x_y_z_w_wedge_yz_zx_xy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto cv = scale_expr (vtype, b, sa);
|
||||
auto cs = dot_expr (stype, va, b);
|
||||
|
||||
cv = new_extend_expr (neg_expr (cv), wedge_type, 0, false);
|
||||
cs = new_extend_expr (cs, wedge_type, 0, true);
|
||||
cv = ext_expr (neg_expr (cv), wedge_type, 0, false);
|
||||
cs = ext_expr (cs, wedge_type, 0, true);
|
||||
c[5] = sum_expr (wedge_type, cv, cs);
|
||||
}
|
||||
|
||||
|
@ -900,7 +958,7 @@ pga3_x_y_z_w_wedge_wx_wy_wz (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto wedge_type = algebra_mvec_type (alg, 0x20);
|
||||
auto va = offset_cast (vtype, a, 0);
|
||||
auto cv = cross_expr (vtype, va, b);
|
||||
c[5] = new_extend_expr (cv, wedge_type, 0, false);
|
||||
c[5] = ext_expr (cv, wedge_type, 0, false);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -921,8 +979,8 @@ pga3_yz_zx_xy_wedge_x_y_z_w (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto cv = scale_expr (vtype, a, sb);
|
||||
auto cs = dot_expr (stype, vb, a);
|
||||
|
||||
cv = new_extend_expr (neg_expr (cv), wedge_type, 0, false);
|
||||
cs = new_extend_expr (cs, wedge_type, 0, true);
|
||||
cv = ext_expr (neg_expr (cv), wedge_type, 0, false);
|
||||
cs = ext_expr (cs, wedge_type, 0, true);
|
||||
c[5] = sum_expr (wedge_type, cv, cs);
|
||||
}
|
||||
|
||||
|
@ -942,7 +1000,7 @@ pga3_wx_wy_wz_wedge_x_y_z_w (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto wedge_type = algebra_mvec_type (alg, 0x20);
|
||||
auto vb = offset_cast (vtype, b, 0);
|
||||
auto cv = cross_expr (vtype, vb, a);
|
||||
c[5] = new_extend_expr (cv, wedge_type, 0, false);
|
||||
c[5] = ext_expr (cv, wedge_type, 0, false);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1104,10 +1162,10 @@ pga3_x_y_z_w_geom_yz_zx_xy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto sa = offset_cast (stype, a, 3);
|
||||
auto cv = scale_expr (vtype, b, sa);
|
||||
auto cs = dot_expr (stype, va, b);
|
||||
c[0] = new_extend_expr (cross_expr (vtype, b, va),
|
||||
c[0] = ext_expr (cross_expr (vtype, b, va),
|
||||
algebra_mvec_type (alg, 0x01), 0, false);
|
||||
cv = new_extend_expr (neg_expr (cv), geom_type, 0, false);
|
||||
cs = new_extend_expr (cs, geom_type, 0, true);
|
||||
cv = ext_expr (neg_expr (cv), geom_type, 0, false);
|
||||
cs = ext_expr (cs, geom_type, 0, true);
|
||||
c[5] = sum_expr (geom_type, cv, cs);
|
||||
}
|
||||
|
||||
|
@ -1119,8 +1177,8 @@ pga3_x_y_z_w_geom_wx_wy_wz (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto geom_type = algebra_mvec_type (alg, 0x20);
|
||||
auto va = offset_cast (vtype, a, 0);
|
||||
auto cs = neg_expr (dot_expr (stype, va, b));
|
||||
c[5] = new_extend_expr (cross_expr (vtype, va, b), geom_type, 0, false);
|
||||
c[0] = new_extend_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
c[5] = ext_expr (cross_expr (vtype, va, b), geom_type, 0, false);
|
||||
c[0] = ext_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1132,7 +1190,7 @@ pga3_x_y_z_w_geom_wxyz (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto va = offset_cast (vtype, a, 0);
|
||||
auto sb = offset_cast (stype, b, 0);
|
||||
auto cv = scale_expr (vtype, va, sb);
|
||||
c[5] = new_extend_expr (cv, geom_type, 0, false);
|
||||
c[5] = ext_expr (cv, geom_type, 0, false);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1160,10 +1218,10 @@ pga3_yz_zx_xy_geom_x_y_z_w (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto sb = offset_cast (stype, b, 3);
|
||||
auto cv = scale_expr (vtype, a, sb);
|
||||
auto cs = dot_expr (stype, vb, a);
|
||||
c[0] = new_extend_expr (cross_expr (vtype, vb, a),
|
||||
c[0] = ext_expr (cross_expr (vtype, vb, a),
|
||||
algebra_mvec_type (alg, 0x01), 0, false);
|
||||
cv = new_extend_expr (neg_expr (cv), geom_type, 0, false);
|
||||
cs = new_extend_expr (cs, geom_type, 0, true);
|
||||
cv = ext_expr (neg_expr (cv), geom_type, 0, false);
|
||||
cs = ext_expr (cs, geom_type, 0, true);
|
||||
c[5] = sum_expr (geom_type, cv, cs);
|
||||
}
|
||||
|
||||
|
@ -1200,10 +1258,10 @@ pga3_yz_zx_xy_geom_wzy_wxz_wyx_xyz (expr_t **c, expr_t *a, expr_t *b,
|
|||
auto sb = offset_cast (stype, b, 3);
|
||||
auto cv = scale_expr (vtype, a, sb);
|
||||
auto cs = dot_expr (stype, vb, a);
|
||||
cv = new_extend_expr (neg_expr (cv), geom_type, 0, false);
|
||||
cs = new_extend_expr (cs, geom_type, 0, true);
|
||||
cv = ext_expr (neg_expr (cv), geom_type, 0, false);
|
||||
cs = ext_expr (cs, geom_type, 0, true);
|
||||
c[0] = sum_expr (geom_type, cv, cs);
|
||||
c[5] = new_extend_expr (cross_expr (vtype, vb, a),
|
||||
c[5] = ext_expr (cross_expr (vtype, vb, a),
|
||||
algebra_mvec_type (alg, 0x20), 0, false);
|
||||
}
|
||||
|
||||
|
@ -1215,8 +1273,8 @@ pga3_wx_wy_wz_geom_x_y_z_w (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto geom_type = algebra_mvec_type (alg, 0x20);
|
||||
auto vb = offset_cast (vtype, b, 0);
|
||||
auto cs = dot_expr (stype, vb, a);
|
||||
c[5] = new_extend_expr (cross_expr (vtype, vb, a), geom_type, 0, false);
|
||||
c[0] = new_extend_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
c[5] = ext_expr (cross_expr (vtype, vb, a), geom_type, 0, false);
|
||||
c[0] = ext_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1235,7 +1293,7 @@ pga3_wx_wy_wz_geom_wzy_wxz_wyx_xyz (expr_t **c, expr_t *a, expr_t *b,
|
|||
auto geom_type = algebra_mvec_type (alg, 0x20);
|
||||
auto vs = offset_cast (stype, b, 3);
|
||||
auto cv = neg_expr (scale_expr (vtype, a, vs));
|
||||
c[5] = new_extend_expr (cv, geom_type, 0, false);
|
||||
c[5] = ext_expr (cv, geom_type, 0, false);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1247,7 +1305,7 @@ pga3_wxyz_geom_x_y_z_w (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto sa = offset_cast (stype, a, 0);
|
||||
auto vb = offset_cast (vtype, b, 0);
|
||||
auto cv = neg_expr (scale_expr (vtype, vb, sa));
|
||||
c[5] = new_extend_expr (cv, geom_type, 0, false);
|
||||
c[5] = ext_expr (cv, geom_type, 0, false);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1267,7 +1325,7 @@ pga3_wxyz_geom_wzy_wxz_wyx_xyz (expr_t **c, expr_t *a, expr_t *b,
|
|||
auto sb = offset_cast (stype, b, 3);
|
||||
auto geom_type = algebra_mvec_type (alg, 0x01);
|
||||
auto cs = scale_expr (stype, sa, sb);
|
||||
c[0] = new_extend_expr (neg_expr (cs), geom_type, 0, true);
|
||||
c[0] = ext_expr (neg_expr (cs), geom_type, 0, true);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1296,10 +1354,10 @@ pga3_wzy_wxz_wyx_xyz_geom_yz_zx_xy (expr_t **c, expr_t *a, expr_t *b,
|
|||
auto sa = offset_cast (stype, a, 3);
|
||||
auto cv = scale_expr (vtype, b, sa);
|
||||
auto cs = dot_expr (stype, va, b);
|
||||
cv = new_extend_expr (neg_expr (cv), geom_type, 0, false);
|
||||
cs = new_extend_expr (cs, geom_type, 0, true);
|
||||
cv = ext_expr (neg_expr (cv), geom_type, 0, false);
|
||||
cs = ext_expr (cs, geom_type, 0, true);
|
||||
c[0] = sum_expr (geom_type, cv, cs);
|
||||
c[5] = new_extend_expr (cross_expr (vtype, b, va),
|
||||
c[5] = ext_expr (cross_expr (vtype, b, va),
|
||||
algebra_mvec_type (alg, 0x20), 0, false);
|
||||
}
|
||||
|
||||
|
@ -1312,7 +1370,7 @@ pga3_wzy_wxz_wyx_xyz_geom_wx_wy_wz (expr_t **c, expr_t *a, expr_t *b,
|
|||
auto geom_type = algebra_mvec_type (alg, 0x20);
|
||||
auto sa = offset_cast (stype, a, 3);
|
||||
auto cv = scale_expr (vtype, b, sa);
|
||||
c[5] = new_extend_expr (cv, geom_type, 0, false);
|
||||
c[5] = ext_expr (cv, geom_type, 0, false);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1324,7 +1382,7 @@ pga3_wzy_wxz_wyx_xyz_geom_wxyz (expr_t **c, expr_t *a, expr_t *b,
|
|||
auto sb = offset_cast (stype, b, 0);
|
||||
auto geom_type = algebra_mvec_type (alg, 0x01);
|
||||
auto cs = scale_expr (stype, sa, sb);
|
||||
c[0] = new_extend_expr (cs, geom_type, 0, true);
|
||||
c[0] = ext_expr (cs, geom_type, 0, true);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1402,7 +1460,7 @@ pga2_yw_wx_xy_geom_yw_wx_xy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto sb = offset_cast (stype, b, 2);
|
||||
auto cv = alias_expr (ctype, cross_expr (vtype, b, a), 0);
|
||||
|
||||
c[0] = new_extend_expr (cv, geom_type, 0, false);
|
||||
c[0] = ext_expr (cv, geom_type, 0, false);
|
||||
c[1] = neg_expr (scale_expr (algebra_mvec_type (alg, 0x02), sa, sb));
|
||||
}
|
||||
|
||||
|
@ -1418,8 +1476,8 @@ pga2_yw_wx_xy_geom_x_y_w (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto vb = offset_cast (wtype, b, 0);
|
||||
auto cv = new_swizzle_expr (vb, "y-x");
|
||||
auto cs = wedge_expr (stype, vb, va);
|
||||
cs = new_extend_expr (cs, geom_type, 0, true);
|
||||
cv = new_extend_expr (scale_expr (wtype, cv, sa), vtype, 0, false);
|
||||
cs = ext_expr (cs, geom_type, 0, true);
|
||||
cv = ext_expr (scale_expr (wtype, cv, sa), vtype, 0, false);
|
||||
c[2] = sum_expr (geom_type, cv, cs);
|
||||
c[3] = dot_expr (algebra_mvec_type (alg, 0x08), a, b);
|
||||
}
|
||||
|
@ -1431,7 +1489,7 @@ pga2_yw_wx_xy_geom_wxy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto sa = offset_cast (stype, a, 2);
|
||||
auto sb = offset_cast (stype, b, 0);
|
||||
auto cs = neg_expr (scale_expr (stype, sa, sb));
|
||||
c[0] = new_extend_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
c[0] = ext_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1446,8 +1504,8 @@ pga2_x_y_w_geom_yw_wx_xy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto sb = offset_cast (stype, b, 2);
|
||||
auto cv = new_swizzle_expr (va, "-yx");
|
||||
auto cs = wedge_expr (stype, vb, va);
|
||||
cs = new_extend_expr (cs, geom_type, 0, true);
|
||||
cv = new_extend_expr (scale_expr (wtype, cv, sb), vtype, 0, false);
|
||||
cs = ext_expr (cs, geom_type, 0, true);
|
||||
cv = ext_expr (scale_expr (wtype, cv, sb), vtype, 0, false);
|
||||
c[2] = sum_expr (geom_type, cv, cs);
|
||||
c[3] = dot_expr (algebra_mvec_type (alg, 0x08), a, b);
|
||||
}
|
||||
|
@ -1473,7 +1531,7 @@ pga2_x_y_w_geom_wxy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto va = offset_cast (vtype, a, 0);
|
||||
auto cv = scale_expr (vtype, va, b);
|
||||
|
||||
c[0] = new_extend_expr (cv, geom_type, 0, false);
|
||||
c[0] = ext_expr (cv, geom_type, 0, false);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1483,7 +1541,7 @@ pga2_wxy_geom_yw_wx_xy (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto sa = offset_cast (stype, a, 0);
|
||||
auto sb = offset_cast (stype, b, 2);
|
||||
auto cs = neg_expr (scale_expr (stype, sa, sb));
|
||||
c[0] = new_extend_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
c[0] = ext_expr (cs, algebra_mvec_type (alg, 0x01), 0, true);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1495,7 +1553,7 @@ pga2_wxy_geom_x_y_w (expr_t **c, expr_t *a, expr_t *b, algebra_t *alg)
|
|||
auto vb = offset_cast (vtype, b, 0);
|
||||
auto cv = scale_expr (vtype, vb, a);
|
||||
|
||||
c[0] = new_extend_expr (cv, geom_type, 0, false);
|
||||
c[0] = ext_expr (cv, geom_type, 0, false);
|
||||
}
|
||||
|
||||
static pga_func pga2_geometric_funcs[6][6] = {
|
||||
|
@ -1641,7 +1699,7 @@ multivector_divide (expr_t *e1, expr_t *e2)
|
|||
auto ct = get_type (a[i]);
|
||||
int width = type_width (ct);
|
||||
if (width > 1) {
|
||||
den = new_extend_expr (den, vector_type (stype, width), 2, false);
|
||||
den = ext_expr (den, vector_type (stype, width), 2, false);
|
||||
}
|
||||
a[i] = new_binary_expr ('/', a[i], den);
|
||||
a[i]->e.expr.type = ct;
|
||||
|
@ -1844,7 +1902,7 @@ algebra_assign_expr (expr_t *dst, expr_t *src)
|
|||
if (size) {
|
||||
zero_components (block, dst, memset_base, size);
|
||||
}
|
||||
auto dst_alias = alias_expr (sym->type, dst, sym->s.offset);
|
||||
auto dst_alias = new_offset_alias_expr (sym->type, dst, sym->s.offset);
|
||||
append_expr (block, new_assign_expr (dst_alias, components[i]));
|
||||
memset_base = sym->s.offset + type_size (sym->type);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue