|
|
1.1 ! root 1: /* prepass tries to turn the trees into basic blocks */ ! 2: /* eventually this is where p2compile will be */ ! 3: #include "mfile2.h" ! 4: NODE *dup(), *chng1(), *seq(), *buildtree(), *dlabel(); ! 5: ! 6: NODE * ! 7: prepass(p) ! 8: NODE *p; ! 9: { int o; ! 10: NODE *r, *l; ! 11: if(!p) ! 12: return(p); ! 13: o = p->in.op; ! 14: if(o == ASSIGN && (r = p->in.right)->in.op == QUEST) { ! 15: if((l = p->in.left)->in.op == SNODE || l->in.op == RNODE) ! 16: return(p); ! 17: p = chng1(p); ! 18: } ! 19: return(p); ! 20: } ! 21: /* =(x ?(t :(a b))) -> (cbranch t l0), l0(jbr l1 =(x a)), l1(=(x b) */ ! 22: NODE * ! 23: chng1(p) ! 24: NODE *p; ! 25: { NODE *t, *a, *b, *x, *c1, *c2, *u, *v; ! 26: int l0, l1; ! 27: t = p->in.right->in.left; ! 28: a = p->in.right->in.right->in.left; ! 29: b = p->in.right->in.right->in.right; ! 30: x = p->in.left; ! 31: l0 = getlab(); ! 32: l1 = getlab(); ! 33: u = dup(p); ! 34: u->in.left = dup(x); ! 35: u->in.right = b; ! 36: v = dup(p); ! 37: v->in.left = dup(x); ! 38: v->in.right = a; ! 39: c2 = seq(dlabel(genbr(0, l1, v), l0), dlabel(u, l1)); ! 40: c1 = seq(buildtree(CBRANCH, t, bcon(l0)), c2); ! 41: p->in.op = x->in.op = FREE; ! 42: p->in.right->in.op = p->in.right->in.right->in.op = FREE; ! 43: return(c1); ! 44: } ! 45: ! 46: NODE * ! 47: dup(p) ! 48: NODE *p; ! 49: { NODE *t; ! 50: t = talloc(); ! 51: *t = *p; ! 52: return(t); ! 53: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.