⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iconst.c

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 C
📖 第 1 页 / 共 3 页
字号:
                {
					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 + -