1: /*
   2:  * INTERMEDIATE CODE GENERATION PROCEDURES COMMON TO BOTH
   3:  * JOHNSON AND RITCHIE FAMILIES OF SECOND PASSES
   4: */
   5: 
   6: #include "defs"
   7: 
   8: #if FAMILY == SCJ
   9: #	include "scjdefs"
  10: #else
  11: #	include "dmrdefs"
  12: #endif
  13: 
  14: /*
  15: char *ops [ ] =
  16: 	{
  17: 	"??", "+", "-", "*", "/", "**", "-",
  18: 	"OR", "AND", "EQV", "NEQV", "NOT",
  19: 	"CONCAT",
  20: 	"<", "==", ">", "<=", "!=", ">=",
  21: 	" of ", " ofC ", " = ", " += ", " *= ", " CONV ", " << ", " % ",
  22: 	" , ", " ? ", " : "
  23: 	" abs ", " min ", " max ", " addr ", " indirect ",
  24: 	" bitor ", " bitand ", " bitxor ", " bitnot ", " >> ",
  25: 	};
  26: */
  27: 
  28: int ops2 [ ] =
  29:     {
  30:     P2BAD, P2PLUS, P2MINUS, P2STAR, P2SLASH, P2BAD, P2NEG,
  31:     P2OROR, P2ANDAND, P2EQ, P2NE, P2NOT,
  32:     P2BAD,
  33:     P2LT, P2EQ, P2GT, P2LE, P2NE, P2GE,
  34:     P2CALL, P2CALL, P2ASSIGN, P2PLUSEQ, P2STAREQ, P2CONV, P2LSHIFT, P2MOD,
  35:     P2COMOP, P2QUEST, P2COLON,
  36:     P2BAD, P2BAD, P2BAD, P2BAD, P2BAD,
  37:     P2BITOR, P2BITAND, P2BITXOR, P2BITNOT, P2RSHIFT
  38:     };
  39: 
  40: 
  41: int types2 [ ] =
  42:     {
  43:     P2BAD, P2INT|P2PTR, P2SHORT, P2LONG, P2REAL, P2DREAL,
  44: #if TARGET == INTERDATA
  45:     P2BAD, P2BAD, P2LONG, P2CHAR, P2INT, P2BAD
  46: #else
  47:     P2REAL, P2DREAL, P2LONG, P2CHAR, P2INT, P2BAD
  48: #endif
  49:     };
  50: 
  51: 
  52: setlog()
  53: {
  54: types2[TYLOGICAL] = types2[tylogical];
  55: }
  56: 
  57: 
  58: putex1(p)
  59: expptr p;
  60: {
  61: putx( fixtype(p) );
  62: templist = hookup(templist, holdtemps);
  63: holdtemps = NULL;
  64: }
  65: 
  66: 
  67: 
  68: 
  69: 
  70: putassign(lp, rp)
  71: expptr lp, rp;
  72: {
  73: putx( fixexpr( mkexpr(OPASSIGN, lp, rp) ));
  74: }
  75: 
  76: 
  77: 
  78: 
  79: puteq(lp, rp)
  80: expptr lp, rp;
  81: {
  82: putexpr( mkexpr(OPASSIGN, lp, rp) );
  83: }
  84: 
  85: 
  86: 
  87: 
  88: /* put code for  a *= b */
  89: 
  90: putsteq(a, b)
  91: expptr a, b;
  92: {
  93: putx( fixexpr( mkexpr(OPSTAREQ, cpexpr(a), cpexpr(b)) ));
  94: }
  95: 
  96: 
  97: 
  98: 
  99: 
 100: struct addrblock *realpart(p)
 101: register struct addrblock *p;
 102: {
 103: register struct addrblock *q;
 104: 
 105: q = cpexpr(p);
 106: if( ISCOMPLEX(p->vtype) )
 107:     q->vtype += (TYREAL-TYCOMPLEX);
 108: return(q);
 109: }
 110: 
 111: 
 112: 
 113: 
 114: struct addrblock *imagpart(p)
 115: register struct addrblock *p;
 116: {
 117: register struct addrblock *q;
 118: struct constblock *mkrealcon();
 119: 
 120: if( ISCOMPLEX(p->vtype) )
 121:     {
 122:     q = cpexpr(p);
 123:     q->vtype += (TYREAL-TYCOMPLEX);
 124:     q->memoffset = mkexpr(OPPLUS, q->memoffset, ICON(typesize[q->vtype]));
 125:     }
 126: else
 127:     q = mkrealcon( ISINT(p->vtype) ? TYDREAL : p->vtype , 0.0);
 128: return(q);
 129: }
 130: 
 131: struct addrblock *putconst(p)
 132: register struct constblock *p;
 133: {
 134: register struct addrblock *q;
 135: struct literal *litp, *lastlit;
 136: int i, k, type;
 137: int litflavor;
 138: 
 139: if( ! ISCONST(p) )
 140:     fatal1("putconst: bad tag %d", p->tag);
 141: 
 142: q = ALLOC(addrblock);
 143: q->tag = TADDR;
 144: type = p->vtype;
 145: q->vtype = ( type==TYADDR ? TYINT : type );
 146: q->vleng = cpexpr(p->vleng);
 147: q->vstg = STGCONST;
 148: q->memno = newlabel();
 149: q->memoffset = ICON(0);
 150: 
 151: /* check for value in literal pool, and update pool if necessary */
 152: 
 153: switch(type = p->vtype)
 154:     {
 155:     case TYCHAR:
 156:         if(p->vleng->const.ci > XL)
 157:             break;  /* too long for literal table */
 158:         litflavor = 1;
 159:         goto loop;
 160: 
 161:     case TYREAL:
 162:     case TYDREAL:
 163:         litflavor = 2;
 164:         goto loop;
 165: 
 166:     case TYLOGICAL:
 167:         type = tylogical;
 168:     case TYSHORT:
 169:     case TYLONG:
 170:         litflavor = 3;
 171: 
 172:     loop:
 173:         lastlit = litpool + nliterals;
 174:         for(litp = litpool ; litp<lastlit ; ++litp)
 175:             if(type == litp->littype) switch(litflavor)
 176:                 {
 177:             case 1:
 178:                 if(p->vleng->const.ci != litp->litval.litcval.litclen)
 179:                     break;
 180:                 if(! eqn( (int) p->vleng->const.ci, p->const.ccp,
 181:                     litp->litval.litcval.litcstr) )
 182:                         break;
 183: 
 184:             ret:
 185:                 q->memno = litp->litnum;
 186:                 frexpr(p);
 187:                 return(q);
 188: 
 189:             case 2:
 190:                 if(p->const.cd[0] == litp->litval.litdval)
 191:                     goto ret;
 192:                 break;
 193: 
 194:             case 3:
 195:                 if(p->const.ci == litp->litval.litival)
 196:                     goto ret;
 197:                 break;
 198:                 }
 199:         if(nliterals < MAXLITERALS)
 200:             {
 201:             ++nliterals;
 202:             litp->littype = type;
 203:             litp->litnum = q->memno;
 204:             switch(litflavor)
 205:                 {
 206:                 case 1:
 207:                     litp->litval.litcval.litclen = p->vleng->const.ci;
 208:                     cpn( (int) litp->litval.litcval.litclen,
 209:                         p->const.ccp,
 210:                         litp->litval.litcval.litcstr);
 211:                     break;
 212: 
 213:                 case 2:
 214:                     litp->litval.litdval = p->const.cd[0];
 215:                     break;
 216: 
 217:                 case 3:
 218:                     litp->litval.litival = p->const.ci;
 219:                     break;
 220:                 }
 221:             }
 222:     default:
 223:         break;
 224:     }
 225: 
 226: preven(typealign[ type==TYCHAR ? TYLONG : type ]);
 227: prlabel(asmfile, q->memno);
 228: 
 229: k = 1;
 230: switch(type)
 231:     {
 232:     case TYLOGICAL:
 233:     case TYSHORT:
 234:     case TYLONG:
 235:         prconi(asmfile, type, p->const.ci);
 236:         break;
 237: 
 238:     case TYCOMPLEX:
 239:         k = 2;
 240:     case TYREAL:
 241:         type = TYREAL;
 242:         goto flpt;
 243: 
 244:     case TYDCOMPLEX:
 245:         k = 2;
 246:     case TYDREAL:
 247:         type = TYDREAL;
 248: 
 249:     flpt:
 250:         for(i = 0 ; i < k ; ++i)
 251:             prconr(asmfile, type, p->const.cd[i]);
 252:         break;
 253: 
 254:     case TYCHAR:
 255:         putstr(asmfile, p->const.ccp, p->vleng->const.ci);
 256:         break;
 257: 
 258:     case TYADDR:
 259:         prcona(asmfile, p->const.ci);
 260:         break;
 261: 
 262:     default:
 263:         fatal1("putconst: bad type %d", p->vtype);
 264:     }
 265: 
 266: frexpr(p);
 267: return( q );
 268: }
 269: 
 270: /*
 271:  * put out a character string constant.  begin every one on
 272:  * a long integer boundary, and pad with nulls
 273:  */
 274: putstr(fp, s, n)
 275: FILEP fp;
 276: char *s;
 277: ftnint n;
 278: {
 279: int b[SZSHORT];
 280: int i;
 281: 
 282: i = 0;
 283: while(--n >= 0)
 284:     {
 285:     b[i++] = *s++;
 286:     if(i == SZSHORT)
 287:         {
 288:         prchars(fp, b);
 289:         i = 0;
 290:         }
 291:     }
 292: 
 293: while(i < SZSHORT)
 294:     b[i++] = '\0';
 295: prchars(fp, b);
 296: }

Defined functions

imagpart defined in line 114; used 56 times
putassign defined in line 70; used 60 times
puteq defined in line 79; used 13 times
putex1 defined in line 58; used 5 times
putsteq defined in line 90; used 6 times
putstr defined in line 274; used 2 times
realpart defined in line 100; used 50 times
setlog defined in line 52; used 1 times

Defined variables

ops2 defined in line 28; used 4 times
types2 defined in line 41; used 13 times
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 831
Valid CSS Valid XHTML 1.0 Strict