|
|
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[] = "@(#)put.c 5.1 (Berkeley) 6/7/85"; ! 9: #endif not lint ! 10: ! 11: /* ! 12: * put.c ! 13: * ! 14: * Intermediate code generation procedures common to both ! 15: * Johnson (Portable) and Ritchie families of second passes ! 16: * ! 17: * University of Utah CS Dept modification history: ! 18: * ! 19: * $Log: put.c,v $ ! 20: * Revision 3.2 85/05/04 15:41:24 mckusick ! 21: * Fix alignment problem -- change code to match comment... ! 22: * ! 23: * Revision 3.2 85/04/29 21:36:07 donn ! 24: * Fix alignment problem -- change code to match comment... ! 25: * ! 26: * Revision 3.1 85/02/27 19:12:04 donn ! 27: * Changed to use pcc.h instead of pccdefs.h. ! 28: * ! 29: * Revision 2.1 84/07/19 12:04:21 donn ! 30: * Changed comment headers for UofU. ! 31: * ! 32: * Revision 1.2 84/04/02 14:40:21 donn ! 33: * Added fixes from Conrad Huang at UCSF for calculating the length of a ! 34: * concatenation of strings correctly. ! 35: * ! 36: */ ! 37: ! 38: #include "defs.h" ! 39: ! 40: #if FAMILY == PCC ! 41: # include <pcc.h> ! 42: #else ! 43: # include "dmrdefs.h" ! 44: #endif ! 45: ! 46: /* ! 47: char *ops [ ] = ! 48: { ! 49: "??", "+", "-", "*", "/", "**", "-", ! 50: "OR", "AND", "EQV", "NEQV", "NOT", ! 51: "CONCAT", ! 52: "<", "==", ">", "<=", "!=", ">=", ! 53: " of ", " ofC ", " = ", " += ", " *= ", " CONV ", " << ", " % ", ! 54: " , ", " ? ", " : " ! 55: " abs ", " min ", " max ", " addr ", " indirect ", ! 56: " bitor ", " bitand ", " bitxor ", " bitnot ", " >> ", " () " ! 57: }; ! 58: */ ! 59: ! 60: int ops2 [ ] = ! 61: { ! 62: PCC_ERROR, PCC_PLUS, PCC_MINUS, PCC_MUL, PCC_DIV, PCC_ERROR, PCC_UMINUS, ! 63: PCC_OROR, PCC_ANDAND, PCC_EQ, PCC_NE, PCC_NOT, ! 64: PCC_ERROR, ! 65: PCC_LT, PCC_EQ, PCC_GT, PCC_LE, PCC_NE, PCC_GE, ! 66: PCC_CALL, PCC_CALL, PCC_ASSIGN, PCC_PLUSEQ, PCC_MULEQ, PCC_SCONV, PCC_LS, PCC_MOD, ! 67: PCC_COMOP, PCC_QUEST, PCC_COLON, ! 68: PCC_ERROR, PCC_ERROR, PCC_ERROR, PCC_ERROR, PCC_DEREF, ! 69: PCC_OR, PCC_AND, PCC_ER, PCC_COMPL, PCC_RS, PCC_ERROR ! 70: }; ! 71: ! 72: ! 73: int types2 [ ] = ! 74: { ! 75: PCC_ERROR, PCCT_INT|PCCTM_PTR, PCCT_SHORT, PCCT_LONG, PCCT_FLOAT, PCCT_DOUBLE, ! 76: #if TARGET == INTERDATA ! 77: PCC_ERROR, PCC_ERROR, PCCT_LONG, PCCT_CHAR, PCCT_INT, PCC_ERROR ! 78: #else ! 79: PCCT_FLOAT, PCCT_DOUBLE, PCCT_LONG, PCCT_CHAR, PCCT_INT, PCC_ERROR ! 80: #endif ! 81: }; ! 82: ! 83: ! 84: setlog() ! 85: { ! 86: types2[TYLOGICAL] = types2[tylogical]; ! 87: typesize[TYLOGICAL] = typesize[tylogical]; ! 88: typealign[TYLOGICAL] = typealign[tylogical]; ! 89: } ! 90: ! 91: ! 92: putex1(p) ! 93: expptr p; ! 94: { ! 95: putx( fixtype(p) ); ! 96: ! 97: if (!optimflag) ! 98: { ! 99: templist = hookup(templist, holdtemps); ! 100: holdtemps = NULL; ! 101: } ! 102: } ! 103: ! 104: ! 105: ! 106: ! 107: ! 108: putassign(lp, rp) ! 109: expptr lp, rp; ! 110: { ! 111: putx( fixexpr( mkexpr(OPASSIGN, lp, rp) )); ! 112: } ! 113: ! 114: ! 115: ! 116: ! 117: puteq(lp, rp) ! 118: expptr lp, rp; ! 119: { ! 120: putexpr( mkexpr(OPASSIGN, lp, rp) ); ! 121: } ! 122: ! 123: ! 124: ! 125: ! 126: /* put code for a *= b */ ! 127: ! 128: putsteq(a, b) ! 129: expptr a, b; ! 130: { ! 131: putx( fixexpr( mkexpr(OPSTAREQ, cpexpr(a), cpexpr(b)) )); ! 132: } ! 133: ! 134: ! 135: ! 136: ! 137: ! 138: Addrp realpart(p) ! 139: register Addrp p; ! 140: { ! 141: register Addrp q; ! 142: ! 143: q = (Addrp) cpexpr(p); ! 144: if( ISCOMPLEX(p->vtype) ) ! 145: q->vtype += (TYREAL-TYCOMPLEX); ! 146: return(q); ! 147: } ! 148: ! 149: ! 150: ! 151: ! 152: expptr imagpart(p) ! 153: register expptr p; ! 154: { ! 155: register Addrp q; ! 156: expptr mkrealcon(); ! 157: ! 158: if (ISCONST(p)) ! 159: { ! 160: if (ISCOMPLEX(p->constblock.vtype)) ! 161: return(mkrealcon(p->constblock.vtype == TYCOMPLEX ? ! 162: TYREAL : TYDREAL, ! 163: p->constblock.const.cd[1])); ! 164: else if (p->constblock.vtype == TYDREAL) ! 165: return(mkrealcon(TYDREAL, 0.0)); ! 166: else ! 167: return(mkrealcon(TYREAL, 0.0)); ! 168: } ! 169: else if (p->tag == TADDR) ! 170: { ! 171: if( ISCOMPLEX(p->addrblock.vtype) ) ! 172: { ! 173: q = (Addrp) cpexpr(p); ! 174: q->vtype += (TYREAL-TYCOMPLEX); ! 175: q->memoffset = mkexpr(OPPLUS, q->memoffset, ! 176: ICON(typesize[q->vtype])); ! 177: return( (expptr) q ); ! 178: } ! 179: else ! 180: return( mkrealcon( ISINT(p->addrblock.vtype) ? ! 181: TYDREAL : p->addrblock.vtype , 0.0)); ! 182: } ! 183: else ! 184: badtag("imagpart", p->tag); ! 185: } ! 186: ! 187: ! 188: ! 189: ! 190: ncat(p) ! 191: register expptr p; ! 192: { ! 193: if(p->tag==TEXPR && p->exprblock.opcode==OPCONCAT) ! 194: return( ncat(p->exprblock.leftp) + ncat(p->exprblock.rightp) ); ! 195: else return(1); ! 196: } ! 197: ! 198: ! 199: ! 200: ! 201: ftnint lencat(p) ! 202: register expptr p; ! 203: { ! 204: if(p->tag==TEXPR && p->exprblock.opcode==OPCONCAT) ! 205: return( lencat(p->exprblock.leftp) + lencat(p->exprblock.rightp) ); ! 206: else if( p->headblock.vleng!=NULL && ISICON(p->headblock.vleng) ) ! 207: return(p->headblock.vleng->constblock.const.ci); ! 208: else if(p->tag==TADDR && p->addrblock.varleng!=0) ! 209: return(p->addrblock.varleng); ! 210: else if(p->tag==TTEMP && p->tempblock.varleng!=0) ! 211: return(p->tempblock.varleng); ! 212: else ! 213: { ! 214: err("impossible element in concatenation"); ! 215: return(0); ! 216: } ! 217: } ! 218: ! 219: Addrp putconst(p) ! 220: register Constp p; ! 221: { ! 222: register Addrp q; ! 223: struct Literal *litp, *lastlit; ! 224: int i, k, type; ! 225: int litflavor; ! 226: ! 227: if( p->tag != TCONST ) ! 228: badtag("putconst", p->tag); ! 229: ! 230: q = ALLOC(Addrblock); ! 231: q->tag = TADDR; ! 232: type = p->vtype; ! 233: q->vtype = ( type==TYADDR ? TYINT : type ); ! 234: q->vleng = (expptr) cpexpr(p->vleng); ! 235: q->vstg = STGCONST; ! 236: q->memno = newlabel(); ! 237: q->memoffset = ICON(0); ! 238: ! 239: /* check for value in literal pool, and update pool if necessary */ ! 240: ! 241: switch(type = p->vtype) ! 242: { ! 243: case TYCHAR: ! 244: if(p->vleng->constblock.const.ci > XL) ! 245: break; /* too long for literal table */ ! 246: litflavor = 1; ! 247: goto loop; ! 248: ! 249: case TYREAL: ! 250: case TYDREAL: ! 251: litflavor = 2; ! 252: goto loop; ! 253: ! 254: case TYLOGICAL: ! 255: type = tylogical; ! 256: case TYSHORT: ! 257: case TYLONG: ! 258: litflavor = 3; ! 259: ! 260: loop: ! 261: lastlit = litpool + nliterals; ! 262: for(litp = litpool ; litp<lastlit ; ++litp) ! 263: if(type == litp->littype) switch(litflavor) ! 264: { ! 265: case 1: ! 266: if(p->vleng->constblock.const.ci != litp->litval.litcval.litclen) ! 267: break; ! 268: if(! eqn( (int) p->vleng->constblock.const.ci, p->const.ccp, ! 269: litp->litval.litcval.litcstr) ) ! 270: break; ! 271: ! 272: ret: ! 273: q->memno = litp->litnum; ! 274: frexpr(p); ! 275: return(q); ! 276: ! 277: case 2: ! 278: if(p->const.cd[0] == litp->litval.litdval) ! 279: goto ret; ! 280: break; ! 281: ! 282: case 3: ! 283: if(p->const.ci == litp->litval.litival) ! 284: goto ret; ! 285: break; ! 286: } ! 287: if(nliterals < MAXLITERALS) ! 288: { ! 289: ++nliterals; ! 290: litp->littype = type; ! 291: litp->litnum = q->memno; ! 292: switch(litflavor) ! 293: { ! 294: case 1: ! 295: litp->litval.litcval.litclen = ! 296: p->vleng->constblock.const.ci; ! 297: cpn( (int) litp->litval.litcval.litclen, ! 298: p->const.ccp, ! 299: litp->litval.litcval.litcstr); ! 300: break; ! 301: ! 302: case 2: ! 303: litp->litval.litdval = p->const.cd[0]; ! 304: break; ! 305: ! 306: case 3: ! 307: litp->litval.litival = p->const.ci; ! 308: break; ! 309: } ! 310: } ! 311: default: ! 312: break; ! 313: } ! 314: ! 315: preven(typealign[ type==TYCHAR ? TYLONG : type ]); ! 316: prlabel(asmfile, q->memno); ! 317: ! 318: k = 1; ! 319: switch(type) ! 320: { ! 321: case TYLOGICAL: ! 322: case TYSHORT: ! 323: case TYLONG: ! 324: prconi(asmfile, type, p->const.ci); ! 325: break; ! 326: ! 327: case TYCOMPLEX: ! 328: k = 2; ! 329: case TYREAL: ! 330: type = TYREAL; ! 331: goto flpt; ! 332: ! 333: case TYDCOMPLEX: ! 334: k = 2; ! 335: case TYDREAL: ! 336: type = TYDREAL; ! 337: ! 338: flpt: ! 339: for(i = 0 ; i < k ; ++i) ! 340: prconr(asmfile, type, p->const.cd[i]); ! 341: break; ! 342: ! 343: case TYCHAR: ! 344: putstr(asmfile, p->const.ccp, ! 345: (int) (p->vleng->constblock.const.ci) ); ! 346: break; ! 347: ! 348: case TYADDR: ! 349: prcona(asmfile, p->const.ci); ! 350: break; ! 351: ! 352: default: ! 353: badtype("putconst", p->vtype); ! 354: } ! 355: ! 356: frexpr(p); ! 357: return( q ); ! 358: } ! 359: ! 360: /* ! 361: * put out a character string constant. begin every one on ! 362: * a long integer boundary, and pad with nulls ! 363: */ ! 364: putstr(fp, s, n) ! 365: FILEP fp; ! 366: register char *s; ! 367: register int n; ! 368: { ! 369: int b[SZLONG]; ! 370: register int i; ! 371: ! 372: i = 0; ! 373: while(--n >= 0) ! 374: { ! 375: b[i++] = *s++; ! 376: if(i == SZLONG) ! 377: { ! 378: prchars(fp, b); ! 379: prchars(fp, b+SZSHORT); ! 380: i = 0; ! 381: } ! 382: } ! 383: ! 384: while(i < SZLONG) ! 385: b[i++] = '\0'; ! 386: prchars(fp, b); ! 387: prchars(fp, b+SZSHORT); ! 388: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.