Annotation of coherent/b/bin/c/n1/i386/amd.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * n1/i386/amd.c
        !             3:  * Access mode determination.
        !             4:  * This routine sets the addressing flags for a tree node.
        !             5:  * There is no provision for double indexed address modes;
        !             6:  * the compiler does not attempt to use them at this time.
        !             7:  * i386.
        !             8:  */
        !             9: 
        !            10: #ifdef vax
        !            11: #include "INC$LIB:cc1.h"
        !            12: #else
        !            13: #include "cc1.h"
        !            14: #endif
        !            15: 
        !            16: TREE   *findoffs();
        !            17: 
        !            18: /*
        !            19:  * Determine access mode and store it into the 't_flag' field.
        !            20:  * The subtrees have already been marked.
        !            21:  * This routine is usually called by 'walk'.
        !            22:  */
        !            23: amd(tp, ptp) register TREE *tp; TREE *ptp;
        !            24: {
        !            25:        register FLAG   flag;
        !            26:        register int    op;
        !            27:        register TREE   *xp;
        !            28:        register FLAG   mask;
        !            29:        register lval_t n;
        !            30:        register int    i;
        !            31: 
        !            32:        if ((op=tp->t_op) == LEAF) {
        !            33:                /* Leaf nodes inherit flags of subtree. */
        !            34:                tp->t_flag = tp->t_lp->t_flag;
        !            35:                return;
        !            36:        }
        !            37:        flag = 0;
        !            38:        if (op==ICON || op==LCON) {             /* integer constants */
        !            39:                flag |= T_NUM;
        !            40:                if ((n = grabnval(tp)) >= 0) {
        !            41:                        if (n == 0)
        !            42:                                flag |= T_0|T_SHCNT|T_SBYTE|T_UBYTE|T_SWORD|T_UWORD;
        !            43:                        else if (n == 1)
        !            44:                                flag |= T_1|T_SHCNT|T_SBYTE|T_UBYTE|T_SWORD|T_UWORD;
        !            45:                        else if (n <= 31)
        !            46:                                flag |= T_SHCNT|T_SBYTE|T_UBYTE|T_SWORD|T_UWORD;
        !            47:                        else if (n <= 127)
        !            48:                                flag |= T_SBYTE|T_UBYTE|T_SWORD|T_UWORD;
        !            49:                        else if (n <= 255)
        !            50:                                flag |= T_UBYTE|T_SWORD|T_UWORD;
        !            51:                        else if (n <= 32767L)
        !            52:                                flag |= T_SWORD|T_UWORD;
        !            53:                        else if (n <= 65535L)
        !            54:                                flag |= T_UWORD;
        !            55:                } else {
        !            56:                        if (n >= -128)
        !            57:                                flag |= T_SBYTE|T_SWORD;
        !            58:                        else if (n >= -32768L)
        !            59:                                flag |= T_SWORD;
        !            60:                }
        !            61:        } else if (op == DCON) {                /* double constants */
        !            62:                flag |= T_DCN;
        !            63:                for (i = 0; i < sizeof(dval_t) && tp->t_dval[i]==0; i++)
        !            64:                        ;
        !            65:                if (i == sizeof(dval_t))
        !            66:                        flag |= T_0;
        !            67:        } else if (op == REG)                   /* registers */
        !            68:                flag |= T_REG;
        !            69:        else if (op == ADDR)                    /* address of ... */
        !            70:                flag |= T_ADDR;
        !            71:        else if (op==LID || op==GID)            /* identifiers */
        !            72:                flag |= T_DIR;
        !            73:        else if ((op == ADD || op == SUB) && ispoint(tp->t_type)) {
        !            74:                /* Check for effective address, e.g. %ebp+12 or &i+1. */
        !            75:                mask = (op == ADD) ? T_CON : T_NUM;
        !            76:                xp = tp;
        !            77:                do {
        !            78:                        if ((xp->t_rp->t_flag & mask) == 0)
        !            79:                                break;
        !            80:                        xp = xp->t_lp;
        !            81:                } while (xp->t_op==ADD || xp->t_op==SUB);
        !            82:                if (isreg(xp))
        !            83:                        flag |= T_LEA;
        !            84:        } else if (op == STAR) {
        !            85:                xp = findoffs(tp);
        !            86:                if ((xp->t_flag & T_CON) != 0 || isreg(xp))
        !            87:                        flag |= T_DIR;
        !            88:                flag |= T_OFS;
        !            89:        }
        !            90:        tp->t_flag = flag;
        !            91: }
        !            92: 
        !            93: /*
        !            94:  * Given a pointer to an offset type tree, return a pointer to the tree
        !            95:  * that must be loaded into a register to get an addressable tree.
        !            96:  */
        !            97: TREE *
        !            98: findoffs(tp) register TREE *tp;
        !            99: {
        !           100:        register flag, n;
        !           101: 
        !           102:        while (tp->t_op == LEAF)
        !           103:                tp = tp->t_lp;
        !           104:        for (n = 0;;) {
        !           105:                tp = tp->t_lp;
        !           106:                switch (tp->t_op) {
        !           107:                case SUB:               /* can't load neg addr */
        !           108:                        if (tp->t_rp->t_flag & T_NUM)
        !           109:                                break;
        !           110:                        return tp;
        !           111:                case ADD:               /* add one addr max */
        !           112:                        if ((flag = (tp->t_rp->t_flag)) & T_NUM)
        !           113:                                break;
        !           114:                        else if ((flag & T_CON) && n++ == 0)
        !           115:                                break;
        !           116:                        /* else fall through... */
        !           117:                default:
        !           118:                        return tp;
        !           119:                }
        !           120:        }
        !           121: }
        !           122: 
        !           123: /*
        !           124:  * Return true if xp represents a dword register other than ESP.
        !           125:  */
        !           126: isreg(xp) register TREE *xp;
        !           127: {
        !           128:        register REGNAME r;
        !           129: 
        !           130:        if ((xp->t_flag&T_REG) == 0)
        !           131:                return 0;
        !           132:        while (xp->t_op == LEAF)
        !           133:                xp = xp->t_lp;
        !           134:        r = xp->t_reg;
        !           135:        return (r==EAX || r==EBX || r==ECX || r==EDX
        !           136:             || r==ESI || r==EDI || r==EBP);
        !           137: }
        !           138: 
        !           139: /* end of n1/i386/amd.c */

unix.superglobalmegacorp.com

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