BSD 4_3_Reno development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Wed, 9 Dec 1987 17:18:29 +0000 (09:18 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Wed, 9 Dec 1987 17:18:29 +0000 (09:18 -0800)
Work on file usr/src/libexec/pcc/mip/pass2.h

Synthesized-from: CSRG/cd2/4.3reno

usr/src/libexec/pcc/mip/pass2.h [new file with mode: 0644]

diff --git a/usr/src/libexec/pcc/mip/pass2.h b/usr/src/libexec/pcc/mip/pass2.h
new file mode 100644 (file)
index 0000000..1c0c526
--- /dev/null
@@ -0,0 +1,231 @@
+/*     pass2.h 4.4     87/12/10        */
+
+#ifndef _PASS2_
+#define        _PASS2_
+
+#include "macdefs.h"
+#include "mac2defs.h"
+#include "manifest.h"
+
+/* cookies, used as arguments to codgen */
+#define FOREFF 01              /* compute for effects only */
+#define INAREG 02              /* compute into a register */
+#define INTAREG        04              /* compute into a scratch register */
+#define INBREG 010             /* compute into a lvalue register */
+#define INTBREG 020            /* compute into a scratch lvalue register */
+#define FORCC  040             /* compute for condition codes only */
+#define INTEMP 010000          /* compute into a temporary location */
+#define FORARG 020000          /* compute for an argument of a function */
+#define FORREW 040000          /* search the table for a rewrite rule */
+
+/*
+ * OP descriptors,
+ * the ASG operator may be used on some of these
+ */
+#define OPSIMP 010000          /* +, -, &, |, ^ */
+#define OPCOMM 010002          /* +, &, |, ^ */
+#define OPMUL  010004          /* *, / */
+#define OPDIV  010006          /* /, % */
+#define OPUNARY        010010          /* unary ops */
+#define OPLEAF 010012          /* leaves */
+#define OPANY  010014          /* any op... */
+#define OPLOG  010016          /* logical ops */
+#define OPFLOAT        010020          /* +, -, *, or / (for floats) */
+#define OPSHFT 010022          /* <<, >> */
+#define OPLTYPE        010024          /* leaf type nodes (e.g, NAME, ICON, etc.) */
+
+/* match returns */
+#define MNOPE  010000          /* no match generated */
+#define MDONE  010001          /* done evalution */
+
+/* shapes */
+#define SANY   01              /* same as FOREFF */
+#define SAREG  02              /* same as INAREG */
+#define STAREG 04              /* same as INTAREG */
+#define SBREG  010             /* same as INBREG */
+#define STBREG 020             /* same as INTBREG */
+#define SCC    040             /* same as FORCC */
+#define SNAME  0100            /* name */
+#define SCON   0200            /* constant */
+#define SFLD   0400            /* field */
+#define SOREG  01000           /* offset from register */
+/* indirection or wild card shapes */
+#ifndef WCARD1
+#define STARNM 02000           /* indirect through name */
+#endif
+#ifndef WCARD2
+#define STARREG        04000           /* indirect through register */
+#endif
+#define SWADD  040000          /* word address */
+#define SPECIAL        0100000         /* special stuff (follows) */
+#define SZERO  SPECIAL         /* constant zero */
+#define SONE   (SPECIAL|1)     /* constant +1 */
+#define SMONE  (SPECIAL|2)     /* constant -1 */
+#define SCCON  (SPECIAL|3)     /* -256 <= constant < 256 */
+#define SSCON  (SPECIAL|4)     /* -32768 <= constant < 32768 */
+#define SSOREG (SPECIAL|5)     /* non-indexed OREG */
+#define SMCON  (SPECIAL|6)     /* constant < 0 */
+/* FORARG and INTEMP are carefully not conflicting with shapes */
+
+/* types */
+#define TCHAR          01      /* char */
+#define TSHORT         02      /* short */
+#define TINT           04      /* int */
+#define TLONG          010     /* long */
+#define TFLOAT         020     /* float */
+#define TDOUBLE                040     /* double */
+#define TPOINT         0100    /* pointer to something */
+#define TUCHAR         0200    /* unsigned char */
+#define TUSHORT                0400    /* unsigned short */
+#define TUNSIGNED      01000   /* unsigned int */
+#define TULONG         02000   /* unsigned long */
+#define TPTRTO         04000   /* pointer to one of the above */
+#define TANY           010000  /* matches anything within reason */
+#define TSTRUCT                020000  /* structure or union */
+
+/* reclamation cookies */
+#define RNULL          0       /* clobber result */
+#define RLEFT          01      /* reclaim left resource */
+#define RRIGHT         02      /* reclaim right resource */
+#define RESC1          04      /* reclaim resource allocated #1 */
+#define RESC2          010     /* reclaim resource allocated #2 */
+#define RESC3          020     /* reclaim resource allocated #3 */
+#define RESCC          04000   /* reclaim condition codes */
+#define RNOP           010000  /* DANGER: can cause loops.. */
+
+/* needs */
+#define NAREG          01      /* need an A register */
+#define NACOUNT                03      /* count mask of A registers */
+#define NAMASK         017     /* A register need field mask */
+#define NASL           04      /* need A register shared with left resource */
+#define NASR           010     /* need A register shared with right resource */
+#define NBREG          020     /* need a B register */
+#define NBCOUNT                060     /* count mask of B register */
+#define NBMASK         0360    /* B register need field mask */
+#define NBSL           0100    /* need B register shared with left resource */
+#define NBSR           0200    /* need B register shared with right resource */
+#define NTEMP          0400    /* need temporary storage location */
+#define NTMASK         07400   /* count mask of temporary storage locations */
+#define REWRITE                010000  /* need rewrite */
+#define EITHER         040000  /* allocate all resources or nothing */
+
+#define MUSTDO         010000  /* force register requirements */
+#ifndef NOPREF
+/* also defined in onepass.h */
+#define NOPREF         020000  /* no preference for register assignment */
+#endif
+#define        NEVEN           0100000 /* even register required */
+
+/* register allocation */
+extern int rstatus[];          /* register status info */
+extern int busy[];             /* register use info */
+extern struct respref {
+       int     cform;
+       int     mform;
+} respref[];                   /* resource preference rules */
+
+#define isbreg(r)      (rstatus[r]&SBREG)
+#define istreg(r)      (rstatus[r]&(STBREG|STAREG))
+#define istnode(p)     (p->in.op==REG && istreg(p->tn.rval))
+
+#define TBUSY          01000   /* register temporarily busy (during alloc) */
+#define PBUSY          02000   /* this reg and next one are used as a pair */
+#define ISBUSY(r)      (((busy[r])&(PBUSY-1)) > 1)
+#define REGLOOP(i)     for (i = 0; i < REGSZ; ++i)
+
+extern NODE *deltrees[DELAYS]; /* trees held for delayed evaluation */
+extern int deli;               /* mmmmm */
+
+#define SETSTO(x,y)    (stotree = (x), stocook = (y))
+extern int stocook;
+extern NODE *stotree;
+extern int callflag;
+
+extern int fregs;
+
+#ifndef ONEPASS
+#include "ndu.h"
+#endif
+
+extern NODE node[];
+
+/* code tables */
+extern struct optab {
+       int     op;                     /* operator to match */
+       int     visit;                  /* goal to match */
+       int     lshape;                 /* left shape to match */
+       int     ltype;                  /* left type to match */
+       int     rshape;                 /* right shape to match */
+       int     rtype;                  /* right type to match */
+       int     needs;                  /* resource required */
+       int     rewrite;                /* how to rewrite afterwards */
+       char    *cstring;               /* code generation template */
+} table[];
+
+extern NODE resc[];
+
+extern OFFSZ tmpoff;
+extern OFFSZ maxoff;
+extern OFFSZ baseoff;
+extern OFFSZ maxtemp;
+extern int maxtreg;
+extern int ftnno;
+extern int rtyflg;
+extern int nrecur;             /* flag to keep track of recursions */
+
+extern NODE
+       *talloc(),
+       *eread(),
+       *tcopy(),
+       *getlr();
+
+extern CONSZ rdin();
+extern int eprint();
+extern char *rnames[];
+
+extern int lineno;
+extern char filename[];
+extern int fldshf, fldsz;
+extern int lflag, xdebug, udebug, edebug, odebug;
+extern int rdebug, radebug, tdebug, sdebug;
+#ifdef FORT
+extern int Oflag;
+#endif
+
+#ifndef callchk
+#define callchk(x) allchk()
+#endif
+
+#ifndef PUTCHAR
+#define PUTCHAR(x) putchar(x)
+#endif
+
+/* macros for doing double indexing */
+#define R2PACK(x,y,z)  (0200*((x)+1)+y+040000*z)       /* pack 3 regs */
+#define R2UPK1(x)      ((((x)>>7)-1)&0177)             /* unpack reg 1 */
+#define R2UPK2(x)      ((x)&0177)                      /* unpack reg 2 */
+#define R2UPK3(x)      (x>>14)                         /* unpack reg 3 */
+#define R2TEST(x)      ((x)>=0200)                     /* test if packed */
+
+#ifdef MULTILEVEL
+union  mltemplate {
+       struct ml_head {
+               int     tag;                    /* tree class */
+               int     subtag;                 /* subclass of tree */
+               union   mltemplate *nexthead;   /* linked by mlinit() */
+       } mlhead;
+       struct ml_node {
+               int     op;                     /* operator or op description */
+               int     nshape;                 /* node shape */
+               /*
+                * Both op and nshape must match the node.
+                * where the work is to be done entirely by
+                * op, nshape can be SANY, visa versa, op can
+                * be OPANY.
+                */
+               int     ntype;                  /* type descriptor */
+       } mlnode;
+};
+extern union mltemplate mltree[];
+#endif
+#endif