# 2.11BSD#431 - /usr/src/ucb/PORT/pascal/src/gen.c

##### Functions

    gen               X
    genmx             X

##### Variables

    ar8op             X
    arop              X
    arret             X
    arret0            X
    arret1            X
    artab             X
    artab0            X
    artab1            X
    asgntab           X
    asgntb0           X
    asgntb1           X
    reltab            X
    reltab0           X
    reltab1           X
    setop             X

       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

#### Defined functions

gen defined in line 169; used 20 times

- in /usr/src/ucb/PORT/pascal/src/0.h line 746
- in /usr/src/ucb/PORT/pascal/src/forop.c line 217, 295, 301, 315, 324, 336
- in /usr/src/ucb/PORT/pascal/src/lval.c line 432
- in /usr/src/ucb/PORT/pascal/src/proc.c line 764, 799
- in /usr/src/ucb/PORT/pascal/src/rval.c line 507, 553, 559, 668, 889
- in /usr/src/ucb/PORT/pascal/src/stat.c line 450-454(2), 464-468(3)

genmx defined in line 154; used 1 times

- in /usr/src/ucb/PORT/pascal/src/nl.c line 276

#### Defined variables

ar8op defined in line 74; used 1 times

- in line 208

arop defined in line 58; used 1 times

- in line 203

arret defined in line 48; used 2 times

- in line 157, 209

arret0 defined in line 36; used 1 times

- in line 48

arret1 defined in line 42; used 1 times

- in line 157

artab defined in line 105; used 2 times

- in line 158, 208

artab0 defined in line 93; used 1 times

- in line 105

artab1 defined in line 99; used 1 times

- in line 158

asgntab defined in line 150; used 2 times

- in line 160, 200

asgntb0 defined in line 138; used 1 times

- in line 150

asgntb1 defined in line 144; used 1 times

- in line 160

reltab defined in line 127; used 2 times

- in line 159, 205

reltab0 defined in line 115; used 1 times

- in line 127

reltab1 defined in line 121; used 1 times

- in line 159

sccsid defined in line 8; never used
setop defined in line 62; used 1 times

- in line 215

Last modified: 1985-06-05 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 795 |