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

1.1     ! root        1: /*
        !             2:  * n1/i386/gen2.c
        !             3:  * Generate external and static initializations.
        !             4:  * i386.
        !             5:  */
        !             6: 
        !             7: #ifdef   vax
        !             8: #include "INC$LIB:cc1.h"
        !             9: #else
        !            10: #include "cc1.h"
        !            11: #endif
        !            12: 
        !            13: static char    ilinit[] = "initializer too complex";
        !            14: static dval_t  dvalzero;
        !            15: 
        !            16: /*
        !            17:  * This routine handles blocks of bytes (IBLOCK) items.
        !            18:  * It is passed the count.
        !            19:  * If the "ZBYTE" could be a machine independent notion,
        !            20:  * then this could be moved into "cc1.c".
        !            21:  */
        !            22: iblock(n) register int n;
        !            23: {
        !            24:        while (n--) {
        !            25:                bput(CODE);
        !            26:                bput(ZBYTE);
        !            27:                iput((ival_t)A_OFFS|A_DIR);
        !            28:                iput((ival_t)bget());
        !            29:        }
        !            30: }
        !            31: 
        !            32: /*
        !            33:  * This routine compiles any "IEXPR" trees.
        !            34:  * The "INIT" node has been pulled off by "work" (in "cc1.c")
        !            35:  * and the tree has been run through the tree optimizer.
        !            36:  */
        !            37: iexpr(tp, tt) register TREE *tp; int tt;
        !            38: {
        !            39:        register char   *dcp;
        !            40:        register int    op;
        !            41:        register int    bytes;
        !            42:        dval_t          d;
        !            43:        int             mode;
        !            44:        lval_t          offs;
        !            45:        int             lidn;
        !            46:        SYM             *gidp;
        !            47: 
        !            48:        tp = basenode(tp);
        !            49:        if (!isflt(tt)) {
        !            50:                mode = A_DIR;
        !            51:                offs = 0;
        !            52:                if (gencoll(tp, &mode, &offs, &lidn, &gidp, 0, 1) == 0
        !            53:                || (mode & A_AMOD) != A_DIR) {
        !            54:                        cerror(ilinit);
        !            55:                        return;
        !            56:                }
        !            57:                /*
        !            58:                 * A long integer gets put as a LONG opcode.
        !            59:                 */
        !            60:                if (tt==S32 || tt==U32) {
        !            61:                        if ((mode & (A_LID|A_GID)) != 0) {
        !            62: #if    1
        !            63:                                /*
        !            64:                                 * Thanks to Ciaran for the following.
        !            65:                                 * This lets "int i = (int)&foo;" work.
        !            66:                                 */
        !            67:                                tt = PTR;
        !            68: #else
        !            69:                                /* Previous code, pre-Ciaran. */
        !            70:                                cerror(ilinit);
        !            71: #endif
        !            72:                        } else {
        !            73:                                bput(CODE);
        !            74:                                bput(ZLONG);
        !            75:                                iput((ival_t)A_OFFS|mode);
        !            76:                                iput((ival_t)offs);
        !            77:                                return;
        !            78:                        }
        !            79:                }
        !            80:                bput(CODE);
        !            81:                if (tt==PTR || tt==PTB) {
        !            82:                        if ((mode & (A_LID|A_GID)) == 0 && (ival_t)(offs >> 16) != 0) {
        !            83:                                bput(ZLONG);
        !            84:                                iput((ival_t)A_OFFS|mode);
        !            85:                                iput((ival_t)offs);
        !            86:                                return;
        !            87:                        }
        !            88:                        bput(ZGPTR);
        !            89:                }
        !            90:                else if (isbyte(tt))
        !            91:                        bput(ZBYTE);
        !            92:                else
        !            93:                        bput(ZWORD);
        !            94:                if (offs == 0)
        !            95:                        iput((ival_t)mode);
        !            96:                else {
        !            97:                        iput((ival_t)A_OFFS|mode);
        !            98:                        iput((ival_t)offs);
        !            99:                }
        !           100:                if ((mode & A_LID) != 0)
        !           101:                        iput((ival_t)lidn);
        !           102:                else if ((mode & A_GID) != 0)
        !           103:                        sput(gidp->s_id);
        !           104:                return;
        !           105:        }
        !           106:        op = tp->t_op;
        !           107:        if (op==ICON || op==LCON) {
        !           108:                dcp = (char *) d;
        !           109:                dvallval(dcp, grabnval(tp));
        !           110:        } else if (op == DCON)
        !           111:                dcp = (char *) tp->t_dval;
        !           112:        else {
        !           113:                cerror(ilinit);
        !           114:                dcp = dvalzero;
        !           115:        }
        !           116:        bytes = 8;
        !           117:        if (tt == F32) {
        !           118:                bytes = 4;
        !           119: #if    IEEE
        !           120:                fvaldval(dcp);
        !           121: #endif
        !           122:        }
        !           123:        while (bytes--) {
        !           124:                bput(CODE);
        !           125:                bput(ZBYTE);
        !           126:                iput((ival_t)A_OFFS|A_DIR);
        !           127:                iput((ival_t)dcp[bytes]&0xFF);
        !           128:        }
        !           129: }
        !           130: 
        !           131: /*
        !           132:  * Convert an "lval_t" (a 32 bit integer)
        !           133:  * into either IEEE or DECVAX double precision float and
        !           134:  * store it into the 8 byte character array to which "dcp" points.
        !           135:  * The original pack is written as shifts
        !           136:  * (rather than by a pun with a union) because the long
        !           137:  * byte order is different on the PDP-11 and the 8086
        !           138:  * and the code should work both places.
        !           139:  * Assumes 32 bit long and 8 bit bytes.
        !           140:  */
        !           141: dvallval(dcp, lval) char *dcp; lval_t lval;
        !           142: {
        !           143:        register int    bexp, sign;
        !           144:        register int    i;
        !           145: 
        !           146:        for (i=0; i<8; dcp[i++]=0)
        !           147:                ;
        !           148:        if (lval != 0) {
        !           149:                sign = 0;
        !           150:                if (lval < 0) {
        !           151:                        lval = -lval;
        !           152:                        sign = 0200;
        !           153:                }
        !           154:                dcp[4] = lval >> 24;
        !           155:                dcp[5] = lval >> 16;
        !           156:                dcp[6] = lval >>  8;
        !           157:                dcp[7] = lval;
        !           158: #if    IEEE
        !           159:                bexp = 1023 + 52;
        !           160: #else
        !           161:                bexp =  128 + 56;
        !           162: #endif
        !           163:                do {
        !           164:                        --bexp;
        !           165:                        shleft(dcp);
        !           166: #if    IEEE
        !           167:                } while ((dcp[1]&020) == 0);
        !           168:                dcp[1] &= ~0360;
        !           169:                dcp[1] |= (bexp<<4) & 0360;
        !           170:                dcp[0]  = sign | ((bexp>>4)&0177);
        !           171: #else
        !           172:                } while ((dcp[1]&0200) == 0);
        !           173:                dcp[1] &= ~0200;
        !           174:                dcp[1] |= (bexp<<7) & 0200;
        !           175:                dcp[0]  = sign | ((bexp>>1)&0177);
        !           176: #endif
        !           177:        }
        !           178: }
        !           179: 
        !           180: /*
        !           181:  * Shift a 64 bit integer (packed into 8 8-bit bytes)
        !           182:  * one position to the left.
        !           183:  * Shift a 0 into the empty bit position on the right.
        !           184:  */
        !           185: shleft(dcp) register char *dcp;
        !           186: {
        !           187:        register int    icarry, ocarry;
        !           188:        register int    i;
        !           189: 
        !           190:        ocarry = 0;
        !           191:        for (i=7; i>=0; --i) {
        !           192:                icarry = ocarry;
        !           193:                ocarry = 0;
        !           194:                if ((dcp[i]&0200) != 0)
        !           195:                        ++ocarry;
        !           196:                dcp[i] <<= 1;
        !           197:                dcp[i] |=  icarry;
        !           198:        }
        !           199: }
        !           200: 
        !           201: #if    IEEE
        !           202: /*
        !           203:  * Convert an IEEE double precision floating point number
        !           204:  * (packed into 8 8 bit bytes) into a single precision IEEE floating
        !           205:  * point number packed into the first 4 of the 8 bytes.
        !           206:  * The exponent must be rebiased.
        !           207:  * No simple NATIVEFP conditional version,
        !           208:  * because the double byte order is backwards;
        !           209:  * it's not worth it to reverse, cast, and reverse again.
        !           210:  */
        !           211: fvaldval(dcp) register unsigned char *dcp;
        !           212: {
        !           213:        register int    sign, bexp;
        !           214: 
        !           215:        sign = dcp[0]&0200;                     /* sign */
        !           216:        bexp = ((dcp[0]<<4)&03760) + ((dcp[1]>>4)&017);
        !           217:        if (bexp != 0)
        !           218:                bexp += 127 - 1023;             /* biased exponent */
        !           219:        shleft(dcp);
        !           220:        shleft(dcp);
        !           221:        shleft(dcp);                            /* reposition mantissa */
        !           222:        dcp[1] &= ~0200;                        /* mask off lo exponent bit */
        !           223:        if ((dcp[4] & 0x80) != 0                /* round up if appropriate: */
        !           224:         && ++dcp[3] == 0                       /* bump lo mantissa bit, */
        !           225:         && ++dcp[2] == 0                       /* and propogate carry; */
        !           226:         && ++dcp[1] == 0x80) {                 /* if it gets to hidden bit, */
        !           227:                dcp[1] = 0;                     /* then new mantissa is 0 */
        !           228:                ++bexp;                         /* and bump the exponent */
        !           229:        }
        !           230:        if ((bexp&01) != 0)
        !           231:                dcp[1] |= 0200;                 /* pack lo order exponent */
        !           232:        dcp[0] = sign | ((bexp>>1)&0177);       /* pack sign and hi exponent */
        !           233: }
        !           234: #endif
        !           235: 
        !           236: /* end of n1/i386/gen2.c */

unix.superglobalmegacorp.com

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