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

📄 optimize.c

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