Annotation of 43BSDTahoe/ucb/pascal/src/gen.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1980 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #ifndef lint
        !             8: static char sccsid[] = "@(#)gen.c      5.1 (Berkeley) 6/5/85";
        !             9: #endif not lint
        !            10: 
        !            11: #include "whoami.h"
        !            12: #ifdef OBJ
        !            13:     /*
        !            14:      * and the rest of the file
        !            15:      */
        !            16: #include "0.h"
        !            17: #include "tree.h"
        !            18: #include "opcode.h"
        !            19: #include "objfmt.h"
        !            20: 
        !            21: /*
        !            22:  * This array tells the type
        !            23:  * returned by an arithmetic
        !            24:  * operation.  It is indexed
        !            25:  * by the logarithm of the
        !            26:  * lengths base 2.
        !            27:  */
        !            28: #ifndef        DEBUG
        !            29: char   arret[] = {
        !            30:        T4INT,          T4INT,          T4INT,          TDOUBLE,
        !            31:        T4INT,          T4INT,          T4INT,          TDOUBLE,
        !            32:        T4INT,          T4INT,          T4INT,          TDOUBLE,
        !            33:        TDOUBLE,        TDOUBLE,        TDOUBLE,        TDOUBLE
        !            34: };
        !            35: #else
        !            36: char   arret0[] = {
        !            37:        T4INT,          T4INT,          T4INT,          TDOUBLE,
        !            38:        T4INT,          T4INT,          T4INT,          TDOUBLE,
        !            39:        T4INT,          T4INT,          T4INT,          TDOUBLE,
        !            40:        TDOUBLE,        TDOUBLE,        TDOUBLE,        TDOUBLE
        !            41: };
        !            42: char   arret1[] = {
        !            43:        T4INT,          T4INT,          T4INT,          TDOUBLE,
        !            44:        T4INT,          T4INT,          T4INT,          TDOUBLE,
        !            45:        T4INT,          T4INT,          T4INT,          TDOUBLE,
        !            46:        TDOUBLE,        TDOUBLE,        TDOUBLE,        TDOUBLE
        !            47: };
        !            48: char   *arret = arret0;
        !            49: #endif
        !            50: 
        !            51: /*
        !            52:  * These array of arithmetic and set
        !            53:  * operators are indexed by the
        !            54:  * tree nodes and is highly dependent
        !            55:  * on their order.  They thus take
        !            56:  * on the flavor of magic.
        !            57:  */
        !            58: int    arop[] = {
        !            59:        0, O_NEG2, O_MOD2, O_DIV2, O_DVD2, O_MUL2, O_ADD2, O_SUB2,
        !            60:        O_REL2, O_REL2, O_REL2, O_REL2, O_REL2, O_REL2
        !            61: };
        !            62: int    setop[] = {
        !            63:        O_MULT, O_ADDT, O_SUBT,
        !            64:        O_RELT, O_RELT, O_RELT, O_RELT, O_RELT, O_RELT,
        !            65: };
        !            66: 
        !            67: /*
        !            68:  * The following array is
        !            69:  * used when operating on
        !            70:  * two reals since they are
        !            71:  * shoved off in a corner in
        !            72:  * the interpreter table.
        !            73:  */
        !            74: int    ar8op[] = {
        !            75:        O_DVD8, O_MUL8, O_ADD8, O_SUB8,
        !            76:        O_REL8, O_REL8, O_REL8, O_REL8, O_REL8, O_REL8,
        !            77: };
        !            78: 
        !            79: /*
        !            80:  * The following arrays, which are linearizations
        !            81:  * of two dimensional arrays, are the offsets for
        !            82:  * arithmetic, relational and assignment operations
        !            83:  * indexed by the logarithms of the argument widths.
        !            84:  */
        !            85: #ifndef        DEBUG
        !            86: char artab[] = {
        !            87:        O_ADD2-O_ADD2,  O_ADD2-O_ADD2,  O_ADD42-O_ADD2, O_ADD82-O_ADD2,
        !            88:        O_ADD2-O_ADD2,  O_ADD2-O_ADD2,  O_ADD42-O_ADD2, O_ADD82-O_ADD2,
        !            89:        O_ADD24-O_ADD2, O_ADD24-O_ADD2, O_ADD4-O_ADD2,  O_ADD84-O_ADD2,
        !            90:        O_ADD28-O_ADD2, O_ADD28-O_ADD2, O_ADD48-O_ADD2, -1
        !            91: };
        !            92: #else
        !            93: char artab0[] = {
        !            94:        O_ADD2-O_ADD2,  O_ADD2-O_ADD2,  O_ADD42-O_ADD2, O_ADD82-O_ADD2,
        !            95:        O_ADD2-O_ADD2,  O_ADD2-O_ADD2,  O_ADD42-O_ADD2, O_ADD82-O_ADD2,
        !            96:        O_ADD24-O_ADD2, O_ADD24-O_ADD2, O_ADD4-O_ADD2,  O_ADD84-O_ADD2,
        !            97:        O_ADD28-O_ADD2, O_ADD28-O_ADD2, O_ADD48-O_ADD2, -1
        !            98: };
        !            99: char artab1[] = {
        !           100:        O_ADD2-O_ADD2,  O_ADD2-O_ADD2,  O_ADD2-O_ADD2,  O_ADD82-O_ADD2,
        !           101:        O_ADD2-O_ADD2,  O_ADD2-O_ADD2,  O_ADD2-O_ADD2,  O_ADD82-O_ADD2,
        !           102:        O_ADD2-O_ADD2,  O_ADD2-O_ADD2,  O_ADD2-O_ADD2,  O_ADD84-O_ADD2,
        !           103:        O_ADD28-O_ADD2, O_ADD28-O_ADD2, O_ADD28-O_ADD2, -1
        !           104: };
        !           105: char   *artab = artab0;
        !           106: #endif
        !           107: #ifndef DEBUG
        !           108: char reltab[] = {
        !           109:        O_REL2-O_REL2,  O_REL2-O_REL2,  O_REL42-O_REL2, O_REL82-O_REL2,
        !           110:        O_REL2-O_REL2,  O_REL2-O_REL2,  O_REL42-O_REL2, O_REL82-O_REL2,
        !           111:        O_REL24-O_REL2, O_REL24-O_REL2, O_REL4-O_REL2,  O_REL84-O_REL2,
        !           112:        O_REL28-O_REL2, O_REL28-O_REL2, O_REL48-O_REL2, O_REL8-O_REL2
        !           113: };
        !           114: #else
        !           115: char reltab0[] = {
        !           116:        O_REL2-O_REL2,  O_REL2-O_REL2,  O_REL42-O_REL2, O_REL82-O_REL2,
        !           117:        O_REL2-O_REL2,  O_REL2-O_REL2,  O_REL42-O_REL2, O_REL82-O_REL2,
        !           118:        O_REL24-O_REL2, O_REL24-O_REL2, O_REL4-O_REL2,  O_REL84-O_REL2,
        !           119:        O_REL28-O_REL2, O_REL28-O_REL2, O_REL48-O_REL2, O_REL8-O_REL2
        !           120: };
        !           121: char reltab1[] = {
        !           122:        O_REL2-O_REL2,  O_REL2-O_REL2,  O_REL2-O_REL2,  O_REL82-O_REL2,
        !           123:        O_REL2-O_REL2,  O_REL2-O_REL2,  O_REL2-O_REL2,  O_REL82-O_REL2,
        !           124:        O_REL2-O_REL2,  O_REL2-O_REL2,  O_REL2-O_REL2,  O_REL82-O_REL2,
        !           125:        O_REL28-O_REL2, O_REL28-O_REL2, O_REL28-O_REL2, O_REL8-O_REL2
        !           126: };
        !           127: char *reltab = reltab0;
        !           128: #endif
        !           129: 
        !           130: #ifndef DEBUG
        !           131: char asgntab[] = {
        !           132:        O_AS21-O_AS2,   O_AS21-O_AS2,   O_AS41-O_AS2,   -1,
        !           133:        O_AS2-O_AS2,    O_AS2-O_AS2,    O_AS42-O_AS2,   -1,
        !           134:        O_AS24-O_AS2,   O_AS24-O_AS2,   O_AS4-O_AS2,    -1,
        !           135:        O_AS28-O_AS2,   O_AS28-O_AS2,   O_AS48-O_AS2,   O_AS8-O_AS2,
        !           136: };
        !           137: #else
        !           138: char asgntb0[] = {
        !           139:        O_AS21-O_AS2,   O_AS21-O_AS2,   O_AS41-O_AS2,   -1,
        !           140:        O_AS2-O_AS2,    O_AS2-O_AS2,    O_AS42-O_AS2,   -1,
        !           141:        O_AS24-O_AS2,   O_AS24-O_AS2,   O_AS4-O_AS2,    -1,
        !           142:        O_AS28-O_AS2,   O_AS28-O_AS2,   O_AS48-O_AS2,   O_AS8-O_AS2,
        !           143: };
        !           144: char asgntb1[] = {
        !           145:        O_AS21-O_AS2,   O_AS21-O_AS2,   O_AS21-O_AS2,   -1,
        !           146:        O_AS2-O_AS2,    O_AS2-O_AS2,    O_AS2-O_AS2,    -1,
        !           147:        O_AS2-O_AS2,    O_AS2-O_AS2,    O_AS2-O_AS2,    -1,
        !           148:        O_AS28-O_AS2,   O_AS28-O_AS2,   O_AS28-O_AS2,   O_AS4-O_AS2,
        !           149: };
        !           150: char *asgntab = asgntb0;
        !           151: #endif
        !           152: 
        !           153: #ifdef DEBUG
        !           154: genmx()
        !           155: {
        !           156: 
        !           157:        arret = arret1;
        !           158:        artab = artab1;
        !           159:        reltab = reltab1;
        !           160:        asgntab = asgntb1;
        !           161: }
        !           162: #endif
        !           163: 
        !           164: /*
        !           165:  * Gen generates code for assignments,
        !           166:  * and arithmetic and string operations
        !           167:  * and comparisons.
        !           168:  */
        !           169: struct nl *
        !           170: gen(p, o, w1, w2)
        !           171:        int p, o, w1, w2;
        !           172: {
        !           173:        register i, j;
        !           174:        int op;
        !           175: 
        !           176:        switch (p) {
        !           177:                default:
        !           178:                        panic("gen");
        !           179:                case O_AS2:
        !           180:                case NIL:
        !           181:                        i = j = -1;
        !           182:                        /*
        !           183:                         * Take the log2 of the widths
        !           184:                         * and linearize them for indexing.
        !           185:                         * width for indexing.
        !           186:                         */
        !           187: #ifdef DEBUG
        !           188:                        if (hp21mx) {
        !           189:                                if (w1 == 4)
        !           190:                                        w1 = 8;
        !           191:                                if (w2 == 4)
        !           192:                                        w2 = 8;
        !           193:                        }
        !           194: #endif
        !           195:                        do i++; while (w1 >>= 1);
        !           196:                        do j++; while (w2 >>= 1);
        !           197:                        i <<= 2;
        !           198:                        i |= j;
        !           199:                        if (p == O_AS2) {
        !           200:                                (void) put(1, O_AS2 + asgntab[i]);
        !           201:                                return (NIL);
        !           202:                        }
        !           203:                        op = arop[o];
        !           204:                        if (op == O_REL2) {
        !           205:                                (void) put(1, (op + reltab[i]) | (o - T_EQ) << 8+INDX);
        !           206:                                return (nl+TBOOL);
        !           207:                        }
        !           208:                        (void) put(1, i == 15 ? ar8op[o-T_DIVD] : op | artab[i]);
        !           209:                        return (op == O_DVD2 && !divchk ? nl+TDOUBLE : nl+arret[i]);
        !           210:                case TREC:
        !           211:                case TSTR:
        !           212:                        (void) put(2, O_RELG | (o - T_EQ) << 8+INDX, w1);
        !           213:                        return (nl+TBOOL);
        !           214:                case TSET:
        !           215:                        op = setop[o-T_MULT];
        !           216:                        if (op == O_RELT)
        !           217:                                op |= (o - T_EQ)<<8+INDX;
        !           218:                        (void) put(2, op, w1);
        !           219:                        return (o >= T_EQ ? nl+TBOOL : nl+TSET);
        !           220:        }
        !           221: }
        !           222: #endif OBJ

unix.superglobalmegacorp.com

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