📄 put.c
字号:
/* * INTERMEDIATE CODE GENERATION PROCEDURES COMMON TO BOTH * JOHNSON AND RITCHIE FAMILIES OF SECOND PASSES*/#include "defs"#if FAMILY == SCJ# include "scjdefs"#else# include "dmrdefs"#endif/*char *ops [ ] = { "??", "+", "-", "*", "/", "**", "-", "OR", "AND", "EQV", "NEQV", "NOT", "CONCAT", "<", "==", ">", "<=", "!=", ">=", " of ", " ofC ", " = ", " += ", " *= ", " CONV ", " << ", " % ", " , ", " ? ", " : " " abs ", " min ", " max ", " addr ", " indirect ", " bitor ", " bitand ", " bitxor ", " bitnot ", " >> ", };*/int ops2 [ ] = { P2BAD, P2PLUS, P2MINUS, P2STAR, P2SLASH, P2BAD, P2NEG, P2OROR, P2ANDAND, P2EQ, P2NE, P2NOT, P2BAD, P2LT, P2EQ, P2GT, P2LE, P2NE, P2GE, P2CALL, P2CALL, P2ASSIGN, P2PLUSEQ, P2STAREQ, P2CONV, P2LSHIFT, P2MOD, P2COMOP, P2QUEST, P2COLON, P2BAD, P2BAD, P2BAD, P2BAD, P2BAD, P2BITOR, P2BITAND, P2BITXOR, P2BITNOT, P2RSHIFT };int types2 [ ] = { P2BAD, P2INT|P2PTR, P2SHORT, P2LONG, P2REAL, P2DREAL,#if TARGET == INTERDATA P2BAD, P2BAD, P2LONG, P2CHAR, P2INT, P2BAD#else P2REAL, P2DREAL, P2LONG, P2CHAR, P2INT, P2BAD#endif };setlog(){types2[TYLOGICAL] = types2[tylogical];}putex1(p)expptr p;{putx( fixtype(p) );templist = hookup(templist, holdtemps);holdtemps = NULL;}putassign(lp, rp)expptr lp, rp;{putx( fixexpr( mkexpr(OPASSIGN, lp, rp) ));}puteq(lp, rp)expptr lp, rp;{putexpr( mkexpr(OPASSIGN, lp, rp) );}/* put code for a *= b */putsteq(a, b)expptr a, b;{putx( fixexpr( mkexpr(OPSTAREQ, cpexpr(a), cpexpr(b)) ));}struct addrblock *realpart(p)register struct addrblock *p;{register struct addrblock *q;q = cpexpr(p);if( ISCOMPLEX(p->vtype) ) q->vtype += (TYREAL-TYCOMPLEX);return(q);}struct addrblock *imagpart(p)register struct addrblock *p;{register struct addrblock *q;struct constblock *mkrealcon();if( ISCOMPLEX(p->vtype) ) { q = cpexpr(p); q->vtype += (TYREAL-TYCOMPLEX); q->memoffset = mkexpr(OPPLUS, q->memoffset, ICON(typesize[q->vtype])); }else q = mkrealcon( ISINT(p->vtype) ? TYDREAL : p->vtype , 0.0);return(q);}struct addrblock *putconst(p)register struct constblock *p;{register struct addrblock *q;struct literal *litp, *lastlit;int i, k, type;int litflavor;if( ! ISCONST(p) ) fatal1("putconst: bad tag %d", p->tag);q = ALLOC(addrblock);q->tag = TADDR;type = p->vtype;q->vtype = ( type==TYADDR ? TYINT : type );q->vleng = cpexpr(p->vleng);q->vstg = STGCONST;q->memno = newlabel();q->memoffset = ICON(0);/* check for value in literal pool, and update pool if necessary */switch(type = p->vtype) { case TYCHAR: if(p->vleng->const.ci > XL) break; /* too long for literal table */ litflavor = 1; goto loop; case TYREAL: case TYDREAL: litflavor = 2; goto loop; case TYLOGICAL: type = tylogical; case TYSHORT: case TYLONG: litflavor = 3; loop: lastlit = litpool + nliterals; for(litp = litpool ; litp<lastlit ; ++litp) if(type == litp->littype) switch(litflavor) { case 1: if(p->vleng->const.ci != litp->litval.litcval.litclen) break; if(! eqn( (int) p->vleng->const.ci, p->const.ccp, litp->litval.litcval.litcstr) ) break; ret: q->memno = litp->litnum; frexpr(p); return(q); case 2: if(p->const.cd[0] == litp->litval.litdval) goto ret; break; case 3: if(p->const.ci == litp->litval.litival) goto ret; break; } if(nliterals < MAXLITERALS) { ++nliterals; litp->littype = type; litp->litnum = q->memno; switch(litflavor) { case 1: litp->litval.litcval.litclen = p->vleng->const.ci; cpn( (int) litp->litval.litcval.litclen, p->const.ccp, litp->litval.litcval.litcstr); break; case 2: litp->litval.litdval = p->const.cd[0]; break; case 3: litp->litval.litival = p->const.ci; break; } } default: break; }preven(typealign[ type==TYCHAR ? TYLONG : type ]);prlabel(asmfile, q->memno);k = 1;switch(type) { case TYLOGICAL: case TYSHORT: case TYLONG: prconi(asmfile, type, p->const.ci); break; case TYCOMPLEX: k = 2; case TYREAL: type = TYREAL; goto flpt; case TYDCOMPLEX: k = 2; case TYDREAL: type = TYDREAL; flpt: for(i = 0 ; i < k ; ++i) prconr(asmfile, type, p->const.cd[i]); break; case TYCHAR: putstr(asmfile, p->const.ccp, p->vleng->const.ci); break; case TYADDR: prcona(asmfile, p->const.ci); break; default: fatal1("putconst: bad type %d", p->vtype); }frexpr(p);return( q );}/* * put out a character string constant. begin every one on * a long integer boundary, and pad with nulls */putstr(fp, s, n)FILEP fp;char *s;ftnint n;{int b[SZSHORT];int i;i = 0;while(--n >= 0) { b[i++] = *s++; if(i == SZSHORT) { prchars(fp, b); i = 0; } }while(i < SZSHORT) b[i++] = '\0';prchars(fp, b);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -