|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.