180ee5cbfSDavid du Colombier #include "cc.h"
280ee5cbfSDavid du Colombier
380ee5cbfSDavid du Colombier typedef struct Ftab Ftab;
480ee5cbfSDavid du Colombier struct Ftab
580ee5cbfSDavid du Colombier {
680ee5cbfSDavid du Colombier char op;
780ee5cbfSDavid du Colombier char* name;
880ee5cbfSDavid du Colombier char typ;
980ee5cbfSDavid du Colombier };
1080ee5cbfSDavid du Colombier typedef struct Gtab Gtab;
1180ee5cbfSDavid du Colombier struct Gtab
1280ee5cbfSDavid du Colombier {
1380ee5cbfSDavid du Colombier char etype;
1480ee5cbfSDavid du Colombier char* name;
1580ee5cbfSDavid du Colombier };
1680ee5cbfSDavid du Colombier
1780ee5cbfSDavid du Colombier Ftab ftabinit[OEND];
1880ee5cbfSDavid du Colombier Gtab gtabinit[NTYPE];
1980ee5cbfSDavid du Colombier
2080ee5cbfSDavid du Colombier int
isfunct(Node * n)2180ee5cbfSDavid du Colombier isfunct(Node *n)
2280ee5cbfSDavid du Colombier {
2380ee5cbfSDavid du Colombier Type *t, *t1;
2480ee5cbfSDavid du Colombier Funct *f;
2580ee5cbfSDavid du Colombier Node *l;
2680ee5cbfSDavid du Colombier Sym *s;
2780ee5cbfSDavid du Colombier int o;
2880ee5cbfSDavid du Colombier
2980ee5cbfSDavid du Colombier o = n->op;
3080ee5cbfSDavid du Colombier if(n->left == Z)
3180ee5cbfSDavid du Colombier goto no;
3280ee5cbfSDavid du Colombier t = n->left->type;
3380ee5cbfSDavid du Colombier if(t == T)
3480ee5cbfSDavid du Colombier goto no;
3580ee5cbfSDavid du Colombier f = t->funct;
3680ee5cbfSDavid du Colombier
3780ee5cbfSDavid du Colombier switch(o) {
3880ee5cbfSDavid du Colombier case OAS: // put cast on rhs
3980ee5cbfSDavid du Colombier case OASI:
4080ee5cbfSDavid du Colombier case OASADD:
4180ee5cbfSDavid du Colombier case OASAND:
4280ee5cbfSDavid du Colombier case OASASHL:
4380ee5cbfSDavid du Colombier case OASASHR:
4480ee5cbfSDavid du Colombier case OASDIV:
4580ee5cbfSDavid du Colombier case OASLDIV:
4680ee5cbfSDavid du Colombier case OASLMOD:
4780ee5cbfSDavid du Colombier case OASLMUL:
4880ee5cbfSDavid du Colombier case OASLSHR:
4980ee5cbfSDavid du Colombier case OASMOD:
5080ee5cbfSDavid du Colombier case OASMUL:
5180ee5cbfSDavid du Colombier case OASOR:
5280ee5cbfSDavid du Colombier case OASSUB:
5380ee5cbfSDavid du Colombier case OASXOR:
5480ee5cbfSDavid du Colombier if(n->right == Z)
5580ee5cbfSDavid du Colombier goto no;
5680ee5cbfSDavid du Colombier t1 = n->right->type;
5780ee5cbfSDavid du Colombier if(t1 == T)
5880ee5cbfSDavid du Colombier goto no;
5980ee5cbfSDavid du Colombier if(t1->funct == f)
6080ee5cbfSDavid du Colombier break;
6180ee5cbfSDavid du Colombier
6280ee5cbfSDavid du Colombier l = new(OXXX, Z, Z);
6380ee5cbfSDavid du Colombier *l = *n->right;
6480ee5cbfSDavid du Colombier
6580ee5cbfSDavid du Colombier n->right->left = l;
6680ee5cbfSDavid du Colombier n->right->right = Z;
6780ee5cbfSDavid du Colombier n->right->type = t;
6880ee5cbfSDavid du Colombier n->right->op = OCAST;
6980ee5cbfSDavid du Colombier
7080ee5cbfSDavid du Colombier if(!isfunct(n->right))
7180ee5cbfSDavid du Colombier prtree(n, "isfunc !");
7280ee5cbfSDavid du Colombier break;
7380ee5cbfSDavid du Colombier
7480ee5cbfSDavid du Colombier case OCAST: // t f(T) or T f(t)
7580ee5cbfSDavid du Colombier t1 = n->type;
7680ee5cbfSDavid du Colombier if(t1 == T)
7780ee5cbfSDavid du Colombier goto no;
7880ee5cbfSDavid du Colombier if(f != nil) {
7980ee5cbfSDavid du Colombier s = f->castfr[t1->etype];
8080ee5cbfSDavid du Colombier if(s == S)
8180ee5cbfSDavid du Colombier goto no;
8280ee5cbfSDavid du Colombier n->right = n->left;
8380ee5cbfSDavid du Colombier goto build;
8480ee5cbfSDavid du Colombier }
8580ee5cbfSDavid du Colombier f = t1->funct;
8680ee5cbfSDavid du Colombier if(f != nil) {
8780ee5cbfSDavid du Colombier s = f->castto[t->etype];
8880ee5cbfSDavid du Colombier if(s == S)
8980ee5cbfSDavid du Colombier goto no;
9080ee5cbfSDavid du Colombier n->right = n->left;
9180ee5cbfSDavid du Colombier goto build;
9280ee5cbfSDavid du Colombier }
9380ee5cbfSDavid du Colombier goto no;
9480ee5cbfSDavid du Colombier }
9580ee5cbfSDavid du Colombier
9680ee5cbfSDavid du Colombier if(f == nil)
9780ee5cbfSDavid du Colombier goto no;
9880ee5cbfSDavid du Colombier s = f->sym[o];
9980ee5cbfSDavid du Colombier if(s == S)
10080ee5cbfSDavid du Colombier goto no;
10180ee5cbfSDavid du Colombier
10280ee5cbfSDavid du Colombier /*
10380ee5cbfSDavid du Colombier * the answer is yes,
10480ee5cbfSDavid du Colombier * now we rewrite the node
10580ee5cbfSDavid du Colombier * and give diagnostics
10680ee5cbfSDavid du Colombier */
10780ee5cbfSDavid du Colombier switch(o) {
10880ee5cbfSDavid du Colombier default:
10980ee5cbfSDavid du Colombier diag(n, "isfunct op missing %O\n", o);
11080ee5cbfSDavid du Colombier goto bad;
11180ee5cbfSDavid du Colombier
11280ee5cbfSDavid du Colombier case OADD: // T f(T, T)
11380ee5cbfSDavid du Colombier case OAND:
11480ee5cbfSDavid du Colombier case OASHL:
11580ee5cbfSDavid du Colombier case OASHR:
11680ee5cbfSDavid du Colombier case ODIV:
11780ee5cbfSDavid du Colombier case OLDIV:
11880ee5cbfSDavid du Colombier case OLMOD:
11980ee5cbfSDavid du Colombier case OLMUL:
12080ee5cbfSDavid du Colombier case OLSHR:
12180ee5cbfSDavid du Colombier case OMOD:
12280ee5cbfSDavid du Colombier case OMUL:
12380ee5cbfSDavid du Colombier case OOR:
12480ee5cbfSDavid du Colombier case OSUB:
12580ee5cbfSDavid du Colombier case OXOR:
12680ee5cbfSDavid du Colombier
12780ee5cbfSDavid du Colombier case OEQ: // int f(T, T)
12880ee5cbfSDavid du Colombier case OGE:
12980ee5cbfSDavid du Colombier case OGT:
13080ee5cbfSDavid du Colombier case OHI:
13180ee5cbfSDavid du Colombier case OHS:
13280ee5cbfSDavid du Colombier case OLE:
13380ee5cbfSDavid du Colombier case OLO:
13480ee5cbfSDavid du Colombier case OLS:
13580ee5cbfSDavid du Colombier case OLT:
13680ee5cbfSDavid du Colombier case ONE:
13780ee5cbfSDavid du Colombier if(n->right == Z)
13880ee5cbfSDavid du Colombier goto bad;
13980ee5cbfSDavid du Colombier t1 = n->right->type;
14080ee5cbfSDavid du Colombier if(t1 == T)
14180ee5cbfSDavid du Colombier goto bad;
14280ee5cbfSDavid du Colombier if(t1->funct != f)
14380ee5cbfSDavid du Colombier goto bad;
14480ee5cbfSDavid du Colombier n->right = new(OLIST, n->left, n->right);
14580ee5cbfSDavid du Colombier break;
14680ee5cbfSDavid du Colombier
14780ee5cbfSDavid du Colombier case OAS: // structure copies done by the compiler
14880ee5cbfSDavid du Colombier case OASI:
14980ee5cbfSDavid du Colombier goto no;
15080ee5cbfSDavid du Colombier
15180ee5cbfSDavid du Colombier case OASADD: // T f(T*, T)
15280ee5cbfSDavid du Colombier case OASAND:
15380ee5cbfSDavid du Colombier case OASASHL:
15480ee5cbfSDavid du Colombier case OASASHR:
15580ee5cbfSDavid du Colombier case OASDIV:
15680ee5cbfSDavid du Colombier case OASLDIV:
15780ee5cbfSDavid du Colombier case OASLMOD:
15880ee5cbfSDavid du Colombier case OASLMUL:
15980ee5cbfSDavid du Colombier case OASLSHR:
16080ee5cbfSDavid du Colombier case OASMOD:
16180ee5cbfSDavid du Colombier case OASMUL:
16280ee5cbfSDavid du Colombier case OASOR:
16380ee5cbfSDavid du Colombier case OASSUB:
16480ee5cbfSDavid du Colombier case OASXOR:
16580ee5cbfSDavid du Colombier if(n->right == Z)
16680ee5cbfSDavid du Colombier goto bad;
16780ee5cbfSDavid du Colombier t1 = n->right->type;
16880ee5cbfSDavid du Colombier if(t1 == T)
16980ee5cbfSDavid du Colombier goto bad;
17080ee5cbfSDavid du Colombier if(t1->funct != f)
17180ee5cbfSDavid du Colombier goto bad;
17280ee5cbfSDavid du Colombier n->right = new(OLIST, new(OADDR, n->left, Z), n->right);
17380ee5cbfSDavid du Colombier break;
17480ee5cbfSDavid du Colombier
17580ee5cbfSDavid du Colombier case OPOS: // T f(T)
17680ee5cbfSDavid du Colombier case ONEG:
17780ee5cbfSDavid du Colombier case ONOT:
17880ee5cbfSDavid du Colombier case OCOM:
17980ee5cbfSDavid du Colombier n->right = n->left;
18080ee5cbfSDavid du Colombier break;
18180ee5cbfSDavid du Colombier
18280ee5cbfSDavid du Colombier
18380ee5cbfSDavid du Colombier }
18480ee5cbfSDavid du Colombier
18580ee5cbfSDavid du Colombier build:
18680ee5cbfSDavid du Colombier l = new(ONAME, Z, Z);
18780ee5cbfSDavid du Colombier l->sym = s;
18880ee5cbfSDavid du Colombier l->type = s->type;
18980ee5cbfSDavid du Colombier l->etype = s->type->etype;
19080ee5cbfSDavid du Colombier l->xoffset = s->offset;
19180ee5cbfSDavid du Colombier l->class = s->class;
19280ee5cbfSDavid du Colombier tcomo(l, 0);
19380ee5cbfSDavid du Colombier
19480ee5cbfSDavid du Colombier n->op = OFUNC;
19580ee5cbfSDavid du Colombier n->left = l;
19680ee5cbfSDavid du Colombier n->type = l->type->link;
19780ee5cbfSDavid du Colombier if(tcompat(n, T, l->type, tfunct))
19880ee5cbfSDavid du Colombier goto bad;
19980ee5cbfSDavid du Colombier if(tcoma(n->left, n->right, l->type->down, 1))
20080ee5cbfSDavid du Colombier goto bad;
20180ee5cbfSDavid du Colombier return 1;
20280ee5cbfSDavid du Colombier
20380ee5cbfSDavid du Colombier no:
20480ee5cbfSDavid du Colombier return 0;
20580ee5cbfSDavid du Colombier
20680ee5cbfSDavid du Colombier bad:
20780ee5cbfSDavid du Colombier diag(n, "cant rewrite typestr for op %O\n", o);
20880ee5cbfSDavid du Colombier prtree(n, "isfunct");
20980ee5cbfSDavid du Colombier n->type = T;
21080ee5cbfSDavid du Colombier return 1;
21180ee5cbfSDavid du Colombier }
21280ee5cbfSDavid du Colombier
21380ee5cbfSDavid du Colombier void
dclfunct(Type * t,Sym * s)21480ee5cbfSDavid du Colombier dclfunct(Type *t, Sym *s)
21580ee5cbfSDavid du Colombier {
21680ee5cbfSDavid du Colombier Funct *f;
21780ee5cbfSDavid du Colombier Node *n;
21880ee5cbfSDavid du Colombier Type *f1, *f2, *f3, *f4;
21980ee5cbfSDavid du Colombier int o, i, c;
22080ee5cbfSDavid du Colombier char str[100];
22180ee5cbfSDavid du Colombier
22280ee5cbfSDavid du Colombier if(t->funct)
22380ee5cbfSDavid du Colombier return;
22480ee5cbfSDavid du Colombier
22580ee5cbfSDavid du Colombier // recognize generated tag of dorm _%d_
22680ee5cbfSDavid du Colombier if(t->tag == S)
22780ee5cbfSDavid du Colombier goto bad;
22880ee5cbfSDavid du Colombier for(i=0; c = t->tag->name[i]; i++) {
22980ee5cbfSDavid du Colombier if(c == '_') {
23080ee5cbfSDavid du Colombier if(i == 0 || t->tag->name[i+1] == 0)
23180ee5cbfSDavid du Colombier continue;
23280ee5cbfSDavid du Colombier break;
23380ee5cbfSDavid du Colombier }
23480ee5cbfSDavid du Colombier if(c < '0' || c > '9')
23580ee5cbfSDavid du Colombier break;
23680ee5cbfSDavid du Colombier }
23780ee5cbfSDavid du Colombier if(c == 0)
23880ee5cbfSDavid du Colombier goto bad;
23980ee5cbfSDavid du Colombier
24080ee5cbfSDavid du Colombier f = alloc(sizeof(*f));
241*c88b16f0SDavid du Colombier for(o=0; o<nelem(f->sym); o++)
24280ee5cbfSDavid du Colombier f->sym[o] = S;
24380ee5cbfSDavid du Colombier
24480ee5cbfSDavid du Colombier t->funct = f;
24580ee5cbfSDavid du Colombier
24680ee5cbfSDavid du Colombier f1 = typ(TFUNC, t);
24780ee5cbfSDavid du Colombier f1->down = copytyp(t);
24880ee5cbfSDavid du Colombier f1->down->down = t;
24980ee5cbfSDavid du Colombier
25080ee5cbfSDavid du Colombier f2 = typ(TFUNC, types[TINT]);
25180ee5cbfSDavid du Colombier f2->down = copytyp(t);
25280ee5cbfSDavid du Colombier f2->down->down = t;
25380ee5cbfSDavid du Colombier
25480ee5cbfSDavid du Colombier f3 = typ(TFUNC, t);
25580ee5cbfSDavid du Colombier f3->down = typ(TIND, t);
25680ee5cbfSDavid du Colombier f3->down->down = t;
25780ee5cbfSDavid du Colombier
25880ee5cbfSDavid du Colombier f4 = typ(TFUNC, t);
25980ee5cbfSDavid du Colombier f4->down = t;
26080ee5cbfSDavid du Colombier
26180ee5cbfSDavid du Colombier for(i=0;; i++) {
26280ee5cbfSDavid du Colombier o = ftabinit[i].op;
26380ee5cbfSDavid du Colombier if(o == OXXX)
26480ee5cbfSDavid du Colombier break;
26580ee5cbfSDavid du Colombier sprint(str, "%s_%s_", t->tag->name, ftabinit[i].name);
26680ee5cbfSDavid du Colombier n = new(ONAME, Z, Z);
26780ee5cbfSDavid du Colombier n->sym = slookup(str);
26880ee5cbfSDavid du Colombier f->sym[o] = n->sym;
26980ee5cbfSDavid du Colombier switch(ftabinit[i].typ) {
27080ee5cbfSDavid du Colombier default:
27180ee5cbfSDavid du Colombier diag(Z, "dclfunct op missing %d\n", ftabinit[i].typ);
27280ee5cbfSDavid du Colombier break;
27380ee5cbfSDavid du Colombier
27480ee5cbfSDavid du Colombier case 1: // T f(T,T) +
27580ee5cbfSDavid du Colombier dodecl(xdecl, CEXTERN, f1, n);
27680ee5cbfSDavid du Colombier break;
27780ee5cbfSDavid du Colombier
27880ee5cbfSDavid du Colombier case 2: // int f(T,T) ==
27980ee5cbfSDavid du Colombier dodecl(xdecl, CEXTERN, f2, n);
28080ee5cbfSDavid du Colombier break;
28180ee5cbfSDavid du Colombier
28280ee5cbfSDavid du Colombier case 3: // void f(T*,T) +=
28380ee5cbfSDavid du Colombier dodecl(xdecl, CEXTERN, f3, n);
28480ee5cbfSDavid du Colombier break;
28580ee5cbfSDavid du Colombier
28680ee5cbfSDavid du Colombier case 4: // T f(T) ~
28780ee5cbfSDavid du Colombier dodecl(xdecl, CEXTERN, f4, n);
28880ee5cbfSDavid du Colombier break;
28980ee5cbfSDavid du Colombier }
29080ee5cbfSDavid du Colombier }
29180ee5cbfSDavid du Colombier for(i=0;; i++) {
29280ee5cbfSDavid du Colombier o = gtabinit[i].etype;
29380ee5cbfSDavid du Colombier if(o == TXXX)
29480ee5cbfSDavid du Colombier break;
29580ee5cbfSDavid du Colombier
29680ee5cbfSDavid du Colombier /*
29780ee5cbfSDavid du Colombier * OCAST types T1 _T2_T1_(T2)
29880ee5cbfSDavid du Colombier */
29980ee5cbfSDavid du Colombier sprint(str, "_%s%s_", gtabinit[i].name, t->tag->name);
30080ee5cbfSDavid du Colombier n = new(ONAME, Z, Z);
30180ee5cbfSDavid du Colombier n->sym = slookup(str);
30280ee5cbfSDavid du Colombier f->castto[o] = n->sym;
30380ee5cbfSDavid du Colombier
30480ee5cbfSDavid du Colombier f1 = typ(TFUNC, t);
30580ee5cbfSDavid du Colombier f1->down = types[o];
30680ee5cbfSDavid du Colombier dodecl(xdecl, CEXTERN, f1, n);
30780ee5cbfSDavid du Colombier
30880ee5cbfSDavid du Colombier sprint(str, "%s_%s_", t->tag->name, gtabinit[i].name);
30980ee5cbfSDavid du Colombier n = new(ONAME, Z, Z);
31080ee5cbfSDavid du Colombier n->sym = slookup(str);
31180ee5cbfSDavid du Colombier f->castfr[o] = n->sym;
31280ee5cbfSDavid du Colombier
31380ee5cbfSDavid du Colombier f1 = typ(TFUNC, types[o]);
31480ee5cbfSDavid du Colombier f1->down = t;
31580ee5cbfSDavid du Colombier dodecl(xdecl, CEXTERN, f1, n);
31680ee5cbfSDavid du Colombier }
31780ee5cbfSDavid du Colombier return;
31880ee5cbfSDavid du Colombier bad:
31980ee5cbfSDavid du Colombier diag(Z, "dclfunct bad %T %s\n", t, s->name);
32080ee5cbfSDavid du Colombier }
32180ee5cbfSDavid du Colombier
32280ee5cbfSDavid du Colombier Gtab gtabinit[NTYPE] =
32380ee5cbfSDavid du Colombier {
32480ee5cbfSDavid du Colombier TCHAR, "c",
32580ee5cbfSDavid du Colombier TUCHAR, "uc",
32680ee5cbfSDavid du Colombier TSHORT, "h",
32780ee5cbfSDavid du Colombier TUSHORT, "uh",
32880ee5cbfSDavid du Colombier TINT, "i",
32980ee5cbfSDavid du Colombier TUINT, "ui",
33080ee5cbfSDavid du Colombier TLONG, "l",
33180ee5cbfSDavid du Colombier TULONG, "ul",
33280ee5cbfSDavid du Colombier TVLONG, "v",
33380ee5cbfSDavid du Colombier TUVLONG, "uv",
33480ee5cbfSDavid du Colombier TFLOAT, "f",
33580ee5cbfSDavid du Colombier TDOUBLE, "d",
33680ee5cbfSDavid du Colombier TXXX
33780ee5cbfSDavid du Colombier };
33880ee5cbfSDavid du Colombier
33980ee5cbfSDavid du Colombier Ftab ftabinit[OEND] =
34080ee5cbfSDavid du Colombier {
34180ee5cbfSDavid du Colombier OADD, "add", 1,
34280ee5cbfSDavid du Colombier OAND, "and", 1,
34380ee5cbfSDavid du Colombier OASHL, "ashl", 1,
34480ee5cbfSDavid du Colombier OASHR, "ashr", 1,
34580ee5cbfSDavid du Colombier ODIV, "div", 1,
34680ee5cbfSDavid du Colombier OLDIV, "ldiv", 1,
34780ee5cbfSDavid du Colombier OLMOD, "lmod", 1,
34880ee5cbfSDavid du Colombier OLMUL, "lmul", 1,
34980ee5cbfSDavid du Colombier OLSHR, "lshr", 1,
35080ee5cbfSDavid du Colombier OMOD, "mod", 1,
35180ee5cbfSDavid du Colombier OMUL, "mul", 1,
35280ee5cbfSDavid du Colombier OOR, "or", 1,
35380ee5cbfSDavid du Colombier OSUB, "sub", 1,
35480ee5cbfSDavid du Colombier OXOR, "xor", 1,
35580ee5cbfSDavid du Colombier
35680ee5cbfSDavid du Colombier OEQ, "eq", 2,
35780ee5cbfSDavid du Colombier OGE, "ge", 2,
35880ee5cbfSDavid du Colombier OGT, "gt", 2,
35980ee5cbfSDavid du Colombier OHI, "hi", 2,
36080ee5cbfSDavid du Colombier OHS, "hs", 2,
36180ee5cbfSDavid du Colombier OLE, "le", 2,
36280ee5cbfSDavid du Colombier OLO, "lo", 2,
36380ee5cbfSDavid du Colombier OLS, "ls", 2,
36480ee5cbfSDavid du Colombier OLT, "lt", 2,
36580ee5cbfSDavid du Colombier ONE, "ne", 2,
36680ee5cbfSDavid du Colombier
36780ee5cbfSDavid du Colombier OASADD, "asadd", 3,
36880ee5cbfSDavid du Colombier OASAND, "asand", 3,
36980ee5cbfSDavid du Colombier OASASHL, "asashl", 3,
37080ee5cbfSDavid du Colombier OASASHR, "asashr", 3,
37180ee5cbfSDavid du Colombier OASDIV, "asdiv", 3,
37280ee5cbfSDavid du Colombier OASLDIV, "asldiv", 3,
37380ee5cbfSDavid du Colombier OASLMOD, "aslmod", 3,
37480ee5cbfSDavid du Colombier OASLMUL, "aslmul", 3,
37580ee5cbfSDavid du Colombier OASLSHR, "aslshr", 3,
37680ee5cbfSDavid du Colombier OASMOD, "asmod", 3,
37780ee5cbfSDavid du Colombier OASMUL, "asmul", 3,
37880ee5cbfSDavid du Colombier OASOR, "asor", 3,
37980ee5cbfSDavid du Colombier OASSUB, "assub", 3,
38080ee5cbfSDavid du Colombier OASXOR, "asxor", 3,
38180ee5cbfSDavid du Colombier
38280ee5cbfSDavid du Colombier OPOS, "pos", 4,
38380ee5cbfSDavid du Colombier ONEG, "neg", 4,
38480ee5cbfSDavid du Colombier OCOM, "com", 4,
38580ee5cbfSDavid du Colombier ONOT, "not", 4,
38680ee5cbfSDavid du Colombier
38780ee5cbfSDavid du Colombier // OPOSTDEC,
38880ee5cbfSDavid du Colombier // OPOSTINC,
38980ee5cbfSDavid du Colombier // OPREDEC,
39080ee5cbfSDavid du Colombier // OPREINC,
39180ee5cbfSDavid du Colombier
39280ee5cbfSDavid du Colombier OXXX,
39380ee5cbfSDavid du Colombier };
39480ee5cbfSDavid du Colombier
39580ee5cbfSDavid du Colombier // Node* nodtestv;
39680ee5cbfSDavid du Colombier
39780ee5cbfSDavid du Colombier // Node* nodvpp;
39880ee5cbfSDavid du Colombier // Node* nodppv;
39980ee5cbfSDavid du Colombier // Node* nodvmm;
40080ee5cbfSDavid du Colombier // Node* nodmmv;
401