mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-06-01 17:12:15 +00:00
Rewrite the v6 modulo implementation.
While trying to understand bind expressions, I discovered that the v6 modulo code was incorrect. This version is correct but uses one too many temps. That's next.
This commit is contained in:
parent
cdb9783d69
commit
00e50c0ad3
1 changed files with 11 additions and 13 deletions
|
@ -1697,24 +1697,22 @@ binary_expr (int op, expr_t *e1, expr_t *e2)
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case '%':
|
case '%':
|
||||||
{
|
{
|
||||||
expr_t *tmp1, *tmp2;
|
expr_t *tmp1, *tmp2, *tmp3;
|
||||||
e = new_block_expr ();
|
e = new_block_expr ();
|
||||||
if (e2->type < ex_nil)
|
tmp1 = new_temp_def_expr (&type_float);
|
||||||
tmp1 = new_temp_def_expr (&type_float);
|
|
||||||
else
|
|
||||||
tmp1 = e2;
|
|
||||||
tmp2 = new_temp_def_expr (&type_float);
|
tmp2 = new_temp_def_expr (&type_float);
|
||||||
e2 = binary_expr ('&', e2, new_float_expr (-1.0));
|
tmp3 = new_temp_def_expr (&type_float);
|
||||||
e1 = binary_expr ('&', e1, new_float_expr (-1.0));
|
e1 = binary_expr ('&', e1, new_float_expr (-1.0));
|
||||||
if (tmp1 != e2)
|
e2 = binary_expr ('&', e2, new_float_expr (-1.0));
|
||||||
append_expr (e, new_bind_expr (e2, tmp1));
|
append_expr (e, assign_expr (tmp1, e1));
|
||||||
append_expr (e, new_bind_expr (binary_expr ('/', e1, tmp1),
|
append_expr (e, assign_expr (tmp2, e2));
|
||||||
tmp2));
|
e1 = binary_expr ('/', tmp1, tmp2);
|
||||||
e2 = binary_expr ('&', tmp2, new_float_expr (-1.0));
|
append_expr (e, assign_expr (tmp3, e1));
|
||||||
e->e.block.result = binary_expr ('-', tmp2, e2);
|
e2 = binary_expr ('&', tmp3, new_float_expr (-1.0));
|
||||||
|
e->e.block.result = binary_expr ('*', tmp2, e2);
|
||||||
e2 = e;
|
e2 = e;
|
||||||
e1 = tmp1;
|
e1 = tmp1;
|
||||||
op = '*';
|
op = '-';
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue