Annotation of coherent/b/bin/c/n1/i386/reg1.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * n1/i386/reg1.c
                      3:  * Machine specific parts of the register allocator.
                      4:  * i386.
                      5:  */
                      6: 
                      7: #ifdef   vax
                      8: #include "INC$LIB:cc1.h"
                      9: #else
                     10: #include "cc1.h"
                     11: #endif
                     12: 
                     13: /*
                     14:  * Select a register.
                     15:  * The argument 'tp' is the tree.
                     16:  * The argument 'c' is a context, which will be either 'PAIR' or 'ANY'.
                     17:  * The 'flag' is true if ANY should be resolved.
                     18:  */
                     19: regselect(tp, c, flag) TREE *tp; int c, flag;
                     20: {
                     21:        register REGDESC        *rp;
                     22:        register KIND           kind;
                     23:        register PREGSET        busy;
                     24:        register PERTYPE        *ptp;
                     25: 
                     26:        ptp = &pertype[tp->t_type];
                     27:        if (c == PAIR)
                     28:                kind = ptp->p_pair;
                     29:        else if (flag==0)
                     30:                return c;
                     31:        kind = ptp->p_kind;
                     32:        busy = curbusy;
                     33:        for (rp = &reg[FRREG]; rp<&reg[NRREG]; ++rp) {
                     34:                if ((rp->r_phys&busy) != 0)
                     35:                        continue;
                     36:                if (c == ANYL) {
                     37:                        if ((rp->r_lvalue&kind) == 0)
                     38:                                continue;
                     39:                } else {
                     40:                        if ((rp->r_rvalue&kind) == 0)
                     41:                                continue;
                     42:                }
                     43:                if (bytereg(tp, tp->t_patp) && (rp->r_phys&~(BEAX|BEBX|BECX|BEDX))!=0)
                     44:                        continue;
                     45:                return (rp - &reg[0]);
                     46:        }
                     47:        return -1;
                     48: }
                     49: 
                     50: /*
                     51:  * Return true if register 'r' is a usable temporary for tree 'tp'.
                     52:  */
                     53: isusable(tp, c, r) register TREE *tp; int c; register int r;
                     54: {
                     55:        register int    op;
                     56:        register KIND   kind;
                     57: 
                     58: #if !TINY
                     59:        if (sflag > 2)
                     60:                snapf("Isusable(%P, %C, %R)? ", tp, c, r);
                     61: #endif
                     62:        op = tp->t_op;
                     63:        kind = pertype[tp->t_type].p_kind;
                     64:        if (c == MLVALUE) {
                     65:                if ((reg[r].r_lvalue&kind) == 0)
                     66:                        goto no;
                     67:        } else {
                     68:                if ((reg[r].r_rvalue&kind) == 0)
                     69:                        goto no;
                     70:        }
                     71:        if (bytereg(tp, tp->t_patp) && (reg[r].r_phys&~(BEAX|BEBX|BECX|BEDX))!=0)
                     72:                goto no;
                     73: #if !TINY
                     74:        if (sflag > 2)
                     75:                snapf("yes\n");
                     76: #endif
                     77:        return 1;
                     78: no:
                     79: #if !TINY
                     80:        if (sflag > 2)
                     81:                snapf("no\n");
                     82: #endif
                     83:        return 0;
                     84: }
                     85: 
                     86: /*
                     87:  * Test if a pattern requires a byte register.
                     88:  * This prevents e.g. applying the LO LO macro to EDI or ESI.
                     89:  * The first argument is archaic.
                     90:  * dgc kludged the i8086 compiler source to look at tp
                     91:  * to decide if the tree needed a byte register.
                     92:  * steve added the PBYTE pattern flag for the i386 compiler,
                     93:  * so bytereg() now looks at the pattern instead of at the tree.
                     94:  * Only patterns with BYTE left or right arg types require byte registers.
                     95:  * The tp argument is retained to maintain compatiblity
                     96:  * with other machine-dependent sources, namely i8086.
                     97:  */
                     98: int
                     99: bytereg(tp, patp) register TREE *tp; register PAT *patp;
                    100: {
                    101:        register INDEX index;
                    102:        register TREE *rp;
                    103: 
                    104:        index = patp->p_flag;
                    105:        return (index != 0 && (patcache[index-1] & PBYTE) != 0
                    106:                && (isbyte(tp->t_lp->t_type)
                    107:                  || ((rp = tp->t_rp) != NULL && isbyte(rp->t_type))));
                    108: }
                    109: 
                    110: /* end of n1/i386/reg1.c */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.