Annotation of coherent/b/bin/c/n1/i8086/gen2.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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