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

📄 igcse.c

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 C
📖 第 1 页 / 共 3 页
字号:
                case i_setc:
                case i_seta:
                case i_setnc:
                case i_setbe:
                case i_setl:
                case i_setg:
                case i_setle:
                case i_setge:
                    // do available for this expression
                    if (list->available)
                    {
                        if (!isvolatile(list))
                            setbit(l->p_agen, list->available - 1);
                        clearbit(l->p_akill, list->available - 1);
                    }
                    // invalidate available for previous uses of variable
                    if (list->ans)
                    {
                        l1 = findans(availhash, list->ans);
                        while (l1)
                        {
                            clearbit(l->p_agen, (int)l1->data - 1);
                            setbit(l->p_akill, (int)l1->data - 1);
                            l1 = l1->link;
                        }
                    }
                    // take pointers into account for avail & reaching
                    if (list->ans->mode == i_ind)
                    {
                        BYTE *t4;
                        ptr = findPointer(list->ans);
                        if (ptr < pointer_count)
                        {
                            t4 = temparray4 + ptr * sourcebytes;
                            if (isset(t4, 0))
                            {
                                memset(l->p_akill, 0xff, avail_bytes);
                                memset(l->p_agen, 0, avail_bytes);
                            }
                            else
                            {
                                for (j = 1; j < source_count; j++)
                                {
                                    if (isset(t4, j))
                                    {
                                        if (sourcearray[j])
                                        {
                                            SYM *sp = varsp(sourcearray[j]
                                                ->dc.left->offset);
                                            if (sp)
                                            {
                                                l1 = findans(availhash, sp
                                                    ->imvalue);
                                                while (l1)
                                                {
                                                    clearbit(l->p_agen, (int)l1
                                                        ->data - 1);
                                                    setbit(l->p_akill, (int)l1
                                                        ->data - 1);
                                                    gencount++;
                                                    l1 = l1->link;
                                                }
                                            }
                                            if (sourcearray[j]->dc.right)
                                            {
                                                sp = varsp(sourcearray[j]
                                                    ->dc.right->offset);
                                                if (sp)
                                                {
                                                    l1 = findans(availhash, sp
                                                        ->imvalue);
                                                    while (l1)
                                                    {
                                                        clearbit(l->p_agen, 
                                                            (int)l1->data - 1);
                                                        setbit(l->p_akill, (int)
                                                            l1->data - 1);
                                                        gencount++;
                                                        l1 = l1->link;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        // if we changed a pointer, invalidate further uses of
                        // the pointer
                        ptr = findPointer(list->ans);
                        if (ptr < pointer_count)
                        {
                            SYM *sp = varsp(list->ans);
                            if (sp)
                            {
                                l1 = findans(availhash, sp->imind);
                                while (l1)
                                {
                                    clearbit(l->p_agen, (int)l1->data - 1);
                                    setbit(l->p_akill, (int)l1->data - 1);
                                    l1 = l1->link;
                                }
                            }
                        }
                    }
                    // FALLTHROUGH
                case i_coswitch:
                case i_jc:
                case i_ja:
                case i_je:
                case i_jnc:
                case i_jbe:
                case i_jne:
                case i_jl:
                case i_jg:
                case i_jle:
                case i_jge:
                case i_parm:
                    if (list->dc.opcode == i_parm)
                    {
                        SYM *sp = varsp(list->dc.left);
                        if (sp && list->dc.left->mode == i_immed)
                        {
                            if (list->dc.left->mode == i_immed)
                            {
                                l1 = findans(availhash, sp->imvalue);
                                while (l1)
                                {
                                    clearbit(l->p_agen, (int)l1->data - 1);
                                    setbit(l->p_akill, (int)l1->data - 1);
                                    l1 = l1->link;
                                }
                            }
                        }
                        else if (sp && list->dc.left->mode == i_direct)
                        {
                            ptr = findPointer(list->dc.left);
                            if (ptr < pointer_count)
                            {
                                BYTE *t4 = temparray4 + ptr * sourcebytes;
                                if (isset(t4, 0))
                                {
                                    memset(l->p_akill, 0xff, avail_bytes);
                                    memset(l->p_agen, 0, avail_bytes);
                                }
                                else
                                {
                                    for (j = 1; j < source_count; j++)
                                    {
                                        if (isset(t4, j))
                                        {
                                            SYM *sp = varsp(sourcearray[j]
                                                ->dc.left->offset);
                                            if (sp)
                                            {
                                                l1 = findans(availhash, sp
                                                    ->imvalue);
                                                while (l1)
                                                {
                                                    clearbit(l->p_agen, (int)l1
                                                        ->data - 1);
                                                    setbit(l->p_akill, (int)l1
                                                        ->data - 1);
                                                    gencount++;
                                                    l1 = l1->link;
                                                }
                                            }
                                            if (sourcearray[j]->dc.right)
                                            {
                                                sp = varsp(sourcearray[j]
                                                    ->dc.right->offset);
                                                if (sp)
                                                {
                                                    l1 = findans(availhash, sp
                                                        ->imvalue);
                                                    while (l1)
                                                    {
                                                        clearbit(l->p_agen, 
                                                            (int)l1->data - 1);
                                                        setbit(l->p_akill, (int)
                                                            l1->data - 1);
                                                        gencount++;
                                                        l1 = l1->link;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                case i_gosub:
                    // kill globals
                    for (j = 0; j < avail_count; j++)
                    {
                        IMODE *s = availarray[j]->dc.left;
                        if (s && s->offset)
                        {
                            switch (s->offset->nodetype)
                            {
                            case en_nacon:
                            case en_napccon:
                            case en_nalabcon:
                            case en_labcon:
                            case en_absacon:
                                if (s->mode == i_direct)
                                {
                                    l1 = findans(availhash, list->ans);
                                    while (l1)
                                    {
                                        clearbit(l->p_agen, (int)l1->data - 1);
                                        setbit(l->p_akill, (int)l1->data - 1);
                                        l1 = l1->link;
                                    }
                                }
                                else if (s->mode == i_ind)
                                {
                                    BYTE *t4;
                                    ptr = findPointer(list->ans);
                                    if (ptr < pointer_count)
                                    {
                                        t4 = temparray4 + ptr * sourcebytes;
                                        if (isset(t4, 0))
                                        {
                                            memset(l->p_akill, 0xff,
                                                avail_bytes);
                                            memset(l->p_agen, 0, avail_bytes);
                                        }
                                        else
                                        {
                                            for (k = 1; k < source_count; k++)
                                            {
                                                if (isset(t4, k))
                                                {
                                                    SYM *sp = varsp
                                                        (sourcearray[k]
                                                        ->dc.left->offset);
                                                    if (sp)
                                                    {
                                                        l1 = findans(availhash,
                                                            sp->imvalue);
                                                        while (l1)
                                                        {
                                                            clearbit(l->p_agen,
                                                                (int)l1->data -
                                                                1);
                                                            setbit(l->p_akill, 
                                                                (int)l1->data -
                                                                1);
                                                            gencount++;
                                                            l1 = l1->link;
                                                        }
                                                    }
                                                    if (sourcearray[k]
                                                        ->dc.right)
                                                    {
                                                        sp = varsp
                                                            (sourcearray[k]
                                                            ->dc.right->offset);
                                                        if (sp)
                                                        {
                                                            l1 = findans
                                                                (availhash, sp
                                                                ->imvalue);
                                                            while (l1)
                                                            {
                                                                clearbit(l
                                                                    ->p_agen, 
                                                                    (int)l1
                                                                    ->data - 1);
                                                                setbit(l
                                                                    ->p_akill, 
                                                                    (int)l1
                                                                    ->data - 1);
                                                                gencount++;
                                                                l1 = l1->link;
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        s = availarray[j]->dc.right;
                        if (s && s->offset)
                        {
                            switch (s->offset->nodetype)
                            {
                            case en_nacon:
                            case en_napccon:
                            case en_nalabcon:
                            case en_labcon:
                            case en_absacon:
                                if (s->mode == i_direct)
                                {
                                    l1 = findans(availhash, list->ans);
                                    while (l1)
                                    {
                                        clearbit(l->p_agen, (int)l1->data - 1);
                                        setbit(l->p_akill, (int)l1->data - 1);
                                        l1 = l1->link;
                                    }
                                }
                                else if (s->mode == i_ind)
                                {
                                    BYTE *t4;
                                    ptr = findPointer(list->ans);
                                    if (ptr < pointer_count)
                                    {
                                        t4 = temparray4 + ptr * sourcebytes;
                                        if (isset(t4, 0))
                                        {
                                            memset(l->p_akill, 0xff,
                                                avail_bytes);
                                            memset(l->p_agen, 0, avail_bytes);
                                        }
                                        else
                                        {
                                            for (k = 1; k < source_count; k++)
                                            {
                                                if (isset(t4, k))
                                                {
                                                    SYM *sp = varsp
                                                        (sourcearray[k]
                                                        ->dc.left->offset);
                                                    if (sp)
                                                    {
                                                        l1 = findans(availhash,
                                                            sp->imvalue);
                                                        while (l1)
                                                        {
                                                            clearbit(l->p_agen,
                                                                (int)l1->data -
                                                                1);
                                                            setbit(l->p_akill, 
                                                                (int)l1->data -
                                                                1);
                                                            gencount++;
                                                            l1 = l1->link;
                                                        }
                                                    }
                                                    if (sourcearray[k]
                                                        ->dc.right)
                                                    {
                                                        sp = varsp
                                                            (sourcearray[k]
                                                            ->dc.right->offset);
                                                        if (sp)
                                                        {
                                                            l1 = findans
                                                                (availhash, sp
                                                                ->imvalue);
                                                            while (l1)
                                                            {
                                                                clearbit(l
                                                                    ->p_agen, 
                                                                    (int)l1
                                                                    ->data - 1);
                                                                setbit(l
                                                                    ->p_akill, 
                                                                    (int)l1
                                                                    ->data - 1);
                                                                gencount++;
                                                                l1 = l1->link;
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
            }
            if (!skipptr)
                ptrindex(list, l, temparray4);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -