📄 putdmr.c
字号:
rp = NULL; break; case OPNEG: putassign( realpart(resp), mkexpr(OPNEG, realpart(lp), NULL) ); putassign( imagpart(resp), mkexpr(OPNEG, imagpart(lp), NULL) ); *ncommap += 2; break; case OPPLUS: case OPMINUS: putassign( realpart(resp), mkexpr(opcode, realpart(lp), realpart(rp) )); if(rtype < TYCOMPLEX) putassign( imagpart(resp), imagpart(lp) ); else if(ltype < TYCOMPLEX) { if(opcode == OPPLUS) putassign( imagpart(resp), imagpart(rp) ); else putassign( imagpart(resp), mkexpr(OPNEG, imagpart(rp), NULL) ); } else putassign( imagpart(resp), mkexpr(opcode, imagpart(lp), imagpart(rp) )); *ncommap += 2; break; case OPSTAR: if(ltype < TYCOMPLEX) { if( ISINT(ltype) ) lp = intdouble(lp, ncommap); putassign( realpart(resp), mkexpr(OPSTAR, cpexpr(lp), realpart(rp) )); putassign( imagpart(resp), mkexpr(OPSTAR, cpexpr(lp), imagpart(rp) )); } else if(rtype < TYCOMPLEX) { if( ISINT(rtype) ) rp = intdouble(rp, ncommap); putassign( realpart(resp), mkexpr(OPSTAR, cpexpr(rp), realpart(lp) )); putassign( imagpart(resp), mkexpr(OPSTAR, cpexpr(rp), imagpart(lp) )); } else { putassign( realpart(resp), mkexpr(OPMINUS, mkexpr(OPSTAR, realpart(lp), realpart(rp)), mkexpr(OPSTAR, imagpart(lp), imagpart(rp)) )); putassign( imagpart(resp), mkexpr(OPPLUS, mkexpr(OPSTAR, realpart(lp), imagpart(rp)), mkexpr(OPSTAR, imagpart(lp), realpart(rp)) )); } *ncommap += 2; break; case OPSLASH: /* fixexpr has already replaced all divisions * by a complex by a function call */ if( ISINT(rtype) ) rp = intdouble(rp, ncommap); putassign( realpart(resp), mkexpr(OPSLASH, realpart(lp), cpexpr(rp)) ); putassign( imagpart(resp), mkexpr(OPSLASH, imagpart(lp), cpexpr(rp)) ); *ncommap += 2; break; case OPCONV: putassign( realpart(resp), realpart(lp) ); if( ISCOMPLEX(lp->vtype) ) q = imagpart(lp); else if(rp != NULL) q = realpart(rp); else q = mkrealcon(TYDREAL, 0.0); putassign( imagpart(resp), q); *ncommap += 2; break; default: fatal1("putcx1 of invalid opcode %d", opcode); }frexpr(lp);frexpr(rp);free(p);return(resp);}LOCAL putcxcmp(p)register struct exprblock *p;{int opcode;int ncomma;register struct addrblock *lp, *rp;struct exprblock *q;ncomma = 0;opcode = p->opcode;lp = putcx1(p->leftp, &ncomma);rp = putcx1(p->rightp, &ncomma);q = mkexpr( opcode==OPEQ ? OPAND : OPOR , mkexpr(opcode, realpart(lp), realpart(rp)), mkexpr(opcode, imagpart(lp), imagpart(rp)) );putx( fixexpr(q) );putcomma(ncomma, TYINT, NO);free(lp);free(rp);free(p);}LOCAL struct addrblock *putch1(p, ncommap)register expptr p;int * ncommap;{register struct addrblock *t;struct addrblock *mktemp(), *putconst();switch(p->tag) { case TCONST: return( putconst(p) ); case TADDR: return(p); case TEXPR: ++*ncommap; switch(p->opcode) { case OPCALL: case OPCCALL: t = putcall(p); break; case OPCONCAT: t = mktemp(TYCHAR, cpexpr(p->vleng) ); putcat( cpexpr(t), p ); break; case OPCONV: if(!ISICON(p->vleng) || p->vleng->const.ci!=1 || ! INT(p->leftp->vtype) ) fatal("putch1: bad character conversion"); t = mktemp(TYCHAR, ICON(1) ); putop( mkexpr(OPASSIGN, cpexpr(t), p) ); break; default: fatal1("putch1: invalid opcode %d", p->opcode); } return(t); default: fatal1("putch1: bad tag %d", p->tag); }/* NOTREACHED */}LOCAL putchop(p)expptr p;{int ncomma;ncomma = 0;putaddr( putch1(p, &ncomma) , NO );putcomma(ncomma, TYCHAR, YES);}LOCAL putcheq(p)register struct exprblock *p;{int ncomma;ncomma = 0;if( p->rightp->tag==TEXPR && p->rightp->opcode==OPCONCAT ) putcat(p->leftp, p->rightp);else if( ISONE(p->leftp->vleng) && ISONE(p->rightp->vleng) ) { putaddr( putch1(p->leftp, &ncomma) , YES ); putaddr( putch1(p->rightp, &ncomma) , YES ); putcomma(ncomma, TYINT, NO); p2op2(P2ASSIGN, P2CHAR); }else { putx( call2(TYINT, "s_copy", p->leftp, p->rightp) ); putcomma(ncomma, TYINT, NO); }frexpr(p->vleng);free(p);}LOCAL putchcmp(p)register struct exprblock *p;{int ncomma;ncomma = 0;if(ISONE(p->leftp->vleng) && ISONE(p->rightp->vleng) ) { putaddr( putch1(p->leftp, &ncomma) , YES ); putaddr( putch1(p->rightp, &ncomma) , YES ); p2op2(ops2[p->opcode], P2CHAR); free(p); putcomma(ncomma, TYINT, NO); }else { p->leftp = call2(TYINT,"s_cmp", p->leftp, p->rightp); p->rightp = ICON(0); putop(p); }}LOCAL putcat(lhs, rhs)register struct addrblock *lhs;register expptr rhs;{int n, ncomma;struct addrblock *lp, *cp;ncomma = 0;n = ncat(rhs);lp = mktmpn(n, TYLENG, NULL);cp = mktmpn(n, TYADDR, NULL);n = 0;putct1(rhs, lp, cp, &n, &ncomma);putx( call4(TYSUBR, "s_cat", lhs, cp, lp, mkconv(TYLONG, ICON(n)) ) );putcomma(ncomma, TYINT, NO);}LOCAL ncat(p)register expptr p;{if(p->tag==TEXPR && p->opcode==OPCONCAT) return( ncat(p->leftp) + ncat(p->rightp) );else return(1);}LOCAL putct1(q, lp, cp, ip, ncommap)register expptr q;register struct addrblock *lp, *cp;int *ip, *ncommap;{int i;struct addrblock *lp1, *cp1;if(q->tag==TEXPR && q->opcode==OPCONCAT) { putct1(q->leftp, lp, cp, ip, ncommap); putct1(q->rightp, lp, cp , ip, ncommap); frexpr(q->vleng); free(q); }else { i = (*ip)++; lp1 = cpexpr(lp); lp1->memoffset = mkexpr(OPPLUS, lp1->memoffset, ICON(i*SZLENG)); cp1 = cpexpr(cp); cp1->memoffset = mkexpr(OPPLUS, cp1->memoffset, ICON(i*SZADDR)); putassign( lp1, cpexpr(q->vleng) ); putassign( cp1, addrof(putch1(q,ncommap)) ); *ncommap += 2; }}LOCAL putaddr(p, indir)register struct addrblock *p;int indir;{int type, type2, funct;expptr offp;type = p->vtype;type2 = types2[type];if(p->vclass == CLPROC) { funct = P2FUNCT; if(type == TYUNKNOWN) type2 = P2INT; }else funct = 0;if(p->memoffset && (!ISICON(p->memoffset) || p->memoffset->const.ci!=0) ) offp = cpexpr(p->memoffset);else offp = NULL;#if FUDGEOFFSET != 1if(offp) offp = mkexpr(OPSTAR, ICON(FUDGEOFFSET), offp);#endifswitch(p->vstg) { case STGAUTO: p2reg(AUTOREG, P2PTR); p2offset(type2|P2PTR, offp); if(indir) p2op2(P2INDIRECT, type2); break; case STGLENG: case STGARG: p2reg(ARGREG, type2|P2PTR|((funct?funct:P2PTR)<<2)); if(p->memno) { putx( ICON(p->memno) ); p2op2(P2PLUS, type2|P2PTR|(funct<<2)); } if(p->vstg == STGARG) { p2op2(P2INDIRECT, type2|P2PTR); p2offset(type2|P2PTR|(funct<<2), offp); } if(indir) p2op2(P2INDIRECT, type2|funct); break; case STGBSS: case STGINIT: case STGEXT: case STGCOMMON: case STGEQUIV: case STGCONST: p2op(P2NAME); p2i(P2EXTERN); p2i(type2|funct); p2str( memname(p->vstg,p->memno) ); if(!indir || offp!=NULL) p2op2(P2ADDR, type2|P2PTR); p2offset(type2|P2PTR, offp); if(indir && offp!=NULL) p2op2(P2INDIRECT, type2); break; case STGREG: if(indir) p2reg(p->memno, type2); break; default: fatal1("putaddr: invalid vstg %d", p->vstg); }frexpr(p);}LOCAL struct addrblock *putcall(p)register struct exprblock *p;{chainp arglist, charsp, cp;int first;struct addrblock *t;register struct exprblock *q;struct exprblock *fval;int type, type2, ctype, indir;if( (type = p->vtype) == TYLOGICAL) type = tylogical;type2 = types2[type];charsp = NULL;first = YES;indir = (p->opcode == OPCCALL);if(p->rightp) { arglist = p->rightp->listp; free(p->rightp); }else arglist = NULL;if(!indir) for(cp = arglist ; cp ; cp = cp->nextp) { q = cp->datap; if( ISCONST(q) ) { if(q->vtype == TYSHORT) q = mkconv(tyint, q); cp->datap = q = putconst(q); } if( ISCHAR(q) ) charsp = hookup(charsp, mkchain(cpexpr(q->vleng), 0) ); else if(q->vclass == CLPROC) charsp = hookup(charsp, mkchain( ICON(0) , 0)); }if(type == TYCHAR) { if( ISICON(p->vleng) ) fval = mktemp(TYCHAR, p->vleng); else { err("adjustable character function"); return(NULL); } }else if( ISCOMPLEX(type) ) fval = mktemp(type, NULL);else fval = NULL;ctype = (fval ? P2INT : type2);putaddr(p->leftp, YES);if(fval) { first = NO; putaddr( cpexpr(fval), NO); if(type==TYCHAR) { putx( mkconv(TYLENG, p->vleng) ); p2op2(P2LISTOP, P2INT); } }for(cp = arglist ; cp ; cp = cp->nextp) { q = cp->datap; if(q->tag==TADDR && (indir || q->vstg!=STGREG) ) putaddr(q, indir && q->vtype!=TYCHAR); else if( ISCOMPLEX(q->vtype) ) putcxop(q); else if (ISCHAR(q) ) putchop(q); else if( ! ISERROR(q) ) { if(indir) putx(q); else { t = mktemp(q->vtype, q->vleng); putassign( cpexpr(t), q ); putaddr(t, NO); putcomma(1, q->vtype, YES); } } if(first) first = NO; else p2op2(P2LISTOP, P2INT); }if(arglist) frchain(&arglist);for(cp = charsp ; cp ; cp = cp->nextp) { putx( mkconv(TYLENG, cp->datap) ); if(first) first = NO; else p2op2(P2LISTOP, P2INT); }frchain(&charsp);if(first) p2op(P2NULL);p2op2(P2CALL, ctype);free(p);return(fval);}LOCAL putmnmx(p)register struct exprblock *p;{int op, type;int ncomma;struct exprblock *qp;chainp p0, p1;struct addrblock *sp, *tp;type = p->vtype;op = (p->opcode==OPMIN ? OPLT : OPGT );p0 = p->leftp->listp;free(p->leftp);free(p);sp = mktemp(type, NULL);tp = mktemp(type, NULL);qp = mkexpr(OPCOLON, cpexpr(tp), cpexpr(sp));qp = mkexpr(OPQUEST, mkexpr(op, cpexpr(tp),cpexpr(sp)), qp);qp = fixexpr(qp);ncomma = 1;putassign( cpexpr(sp), p0->datap );for(p1 = p0->nextp ; p1 ; p1 = p1->nextp) { ++ncomma; putassign( cpexpr(tp), p1->datap ); if(p1->nextp) { ++ncomma; putassign( cpexpr(sp), cpexpr(qp) ); } else putx(qp); }putcomma(ncomma, type, NO);frtemp(sp);frtemp(tp);frchain( &p0 );}LOCAL putcomma(n, type, indir)int n, type, indir;{type = types2[type];if(indir) type |= P2PTR;while(--n >= 0) p2op2(P2COMOP, type);}/* * routines that put bytes on the pass2 input stream*/p2i(k)int k;{register char *s;s = &k;putc(*s++, textfile);putc(*s, textfile);}p2op(op)int op;{putc(op, textfile);putc(0376, textfile); /* MAGIC NUMBER */}p2str(s)register char *s;{do putc(*s, textfile); while(*s++);}p2op2(op, i)int op, i;{p2op(op);p2i(i);}p2reg(k, type)int k;{p2op2(P2NAME, P2REG);p2i(type);p2i(k);}LOCAL p2li(n)long int n;{register int *p, i;p = &n;for(i = 0 ; i< sizeof(long int)/sizeof(int) ; ++i) p2i(*p++);}LOCAL p2offset(type, offp)int type;register expptr offp;{expptr shorten();if(offp) {#if SZINT < SZLONG if(shortsubs) offp = shorten(offp);#endif if(offp->vtype != TYLONG) offp = mkconv(TYINT, offp); if(offp->vtype == TYLONG) { putx(offp); p2op2(P2LTOI, P2INT); } else putx( offp ); p2op2(P2PLUS, type); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -