|
|
1.1 ! root 1: #include "defs" ! 2: ! 3: ! 4: ! 5: ptr mkfield(q) ! 6: register ptr q; ! 7: { ! 8: register ptr p; ! 9: ! 10: if(!instruct) ! 11: goto err; ! 12: else if(q->upperb == 0) ! 13: dclerr("must have upper bound in field spcification", ""); ! 14: else ! 15: { ! 16: p = (int *)ALLOC(fieldspec); ! 17: p->tag = TFIELD; ! 18: if(q->lowerb) ! 19: { ! 20: p->flbound = q->lowerb; ! 21: p->frange = mknode(TAROP,OPPLUS,mknode(TAROP,OPMINUS, ! 22: q->upperb, cpexpr(q->lowerb)), ! 23: mkconst(TYINT,"1") ); ! 24: } ! 25: else { ! 26: p->flbound = mkconst(TYINT,"1"); ! 27: p->frange = q->upperb; ! 28: } ! 29: p->frange = simple(RVAL,p->frange); ! 30: if(((struct headbits *)p->frange)->tag != TCONST) ! 31: { ! 32: dclerr("field range must be constant", ""); ! 33: cfree(p); ! 34: goto err; ! 35: } ! 36: cfree(q); ! 37: return(p); ! 38: } ! 39: ! 40: err: ! 41: cfree(q); ! 42: return( errnode() ); ! 43: } ! 44: ! 45: ! 46: ! 47: ! 48: ! 49: ptr extrfield(p) ! 50: register ptr p; ! 51: { ! 52: register ptr t; ! 53: ! 54: t = p->vtypep; ! 55: p->vtype = TYINT; ! 56: p->vtypep = 0; ! 57: ! 58: if(t->frshift) ! 59: p = mknode(TAROP,OPSLASH, p, cpexpr(t->frshift)); ! 60: if(t->fanymore) ! 61: p = mkcall(builtin(TYINT, "mod"), arg2(p, cpexpr(t->frange)) ); ! 62: p = mknode(TAROP,OPPLUS, p, cpexpr(t->flbound)); ! 63: return(p); ! 64: } ! 65: ! 66: ! 67: ! 68: ! 69: ptr setfield(e) ! 70: ptr e; ! 71: { ! 72: ptr lp, rp; ! 73: register ptr f, p; ! 74: int subt; ! 75: ! 76: lp = cpexpr(e->leftp); ! 77: rp = e->rightp; ! 78: subt = e->subtype; ! 79: f = lp->vtypep; ! 80: lp->vtype = TYINT; ! 81: lp->vtypep = 0; ! 82: ! 83: if(subt==OPPLUS || subt==OPMINUS) ! 84: { ! 85: if(f->frshift) ! 86: rp = mknode(TAROP,OPSTAR,rp,cpexpr(f->frshift)); ! 87: } ! 88: else { ! 89: if(subt != OPASGN) ! 90: { ! 91: rp = mknode(TAROP,subt, extrfield(cpexpr(e->leftp)), rp); ! 92: subt = OPASGN; ! 93: } ! 94: rp = coerce(TYINT,rp); ! 95: if(f->flbound) ! 96: rp = simple(RVAL, mknode(TAROP,OPMINUS,rp,cpexpr(f->flbound)) ); ! 97: ! 98: if(f->frshift==0) ! 99: { ! 100: if(f->fanymore) ! 101: { ! 102: p = mknode(TAROP,OPSLASH,cpexpr(lp),cpexpr(f->frange)); ! 103: p->needpar = YES; ! 104: p = mknode(TAROP,OPSTAR,cpexpr(f->frange),p); ! 105: rp = mknode(TAROP,OPPLUS,p,rp); ! 106: } ! 107: } ! 108: else if(f->fanymore==0) ! 109: { ! 110: rp = mknode(TAROP,OPSTAR,cpexpr(f->frshift),rp); ! 111: p = mkcall(builtin(TYINT,"mod"), ! 112: arg2(cpexpr(lp),cpexpr(f->frshift)) ); ! 113: rp = mknode(TAROP,OPPLUS, p,rp); ! 114: } ! 115: else { ! 116: p = mknode(TAROP,OPSLASH,cpexpr(lp),cpexpr(f->frshift)); ! 117: p = mkcall(builtin(TYINT,"mod"), ! 118: arg2(p, cpexpr(f->frange)) ); ! 119: if( rp->tag!=TCONST || !equals(rp->leftp, "0") ) ! 120: p = mknode(TAROP,OPMINUS, p, rp); ! 121: rp = mknode(TAROP,OPSTAR, cpexpr(f->frshift), p); ! 122: rp = mknode(TAROP,OPMINUS, cpexpr(lp), rp); ! 123: } ! 124: } ! 125: frexpr( simple(LVAL, mknode(TASGNOP,subt,lp,rp) )); ! 126: return(extrfield(e->leftp)); ! 127: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.