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