📄 iconst.c
字号:
{
ReassignInt(d,0);
}
break;
case icnl:
if (shift = calmask(right->i))
{
ReassignMulDiv(d,i_and,shift,FALSE);
}
break;
default:
badconst();
break;
}
break;
case i_umul:
case i_arrayindex:
index = xgetmode(d, &left, &right);
switch (index)
{
case icll:
ReassignInt(d,(unsigned LLONG_TYPE)left->i *(unsigned LLONG_TYPE)right->i);
break;
case iclr:
ReassignFloat(d,(unsigned LLONG_TYPE)left->i * right->f);
break;
case icrl:
ReassignFloat(d,left->f *(unsigned LLONG_TYPE)right->i);
break;
case icrr:
ReassignFloat(d,left->f * right->f);
break;
case icln:
if ((unsigned LLONG_TYPE)left->i == 0)
{
ReassignInt(d,0);
}
else if ((unsigned LLONG_TYPE)left->i == 1)
{
ASNFromRight(d);
}
else if ((shift = pwrof2((unsigned LLONG_TYPE)left->i)) != - 1)
{
ReassignMulDiv(d,i_lsl,shift,TRUE); }
break;
case icrn:
if (left->f == 0)
{
ReassignFloat(d,0);
}
else if ((unsigned LLONG_TYPE)left->i == 1)
{
ASNFromRight(d);
}
break;
case icnl:
if ((unsigned LLONG_TYPE)right->i == 0)
{
ReassignInt(d,0);
}
else if ((unsigned LLONG_TYPE)right->i == 1)
{
ASNFromLeft(d);
}
else if ((shift = pwrof2((unsigned LLONG_TYPE)right->i)) != - 1)
{
ReassignMulDiv(d,i_lsl,shift,FALSE);
}
break;
case icnr:
if (right->f == 0)
{
ReassignFloat(d,0);
}
else if ((unsigned LLONG_TYPE)right->i == 1)
{
ASNFromLeft(d);
}
break;
}
break;
case i_smul:
index = xgetmode(d, &left, &right);
switch (index)
{
case icll:
ReassignInt(d,left->i * right->i);
break;
case iclr:
ReassignFloat(d,left->i * right->f);
break;
case icrl:
ReassignFloat(d,left->f * right->i);
break;
case icrr:
ReassignFloat(d,left->f * right->f);
break;
case icln:
if (left->i == 0)
{
ReassignInt(d,0);
}
else if (left->i == 1)
{
ASNFromRight(d);
}
else if ((shift = pwrof2(left->i)) != - 1)
{
ReassignMulDiv(d,i_lsl,shift,TRUE);
}
break;
case icrn:
if (left->f == 0)
{
ReassignFloat(d,0);
}
else if (left->i == 1)
{
ASNFromRight(d);
}
break;
case icnl:
if (right->i == 0)
{
ReassignInt(d,0);
}
else if (right->i == 1)
{
ASNFromLeft(d);
}
else if ((shift = pwrof2(right->i)) != - 1)
{
ReassignMulDiv(d,i_lsl,shift,FALSE);
}
break;
case icnr:
if (right->f == 0)
{
ReassignFloat(d,0);
}
else if (right->i == 1)
{
ASNFromLeft(d);
}
break;
}
break;
case i_lsl:
index = xgetmode(d, &left, &right);
switch (index)
{
case icnone:
break;
case icll:
ReassignInt(d,(unsigned LLONG_TYPE)left->i << (unsigned LLONG_TYPE)right->i);
break;
case icln:
if (left->i == 0)
{
ReassignInt(d,0);
}
break;
case icnl:
if (right->i == 0)
{
ASNFromLeft(d);
}
break;
default:
badconst();
break;
}
break;
case i_lsr:
index = xgetmode(d, &left, &right);
switch (index)
{
case icnone:
break;
case icll:
ReassignInt(d, (unsigned LLONG_TYPE)left->i >> (unsigned LLONG_TYPE)right->i);
break;
case icln:
if (left->i == 0)
{
ReassignInt(d,0);
}
break;
case icnl:
if (right->i == 0)
{
ASNFromLeft(d);
}
break;
default:
badconst();
break;
}
break;
case i_asl:
index = xgetmode(d, &left, &right);
switch (index)
{
case icnone:
break;
case icll:
ReassignInt(d, left->i << right->i);
break;
case icln:
if (left->i == 0)
{
ReassignInt(d,0);
}
break;
case icnl:
if (right->i == 0)
{
ASNFromLeft(d);
}
break;
default:
badconst();
break;
}
break;
case i_asr:
index = xgetmode(d, &left, &right);
switch (index)
{
case icnone:
break;
case icll:
ReassignInt(d, left->i >> right->i);
break;
case icln:
if (left->i == 0)
{
ReassignInt(d,0);
}
break;
case icnl:
if (right->i == 0)
{
ASNFromLeft(d);
}
break;
default:
badconst();
break;
}
break;
case i_and:
index = xgetmode(d, &left, &right);
switch (index)
{
case icnone:
break;
case icll:
ReassignInt(d,left->i & right->i);
break;
case icln:
if (left->i == 0)
{
ReassignInt(d,0);
}
break;
case icnl:
if (right->i == 0)
{
ReassignInt(d,0);
}
break;
default:
badconst();
break;
}
break;
case i_or:
index = xgetmode(d, &left, &right);
switch (index)
{
case icnone:
break;
case icll:
ReassignInt(d, left->i | right->i);
break;
case icln:
if (left->i == 0)
{
ASNFromRight(d);
}
break;
case icnl:
if (right->i == 0)
{
ASNFromLeft(d);
}
break;
default:
badconst();
break;
}
break;
case i_eor:
index = xgetmode(d, &left, &right);
switch (index)
{
case icnone:
break;
case icll:
ReassignInt(d, left->i ^ right->i);
break;
case icln:
if (left->i == 0)
{
ASNFromRight(d);
}
break;
case icnl:
if (right->i == 0)
{
ASNFromLeft(d);
}
break;
default:
badconst();
break;
}
break;
case i_neg:
index = xgetmode(d, &left, &right);
switch (index)
{
case icnone:
break;
case icln:
ReassignInt(d,-d->dc.v.i);
break;
case icrn:
ReassignFloat(d,-d->dc.v.f);
break;
}
break;
case i_not:
index = xgetmode(d, &left, &right);
switch (index)
{
case icnone:
break;
case icln:
ReassignInt(d,~d->dc.v.i);
break;
}
break;
}
if (d->dc.opcode == i_assn) {
// propagate constants and resolve casts to constants
if (d->ans->mode == i_direct && d->ans->offset->nodetype == en_tempref && !(d->livein & IM_LIVELEFT)) {
QUAD *q = d->dc.left ;
if (q->dc.opcode == i_icon || q->dc.opcode == i_fcon || q->dc.opcode == i_imcon || q->dc.opcode == i_cxcon) {
ReCast(d->ans->size, q, d->dc.left );
} else if (q->dc.opcode == i_assn && !(q->livein & IM_LIVELEFT)) {
q = q->dc.left;
if (q->dc.opcode == i_icon || q->dc.opcode == i_fcon || q->dc.opcode == i_imcon || q->dc.opcode == i_cxcon) {
if (d->ans->size == d->dc.left->size)
d->dc.left = q;
else
ReCast(d->ans->size, q, d->dc.left);
}
}
}
#endif
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -