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

genmx defined in line 154; used 1 times

Defined variables

ar8op defined in line 74; used 1 times
arop defined in line 58; used 1 times
arret defined in line 48; used 2 times
arret0 defined in line 36; used 1 times
  • in line 48
arret1 defined in line 42; used 1 times
artab defined in line 105; used 2 times
artab0 defined in line 93; used 1 times
artab1 defined in line 99; used 1 times
asgntab defined in line 150; used 2 times
asgntb0 defined in line 138; used 1 times
asgntb1 defined in line 144; used 1 times
reltab defined in line 127; used 2 times
reltab0 defined in line 115; used 1 times
reltab1 defined in line 121; used 1 times
sccsid defined in line 8; never used
setop defined in line 62; used 1 times
Last modified: 1985-06-05
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1193
Valid CSS Valid XHTML 1.0 Strict