Annotation of 43BSD/lib/mip/pass2.h, revision 1.1.1.1

1.1       root        1: /*     pass2.h 4.1     85/03/19        */
                      2: 
                      3: #ifndef _PASS2_
                      4: #define        _PASS2_
                      5: 
                      6: #include "macdefs.h"
                      7: #include "mac2defs.h"
                      8: #include "manifest.h"
                      9: 
                     10: /* cookies, used as arguments to codgen */
                     11: #define FOREFF 01              /* compute for effects only */
                     12: #define INAREG 02              /* compute into a register */
                     13: #define INTAREG        04              /* compute into a scratch register */
                     14: #define INBREG 010             /* compute into a lvalue register */
                     15: #define INTBREG 020            /* compute into a scratch lvalue register */
                     16: #define FORCC  040             /* compute for condition codes only */
                     17: #define INTEMP 010000          /* compute into a temporary location */
                     18: #define FORARG 020000          /* compute for an argument of a function */
                     19: #define FORREW 040000          /* search the table for a rewrite rule */
                     20: 
                     21: /*
                     22:  * OP descriptors,
                     23:  * the ASG operator may be used on some of these
                     24:  */
                     25: #define OPSIMP 010000          /* +, -, &, |, ^ */
                     26: #define OPCOMM 010002          /* +, &, |, ^ */
                     27: #define OPMUL  010004          /* *, / */
                     28: #define OPDIV  010006          /* /, % */
                     29: #define OPUNARY        010010          /* unary ops */
                     30: #define OPLEAF 010012          /* leaves */
                     31: #define OPANY  010014          /* any op... */
                     32: #define OPLOG  010016          /* logical ops */
                     33: #define OPFLOAT        010020          /* +, -, *, or / (for floats) */
                     34: #define OPSHFT 010022          /* <<, >> */
                     35: #define OPLTYPE        010024          /* leaf type nodes (e.g, NAME, ICON, etc.) */
                     36: 
                     37: /* match returns */
                     38: #define MNOPE  010000          /* no match generated */
                     39: #define MDONE  010001          /* done evalution */
                     40: 
                     41: /* shapes */
                     42: #define SANY   01              /* same as FOREFF */
                     43: #define SAREG  02              /* same as INAREG */
                     44: #define STAREG 04              /* same as INTAREG */
                     45: #define SBREG  010             /* same as INBREG */
                     46: #define STBREG 020             /* same as INTBREG */
                     47: #define SCC    040             /* same as FORCC */
                     48: #define SNAME  0100            /* name */
                     49: #define SCON   0200            /* constant */
                     50: #define SFLD   0400            /* field */
                     51: #define SOREG  01000           /* offset from register */
                     52: /* indirection or wild card shapes */
                     53: #ifndef WCARD1
                     54: #define STARNM 02000           /* indirect through name */
                     55: #endif
                     56: #ifndef WCARD2
                     57: #define STARREG        04000           /* indirect through register */
                     58: #endif
                     59: #define SWADD  040000          /* word address */
                     60: #define SPECIAL        0100000         /* special stuff (follows) */
                     61: #define SZERO  SPECIAL         /* constant zero */
                     62: #define SONE   (SPECIAL|1)     /* constant +1 */
                     63: #define SMONE  (SPECIAL|2)     /* constant -1 */
                     64: #define SCCON  (SPECIAL|3)     /* -256 <= constant < 256 */
                     65: #define SSCON  (SPECIAL|4)     /* -32768 <= constant < 32768 */
                     66: #define SSOREG (SPECIAL|5)     /* non-indexed OREG */
                     67: /* FORARG and INTEMP are carefully not conflicting with shapes */
                     68: 
                     69: /* types */
                     70: #define TCHAR          01      /* char */
                     71: #define TSHORT         02      /* short */
                     72: #define TINT           04      /* int */
                     73: #define TLONG          010     /* long */
                     74: #define TFLOAT         020     /* float */
                     75: #define TDOUBLE                040     /* double */
                     76: #define TPOINT         0100    /* pointer to something */
                     77: #define TUCHAR         0200    /* unsigned char */
                     78: #define TUSHORT                0400    /* unsigned short */
                     79: #define TUNSIGNED      01000   /* unsigned int */
                     80: #define TULONG         02000   /* unsigned long */
                     81: #define TPTRTO         04000   /* pointer to one of the above */
                     82: #define TANY           010000  /* matches anything within reason */
                     83: #define TSTRUCT                020000  /* structure or union */
                     84: 
                     85: /* reclamation cookies */
                     86: #define RNULL          0       /* clobber result */
                     87: #define RLEFT          01      /* reclaim left resource */
                     88: #define RRIGHT         02      /* reclaim right resource */
                     89: #define RESC1          04      /* reclaim resource allocated #1 */
                     90: #define RESC2          010     /* reclaim resource allocated #2 */
                     91: #define RESC3          020     /* reclaim resource allocated #3 */
                     92: #define RESCC          04000   /* reclaim condition codes */
                     93: #define RNOP           010000  /* DANGER: can cause loops.. */
                     94: 
                     95: /* needs */
                     96: #define NAREG          01      /* need an A register */
                     97: #define NACOUNT                03      /* count mask of A registers */
                     98: #define NAMASK         017     /* A register need field mask */
                     99: #define NASL           04      /* need A register shared with left resource */
                    100: #define NASR           010     /* need A register shared with right resource */
                    101: #define NBREG          020     /* need a B register */
                    102: #define NBCOUNT                060     /* count mask of B register */
                    103: #define NBMASK         0360    /* B register need field mask */
                    104: #define NBSL           0100    /* need B register shared with left resource */
                    105: #define NBSR           0200    /* need B register shared with right resource */
                    106: #define NTEMP          0400    /* need temporary storage location */
                    107: #define NTMASK         07400   /* count mask of temporary storage locations */
                    108: #define REWRITE                010000  /* need rewrite */
                    109: #define EITHER         040000  /* allocate all resources or nothing */
                    110: 
                    111: #define MUSTDO         010000  /* force register requirements */
                    112: #ifndef NOPREF
                    113: /* also defined in onepass.h */
                    114: #define NOPREF         020000  /* no preference for register assignment */
                    115: #endif
                    116: 
                    117: /* register allocation */
                    118: extern int rstatus[];          /* register status info */
                    119: extern int busy[];             /* register use info */
                    120: extern struct respref {
                    121:        int     cform;
                    122:        int     mform;
                    123: } respref[];                   /* resource preference rules */
                    124: 
                    125: #define isbreg(r)      (rstatus[r]&SBREG)
                    126: #define istreg(r)      (rstatus[r]&(STBREG|STAREG))
                    127: #define istnode(p)     (p->in.op==REG && istreg(p->tn.rval))
                    128: 
                    129: #define TBUSY          01000   /* register temporarily busy (during alloc) */
                    130: #define REGLOOP(i)     for (i = 0; i < REGSZ; ++i)
                    131: 
                    132: extern NODE *deltrees[DELAYS]; /* trees held for delayed evaluation */
                    133: extern int deli;               /* mmmmm */
                    134: 
                    135: #define SETSTO(x,y)    (stotree = (x), stocook = (y))
                    136: extern int stocook;
                    137: extern NODE *stotree;
                    138: extern int callflag;
                    139: 
                    140: extern int fregs;
                    141: 
                    142: #ifndef ONEPASS
                    143: #include "ndu.h"
                    144: #endif
                    145: 
                    146: extern NODE node[];
                    147: 
                    148: /* code tables */
                    149: extern struct optab {
                    150:        int     op;                     /* operator to match */
                    151:        int     visit;                  /* goal to match */
                    152:        int     lshape;                 /* left shape to match */
                    153:        int     ltype;                  /* left type to match */
                    154:        int     rshape;                 /* right shape to match */
                    155:        int     rtype;                  /* right type to match */
                    156:        int     needs;                  /* resource required */
                    157:        int     rewrite;                /* how to rewrite afterwards */
                    158:        char    *cstring;               /* code generation template */
                    159: } table[];
                    160: 
                    161: extern NODE resc[];
                    162: 
                    163: extern OFFSZ tmpoff;
                    164: extern OFFSZ maxoff;
                    165: extern OFFSZ baseoff;
                    166: extern OFFSZ maxtemp;
                    167: extern int maxtreg;
                    168: extern int ftnno;
                    169: extern int rtyflg;
                    170: extern int nrecur;             /* flag to keep track of recursions */
                    171: 
                    172: extern NODE
                    173:        *talloc(),
                    174:        *eread(),
                    175:        *tcopy(),
                    176:        *getlr();
                    177: 
                    178: extern CONSZ rdin();
                    179: extern int eprint();
                    180: extern char *rnames[];
                    181: 
                    182: extern int lineno;
                    183: extern char filename[];
                    184: extern int fldshf, fldsz;
                    185: extern int lflag, xdebug, udebug, edebug, odebug;
                    186: extern int rdebug, radebug, tdebug, sdebug;
                    187: #ifdef FORT
                    188: extern int Oflag;
                    189: #endif
                    190: 
                    191: #ifndef callchk
                    192: #define callchk(x) allchk()
                    193: #endif
                    194: 
                    195: #ifndef PUTCHAR
                    196: #define PUTCHAR(x) putchar(x)
                    197: #endif
                    198: 
                    199: /* macros for doing double indexing */
                    200: #define R2PACK(x,y,z)  (0200*((x)+1)+y+040000*z)       /* pack 3 regs */
                    201: #define R2UPK1(x)      ((((x)>>7)-1)&0177)             /* unpack reg 1 */
                    202: #define R2UPK2(x)      ((x)&0177)                      /* unpack reg 2 */
                    203: #define R2UPK3(x)      (x>>14)                         /* unpack reg 3 */
                    204: #define R2TEST(x)      ((x)>=0200)                     /* test if packed */
                    205: 
                    206: #ifdef MULTILEVEL
                    207: union  mltemplate {
                    208:        struct ml_head {
                    209:                int     tag;                    /* tree class */
                    210:                int     subtag;                 /* subclass of tree */
                    211:                union   mltemplate *nexthead;   /* linked by mlinit() */
                    212:        } mlhead;
                    213:        struct ml_node {
                    214:                int     op;                     /* operator or op description */
                    215:                int     nshape;                 /* node shape */
                    216:                /*
                    217:                 * Both op and nshape must match the node.
                    218:                 * where the work is to be done entirely by
                    219:                 * op, nshape can be SANY, visa versa, op can
                    220:                 * be OPANY.
                    221:                 */
                    222:                int     ntype;                  /* type descriptor */
                    223:        } mlnode;
                    224: };
                    225: extern union mltemplate mltree[];
                    226: #endif
                    227: #endif

unix.superglobalmegacorp.com

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