📄 optimize.c
字号:
break;
}
}
val = ep->v.p[1]->v.i;
if (val == 0)
{
addaside(ep->v.p[0]);
*node = ep->v.p[1];
}
else if (val == 1)
*node = ep->v.p[0];
else if (val == - 1)
*node = makenode(negtype, (char*)ep->v.p[0], 0);
else
dooper(node, mode);
rv = TRUE;
break;
case 8:
dval = ep->v.p[1]->v.f;
if (dval == 0)
{
*node = ep->v.p[1];
addaside(ep->v.p[0]);
}
else if (dval == 1)
*node = ep->v.p[0];
else if (dval == - 1)
*node = makenode(negtype, (char*)ep->v.p[0], 0);
else
dooper(node, mode);
rv = TRUE;
break;
#ifdef XXXXX
// multiply by imaginary const changes the mode of the other value...
// but there is no easy way to do that at this stage. A simple cast will
// result in conversion to zero, and while we could change simple variable
// references by examination of the enode we could *not* change complicated expressions
case 12:
dval = ep->v.p[0]->v.f;
if (dval == 0)
{
addaside(ep->v.p[1]);
*node = ep->v.p[0];
}
else if (dval == 1)
*node = ep->v.p[1];
else if (dval == - 1)
*node = makenode(negtype, (char*)ep->v.p[1], 0);
else
dooper(node, mode);
rv = TRUE;
break;
case 13:
dval = ep->v.p[1]->v.f;
if (dval == 0)
{
*node = ep->v.p[1];
addaside(ep->v.p[0]);
}
else if (dval == 1)
*node = ep->v.p[0];
else if (dval == - 1)
*node = makenode(negtype, (char*)ep->v.p[0], 0);
else
dooper(node, mode);
rv = TRUE;
break;
#endif
}
break;
case en_pdiv:
case en_div:
case en_udiv:
case en_asdiv:
case en_asudiv:
rv |= opt0(&(ep->v.p[0]));
rv |= opt0(&(ep->v.p[1]));
mode = getmode(ep->v.p[0], ep->v.p[1]);
switch (mode)
{
case 1:
case 2:
case 3:
case 4:
default:
dooper(node, mode);
rv = TRUE;
break;
case 5:
if (ep->v.p[0]->v.i == 0)
{
addaside(ep->v.p[1]);
*node = ep->v.p[0];
}
else
dooper(node, mode);
rv = TRUE;
break;
case 6:
if (ep->v.p[0]->v.f == 0)
{
addaside(ep->v.p[1]);
*node = ep->v.p[0];
}
else
dooper(node, mode);
rv = TRUE;
break;
case 7:
if (!floatrecurse(ep->v.p[0]))
{
sc = pwrof2(ep->v.p[1]->v.i);
if (sc != - 1)
{
rv = TRUE;
ep->v.p[1]->v.i = sc;
switch (ep->nodetype)
{
case en_div:
case en_pdiv:
ep->nodetype = en_arshd;
break;
case en_asdiv:
ep->nodetype = en_asarshd;
break;
case en_udiv:
ep->nodetype = en_rsh;
break;
case en_asudiv:
ep->nodetype = en_asrsh;
break;
}
break;
}
}
val = ep->v.p[1]->v.i;
if (val == 1)
*node = ep->v.p[0];
else if (val == - 1)
*node = makenode(negtype, (char*)ep->v.p[0], 0);
else
dooper(node, mode);
rv = TRUE;
break;
case 8:
dval = ep->v.p[1]->v.f;
if (dval == 1)
*node = ep->v.p[0];
else if (dval == - 1)
*node = makenode(negtype, (char*)ep->v.p[0], 0);
else
dooper(node, mode);
rv = TRUE;
break;
}
break;
case en_mod:
case en_umod:
case en_asmod:
case en_asumod:
rv |= opt0(&(ep->v.p[0]));
rv |= opt0(&(ep->v.p[1]));
mode = getmode(ep->v.p[0], ep->v.p[1]);
switch (mode)
{
case 7:
if (!floatrecurse(ep->v.p[0]))
{
sc = pwrof2(ep->v.p[1]->v.i);
if (sc != - 1)
{
rv = TRUE;
ep->v.p[1]->v.i = mod_mask(sc);
if (ep->nodetype == en_asmod || ep->nodetype ==
en_asumod)
ep->nodetype = en_asand;
else
ep->nodetype = en_and;
break;
}
}
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 8:
dooper(node, mode);
rv = TRUE;
break;
}
break;
case en_asand:
rv |= opt0(&(ep->v.p[0]));
rv |= opt0(&(ep->v.p[1]));
mode = getmode(ep->v.p[0], ep->v.p[1]);
switch (mode)
{
case 1:
dooper(node, mode);
rv = TRUE;
break;
}
break;
case en_and:
rv |= opt0(&(ep->v.p[0]));
rv |= opt0(&(ep->v.p[1]));
mode = getmode(ep->v.p[0], ep->v.p[1]);
switch (mode)
{
case 1:
dooper(node, mode);
rv = TRUE;
break;
case 5:
if (ep->v.p[0]->v.i == 0)
{
addaside(ep->v.p[1]);
*node = ep->v.p[0];
}
else
dooper(node, mode);
rv = TRUE;
break;
case 7:
if (ep->v.p[1]->v.i == 0)
{
addaside(ep->v.p[0]);
*node = ep->v.p[1];
}
else
dooper(node, mode);
rv = TRUE;
break;
}
break;
case en_or:
case en_xor:
case en_asor:
case en_asxor:
rv |= opt0(&(ep->v.p[0]));
rv |= opt0(&(ep->v.p[1]));
mode = getmode(ep->v.p[0], ep->v.p[1]);
switch (mode)
{
case 1:
dooper(node, mode);
rv = TRUE;
break;
case 5:
if (ep->v.p[0]->v.i == 0)
{
*node = ep->v.p[1];
}
else
dooper(node, mode);
rv = TRUE;
break;
case 7:
if (ep->v.p[1]->v.i == 0)
{
*node = ep->v.p[0];
}
else
dooper(node, mode);
rv = TRUE;
break;
}
break;
case en_asrsh:
case en_rsh:
case en_lsh:
case en_arsh:
case en_alsh:
case en_arshd:
case en_aslsh:
case en_asarsh:
case en_asalsh:
case en_asarshd:
rv |= opt0(&(ep->v.p[0]));
if (isintconst(ep->v.p[0]->nodetype) && ep->v.p[1]->nodetype ==
en_cl_reg)
if (isintconst(ep->v.p[1]->v.p[0]->nodetype))
{
ep->v.p[1] = ep->v.p[1]->v.p[0];
rv = TRUE;
}
rv |= opt0(&(ep->v.p[1]));
mode = getmode(ep->v.p[0], ep->v.p[1]);
switch (mode)
{
case 1:
dooper(node, mode);
rv = TRUE;
break;
case 5:
if (ep->v.p[0]->v.i == 0)
{
addaside(ep->v.p[1]);
*node = ep->v.p[0];
}
else
dooper(node, mode);
rv = TRUE;
break;
case 7:
if (ep->v.p[1]->v.i == 0)
{
*node = ep->v.p[0];
}
else
dooper(node, mode);
rv = TRUE;
break;
}
break;
case en_land:
rv |= opt0(&(ep->v.p[0]));
rv |= opt0(&(ep->v.p[1]));
mode = getmode(ep->v.p[0], ep->v.p[1]);
switch (mode)
{
case 1:
*node = makeintnode(en_icon, (ep->v.p[0]->v.i && ep->v.p[1]
->v.i));
rv = TRUE;
break;
case 5:
if (ep->v.p[0]->v.i == 0)
{
addaside(ep->v.p[1]);
*node = makeintnode(en_icon, 0);
rv = TRUE;
}
break;
case 7:
if (ep->v.p[1]->v.i == 0)
{
addaside(ep->v.p[0]);
*node = makeintnode(en_icon, 0);
rv = TRUE;
}
break;
}
break;
case en_lor:
rv |= opt0(&(ep->v.p[0]));
rv |= opt0(&(ep->v.p[1]));
mode = getmode(ep->v.p[0], ep->v.p[1]);
switch (mode)
{
case 1:
*node = makeintnode(en_icon, (ep->v.p[0]->v.i || ep->v.p[1]
->v.i));
rv = TRUE;
break;
case 5:
if (ep->v.p[0]->v.i == 0)
{
addaside(ep->v.p[1]);
*node = makeintnode(en_icon, (ep->v.p[1]->v.i != 0));
rv = TRUE;
}
break;
case 7:
if (ep->v.p[1]->v.i == 0)
{
addaside(ep->v.p[0]);
*node = makeintnode(en_icon, (ep->v.p[1]->v.i != 0));
rv = TRUE;
}
break;
}
break;
case en_not:
rv |= opt0(&(ep->v.p[0]));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -