|
|
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.