3 static int resvreg[nelem(reg)];
5 static void gopcode64(int, Node*, Node*, Node*);
6 static void gori64(int, Node*, Node*, Node*);
7 static void gandi64(int, Node*, Node*, Node*);
17 exfregoffset = FREGEXT;
28 tfield = types[TLONG];
33 zprog.from.type = D_NONE;
34 zprog.from.name = D_NONE;
35 zprog.from.reg = NREG;
36 zprog.from3 = zprog.from;
37 zprog.to = zprog.from;
39 regnode.op = OREGISTER;
40 regnode.class = CEXREG;
44 regnode.type = types[TLONG];
46 constnode.op = OCONST;
47 constnode.class = CXXX;
48 constnode.complex = 0;
49 constnode.addable = 20;
50 constnode.type = types[TLONG];
52 fconstnode.op = OCONST;
53 fconstnode.class = CXXX;
54 fconstnode.complex = 0;
55 fconstnode.addable = 20;
56 fconstnode.type = types[TDOUBLE];
58 nodsafe = new(ONAME, Z, Z);
59 nodsafe->sym = slookup(".safe");
60 nodsafe->type = types[TINT];
61 nodsafe->etype = types[TINT]->etype;
62 nodsafe->class = CAUTO;
65 t = typ(TARRAY, types[TCHAR]);
66 symrathole = slookup(".rathole");
67 symrathole->class = CGLOBL;
70 nodrat = new(ONAME, Z, Z);
71 nodrat->sym = symrathole;
72 nodrat->type = types[TIND];
73 nodrat->etype = TVOID;
74 nodrat->class = CGLOBL;
80 memset(reg, 0, sizeof(reg));
81 reg[REGZERO] = 1; /* don't use */
83 reg[FREGCVI+NREG] = 1;
84 reg[FREGZERO+NREG] = 1;
85 reg[FREGHALF+NREG] = 1;
86 reg[FREGONE+NREG] = 1;
87 reg[FREGTWO+NREG] = 1;
88 memmove(resvreg, reg, sizeof(reg));
98 if(reg[i] && !resvreg[i])
99 diag(Z, "reg %d left allocated", i);
100 for(i=NREG; i<NREG+NREG; i++)
101 if(reg[i] && !resvreg[i])
102 diag(Z, "freg %d left allocated", i-NREG);
105 symstring->type->width = nstring;
106 symrathole->type->width = nrathole;
107 for(i=0; i<NHASH; i++)
108 for(s = hash[i]; s != S; s = s->link) {
111 if(s->type->width == 0)
113 if(s->class != CGLOBL && s->class != CSTATIC)
115 if(s->type == types[TENUM])
117 gpseudo(AGLOBL, s, nodconst(s->type->width));
128 p = alloc(sizeof(*p));
142 gargs(Node *n, Node *tn1, Node *tn2)
145 Node fnxargs[20], *fnxp;
150 garg1(n, tn1, tn2, 0, &fnxp); /* compile fns to temps */
154 garg1(n, tn1, tn2, 1, &fnxp); /* compile normal args and temps */
160 garg1(Node *n, Node *tn1, Node *tn2, int f, Node **fnxp)
167 garg1(n->left, tn1, tn2, f, fnxp);
168 garg1(n->right, tn1, tn2, f, fnxp);
172 if(n->complex >= FNX) {
184 if(typesuv[n->type->etype]) {
186 if(n->complex >= FNX) {
193 if(REGARG && curarg == 0 && typechlp[n->type->etype]) {
195 if(n->complex >= FNX) {
204 gopcode(OAS, n, Z, tn2);
208 if(n->complex >= FNX) {
214 gopcode(OAS, tn1, Z, tn2);
221 constnode.vconst = v & MASK(32);
228 constnode.vconst = v;
235 fconstnode.fconst = d;
240 nodreg(Node *n, Node *nn, int reg)
245 n->lineno = nn->lineno;
249 regret(Node *n, Node *nn)
254 if(typefd[nn->type->etype])
261 regalloc(Node *n, Node *tn, Node *o)
266 switch(tn->type->etype) {
276 if(o != Z && o->op == OREGISTER) {
278 if(i > 0 && i < NREG)
281 j = lasti + REGRET+1;
282 for(i=REGRET+1; i<NREG; i++) {
291 diag(tn, "out of fixed registers");
296 if(o != Z && o->op == OREGISTER) {
298 if(i >= NREG && i < NREG+NREG)
302 for(i=NREG; i<NREG+NREG; i++) {
311 diag(tn, "out of float registers");
317 n->complex = 0; /* already in registers */
321 n->left = alloc(sizeof(Node));
322 n->right = alloc(sizeof(Node));
323 if(o != Z && o->op == OREGPAIR) {
324 regalloc(n->left, ®node, o->left);
325 regalloc(n->right, ®node, o->right);
327 regalloc(n->left, ®node, Z);
328 regalloc(n->right, ®node, Z);
330 n->right->type = types[TULONG];
331 if(tn->type->etype == TUVLONG)
332 n->left->type = types[TULONG]; /* TO DO: is this a bad idea? */
335 diag(tn, "unknown type in regalloc: %T", tn->type);
348 regialloc(Node *n, Node *tn, Node *o)
353 nod.type = types[TIND];
354 regalloc(n, &nod, o);
362 if(n->op == OREGPAIR) {
368 if(n->op != OREGISTER && n->op != OINDREG)
371 if(i < 0 || i >= sizeof(reg))
378 diag(n, "error in regfree: %d [%d]", i, reg[i]);
379 prtree(n, "regfree");
383 regsalloc(Node *n, Node *nn)
385 cursafe = align(cursafe+stkoff, nn->type, Aaut3)-stkoff;
386 maxargsafe = maxround(maxargsafe, cursafe+curarg);
387 // if(nn->type->etype == TDOUBLE || nn->type->etype == TVLONG){
388 // extern int hasdoubled;
389 // fprint(2, "stkoff=%ld cursafe=%ld curarg=%ld %d\n", stkoff, cursafe, curarg, hasdoubled);
392 n->xoffset = -(stkoff + cursafe);
394 n->etype = nn->type->etype;
395 n->lineno = nn->lineno;
399 regaalloc1(Node *n, Node *nn)
401 nodreg(n, nn, REGARG);
403 curarg = align(curarg, nn->type, Aarg1);
404 curarg = align(curarg, nn->type, Aarg2);
405 maxargsafe = maxround(maxargsafe, cursafe+curarg);
409 regaalloc(Node *n, Node *nn)
411 curarg = align(curarg, nn->type, Aarg1);
415 n->xoffset = curarg + SZ_LONG;
418 curarg = align(curarg, nn->type, Aarg2);
419 maxargsafe = maxround(maxargsafe, cursafe+curarg);
423 regind(Node *n, Node *nn)
426 if(n->op != OREGISTER) {
427 diag(n, "regind not OREGISTER");
435 raddr(Node *n, Prog *p)
440 if(R0ISZERO && a.type == D_CONST && a.offset == 0) {
444 if(a.type != D_REG && a.type != D_FREG) {
446 diag(n, "bad in raddr: %O", n->op);
448 diag(n, "bad in raddr: <null>");
455 naddr(Node *n, Adr *a)
465 diag(n, "bad in naddr: %O", n->op);
480 a->offset += n->xoffset; /* little hack for reglcgenv */
481 if(a->type == D_REG) {
485 if(a->type == D_CONST) {
494 a->offset = n->xoffset;
503 a->offset = n->xoffset;
504 if(n->class == CSTATIC)
506 if(n->class == CEXTERN || n->class == CGLOBL) {
510 if(n->class == CAUTO) {
514 if(n->class == CPARAM) {
523 if(typefd[n->type->etype]) {
528 a->offset = n->vconst;
534 if(a->type == D_OREG) {
541 if(n->left->op == OCONST) {
557 gloadhi(Node *f, Node *t, int c)
562 f = nodconst((long)(f->vconst>>32));
563 if(c==1 && sconst(f) || c==2 && uconst(f)){
564 if(t->op == OREGISTER)
570 if(f->op == OREGPAIR) {
575 f->type = types[TLONG];
581 gloadlo(Node *f, Node *t, int c)
586 f = nodconst((long)f->vconst);
588 if(t->op == OREGISTER)
594 if(f->op == OREGPAIR) {
599 f->type = types[TLONG];
600 f->xoffset += SZ_LONG;
602 prtree(f, "gloadlo f"); prtree(t, "gloadlo t");
605 f->xoffset -= SZ_LONG;
610 fop(int as, int f1, int f2, Node *t)
612 Node nod1, nod2, nod3;
614 nodreg(&nod1, t, NREG+f1);
615 nodreg(&nod2, t, NREG+f2);
616 regalloc(&nod3, t, t);
617 gopcode(as, &nod1, &nod2, &nod3);
623 gmove(Node *f, Node *t)
626 Node nod, fxc0, fxc1, fxc2, fxrat;
633 if(ft == TDOUBLE && f->op == OCONST) {
652 fop(OSUB, FREGHALF, FREGZERO, t);
656 fop(OSUB, FREGONE, FREGZERO, t);
660 fop(OSUB, FREGTWO, FREGZERO, t);
664 fop(OADD, FREGONE, FREGHALF, t);
668 fop(OADD, FREGTWO, FREGHALF, t);
672 fop(OADD, FREGTWO, FREGONE, t);
676 if(ft == TFLOAT && f->op == OCONST) {
681 nodreg(&nod, f, NREG+a);
686 if((ft == TVLONG || ft == TUVLONG) && f->op == OCONST && t->op == OREGPAIR) {
687 if(align(0, types[TCHAR], Aarg1)) /* isbigendian */
688 gmove(nod32const(f->vconst>>32), t->left);
690 gmove(nod32const(f->vconst), t->left);
691 if(align(0, types[TCHAR], Aarg1)) /* isbigendian */
692 gmove(nod32const(f->vconst), t->right);
694 gmove(nod32const(f->vconst>>32), t->right);
699 * put it into a register then
700 * worry what to do with it.
702 if(f->op == ONAME || f->op == OINDREG || f->op == OIND) {
728 regalloc(&nod, f, t);
729 /* low order first, because its value will be used first */
730 f->xoffset += SZ_LONG;
731 gins(AMOVW, f, nod.right);
732 f->xoffset -= SZ_LONG;
733 gins(AMOVW, f, nod.left);
735 /* assumed not float or double */
736 regalloc(&nod, ®node, t);
737 f->xoffset += SZ_LONG;
738 gins(AMOVW, f, &nod);
739 f->xoffset -= SZ_LONG;
742 regalloc(&nod, f, t);
752 * put it into a register then
755 if(t->op == ONAME || t->op == OINDREG || t->op == OIND) {
779 if(R0ISZERO && !typefd[ft] && vconst(f) == 0) {
782 t->xoffset += SZ_LONG;
784 t->xoffset -= SZ_LONG;
789 regalloc(&nod, t, f);
791 regalloc(&nod, t, Z);
794 t->xoffset += SZ_LONG;
795 gins(a, nod.right, t);
796 t->xoffset -= SZ_LONG;
797 gins(a, nod.left, t);
805 * type x type cross table
815 a = AFMOVS; /* AFMOVSD */
831 /* BUG: not right for unsigned long */
832 regalloc(&nod, f, Z); /* should be type float */
833 regsalloc(&fxrat, &fconstnode);
834 gins(AFCTIWZ, f, &nod);
835 gins(AFMOVD, &nod, &fxrat);
837 fxrat.type = nodrat->type;
838 fxrat.etype = nodrat->etype;
840 gins(AMOVW, &fxrat, t);
933 * rat[0] = 0x43300000; rat[1] = f^0x80000000;
934 * t = *(double*)rat - FREGCVI;
935 * is-unsigned(t) => if(t<0) t += 2^32;
936 * could be streamlined for int-to-float
938 regalloc(&fxc0, f, Z);
939 regalloc(&fxc2, f, Z);
940 regsalloc(&fxrat, &fconstnode); /* should be type float */
941 gins(AMOVW, nodconst(0x43300000L), &fxc0);
942 gins(AMOVW, f, &fxc2);
943 gins(AMOVW, &fxc0, &fxrat);
944 gins(AXOR, nodconst(0x80000000L), &fxc2);
946 fxc1.type = nodrat->type;
947 fxc1.etype = nodrat->etype;
948 fxc1.xoffset += SZ_LONG;
949 gins(AMOVW, &fxc2, &fxc1);
952 regalloc(&nod, t, t); /* should be type float */
953 gins(AFMOVD, &fxrat, &nod);
954 nodreg(&fxc1, t, NREG+FREGCVI);
955 gins(AFSUB, &fxc1, &nod);
962 regalloc(&nod, t, Z);
966 p->to.reg = FREGZERO;
969 gins(AFMOVS, nodfconst(4294967296.), &nod);
970 gins(AFADDS, &nod, t);
974 p->to.reg = FREGZERO;
977 gins(AFMOVD, nodfconst(4294967296.), &nod);
978 gins(AFADD, &nod, t);
1010 diag(Z, "bad opcode in gmove %T -> %T", f->type, t->type);
1011 if(a == AMOVW || a == AFMOVS || a == AFMOVD)
1015 if(f->op != OREGPAIR || t->op != OREGPAIR)
1016 diag(Z, "bad vlong in gmove (%O->%O)", f->op, t->op);
1017 gins(a, f->left, t->left);
1018 gins(a, f->right, t->right);
1024 gins(int a, Node *f, Node *t)
1038 gins3(int a, Node *f1, Node *f2, Node *t)
1045 naddr(f1, &p->from);
1046 if(f2 != Z && (f2->op != OREGISTER || !samaddr(f2, t))) {
1047 ta = zprog.from; /* TO DO */
1050 if(ta.type == D_CONST && ta.offset == 0) {
1054 diag(Z, "REGZERO in gins3 %A", a);
1055 }else if(ta.type == D_CONST)
1065 gins4(int a, Node *f1, Node *f2, Node *f3, Node *t)
1071 naddr(f1, &p->from);
1072 if(f2->op != OREGISTER && (f2->op != OCONST || vconst(f2) != 0))
1073 diag(f2, "invalid gins4");
1076 if(ta.type == D_CONST && ta.offset == 0)
1078 naddr(f3, &p->from3);
1085 gopcode(int o, Node *f1, Node *f2, Node *t)
1094 if(f1 != Z && f1->type != T) {
1095 if(f1->op == OCONST && t != Z && t->type != T)
1096 et = t->type->etype;
1098 et = f1->type->etype;
1100 if((typev[et] || t->type != T && typev[t->type->etype]) && o != OFUNC) {
1101 gopcode64(o, f1, f2, t);
1136 if(f1->op == OCONST)
1213 if(et == TFLOAT || et == TDOUBLE)
1219 if(t->op == OCONST && t->vconst >= (1<<15))
1225 if(t->op == OCONST && t->vconst >= (1<<15))
1265 p->as = uns? ACMPU: ACMP;
1272 naddr(f1, &p->from);
1275 if(f1 == Z || t == Z || f2 != Z)
1276 diag(Z, "bad cmp in gopcode %O", o);
1285 diag(Z, "bad in gopcode %O", o);
1286 gins3(a, f1, f2, t);
1290 gopcode64(int o, Node *f1, Node *f2, Node *t)
1293 Node nod, nod1, nod2, sh;
1297 if(t->op != OREGPAIR || f2 != Z && f2->op != OREGPAIR) {
1298 diag(Z, "bad f2/dest in gopcode64 %O", o);
1301 if(f1->op != OCONST &&
1302 (typev[f1->type->etype] && f1->op != OREGPAIR || !typev[f1->type->etype] && f1->op != OREGISTER)) {
1303 diag(Z, "bad f1[%O] in gopcode64 %O", f1->op, o);
1306 /* a1 for low-order, a2 for high-order */
1312 if(f1->op == OCONST && sconst(f1)) {
1315 gins3(AADDC, f1, f2->right, t->right);
1316 if((f1->vconst>>32) == 0)
1317 gins(AADDZE, f2->left, t->left);
1318 else if((f1->vconst>>32) == -1)
1319 gins(AADDME, f2->left, t->left);
1321 diag(t, "odd vlong ADD: %lld", f1->vconst);
1336 if(f1->op == OCONST) {
1337 gori64(AOR, f1, f2, t);
1345 if(f1->op == OCONST) {
1346 gandi64(AANDCC, f1, f2, t);
1354 if(f1->op == OCONST) {
1355 gori64(AXOR, f1, f2, t);
1365 if(f1->op == OCONST) {
1366 if(f1->vconst >= 32) {
1367 if(f1->vconst == 32)
1368 gmove(f2->left, t->right);
1369 else if(f1->vconst < 64)
1370 gins3(ASRW, nodconst(f1->vconst-32), f2->left, t->right);
1372 gmove(nodconst(0), t->right);
1373 gmove(nodconst(0), t->left);
1376 if(f1->vconst <= 0) {
1381 sh = *nodconst(32 - f1->vconst);
1382 m = 0xFFFFFFFFUL >> f1->vconst;
1383 gins4(ARLWNM, &sh, f2->right, nodconst(m), t->right);
1384 gins4(ARLWMI, &sh, f2->left, nodconst(~m), t->right);
1385 gins4(ARLWNM, &sh, f2->left, nodconst(m), t->left);
1388 regalloc(&nod, ®node, Z);
1389 gins3(ASUBC, f1, nodconst(32), &nod);
1390 gins3(ASRW, f1, f2->right, t->right);
1391 regalloc(&nod1, ®node, Z);
1392 gins3(ASLW, &nod, f2->left, &nod1);
1393 gins(AOR, &nod1, t->right);
1394 gins3(AADD, nodconst(-32), f1, &nod);
1395 gins3(ASRW, &nod, f2->left, &nod1);
1396 gins(AOR, &nod1, t->right);
1397 gins3(ASRW, f1, f2->left, t->left);
1406 if(f1->op == OCONST) {
1407 if(f1->vconst >= 32) {
1408 if(f1->vconst == 32)
1409 gmove(f2->left, t->right);
1410 else if(f1->vconst < 64)
1411 gins3(ASRAW, nodconst(f1->vconst-32), f2->left, t->right);
1412 gins3(ASRAW, nodconst(31), f2->left, t->left);
1413 if(f1->vconst >= 64) {
1414 gmove(t->left, t->right);
1419 if(f1->vconst <= 0) {
1424 sh = *nodconst(32 - f1->vconst);
1425 m = 0xFFFFFFFFUL >> f1->vconst;
1426 gins4(ARLWNM, &sh, f2->right, nodconst(m), t->right);
1427 gins4(ARLWMI, &sh, f2->left, nodconst(~m), t->right);
1428 gins3(ASRAW, &sh, f2->left, t->left);
1431 regalloc(&nod, ®node, Z);
1432 gins3(ASUBC, f1, nodconst(32), &nod);
1433 gins3(ASRW, f1, f2->right, t->right);
1434 regalloc(&nod1, ®node, Z);
1435 gins3(ASLW, &nod, f2->left, &nod1);
1436 gins(AOR, &nod1, t->right);
1437 gins3(AADDCCC, nodconst(-32), f1, &nod);
1438 gins3(ASRAW, &nod, f2->left, &nod1);
1441 gins(AMOVW, &nod1, t->right);
1443 gins3(ASRAW, f1, f2->left, t->left);
1452 if(f1->op == OCONST) {
1453 if(f1->vconst >= 32) {
1454 if(f1->vconst == 32)
1455 gmove(f2->right, t->left);
1456 else if(f1->vconst >= 64)
1457 gmove(nodconst(0), t->left);
1459 gins3(ASLW, nodconst(f1->vconst-32), f2->right, t->left);
1460 gmove(nodconst(0), t->right);
1463 if(f1->vconst <= 0) {
1468 m = 0xFFFFFFFFUL << f1->vconst;
1469 gins4(ARLWNM, f1, f2->left, nodconst(m), t->left);
1470 gins4(ARLWMI, f1, f2->right, nodconst(~m), t->left);
1471 gins4(ARLWNM, f1, f2->right, nodconst(m), t->right);
1474 regalloc(&nod, ®node, Z);
1475 gins3(ASUBC, f1, nodconst(32), &nod);
1476 gins3(ASLW, f1, f2->left, t->left);
1477 regalloc(&nod1, ®node, Z);
1478 gins3(ASRW, &nod, f2->right, &nod1);
1479 gins(AOR, &nod1, t->left);
1480 gins3(AADD, nodconst(-32), f1, &nod);
1481 gins3(ASLW, &nod, f2->right, &nod1);
1482 gins(AOR, &nod1, t->left);
1483 gins3(ASLW, f1, f2->right, t->right);
1494 regalloc(&nod, ®node, Z);
1495 gins3(AMULLW, f1->right, f2->right, &nod); /* lo(f2.low*f1.low) */
1496 regalloc(&nod1, ®node, Z);
1497 gins3(AMULHWU, f1->right, f2->right, &nod1); /* hi(f2.low*f1.low) */
1498 regalloc(&nod2, ®node, Z);
1499 gins3(AMULLW, f2->right, f1->left, &nod2); /* lo(f2.low*f1.high) */
1500 gins(AADD, &nod2, &nod1);
1501 gins3(AMULLW, f1->right, f2->left, &nod2); /* lo(f2.high*f1.low) */
1502 gins(AADD, &nod2, &nod1);
1504 gmove(&nod, t->right);
1505 gmove(&nod1, t->left);
1515 gins3(ASUBC, t->right, nodconst(0), t->right);
1516 gins(ASUBZE, t->left, t->left);
1519 if(a1 == AGOK || a2 == AGOK)
1520 diag(Z, "bad in gopcode64 %O", o);
1521 if(f1->op == OCONST) {
1522 if(f2 != Z & f2 != t)
1523 diag(Z, "bad const in gopcode64 %O", o);
1524 gins(a1, nod32const(f1->vconst), t->right);
1525 gins(a2, nod32const(f1->vconst>>32), t->left);
1527 if(f2 != Z && f2 != t) {
1528 gins3(a1, f1->right, f2->right, t->right);
1529 gins3(a2, f1->left, f2->left, t->left);
1531 gins(a1, f1->right, t->right);
1532 gins(a2, f1->left, t->left);
1537 samaddr(Node *f, Node *t)
1545 if(f->reg != t->reg)
1550 return samaddr(f->left, t->left) && samaddr(f->right, t->right);
1556 gori64(int a, Node *f1, Node *f2, Node *t)
1562 lo = f1->vconst & MASK(32);
1563 hi = (f1->vconst >> 32) & MASK(32);
1565 gins3(a, nodconst(lo & 0xFFFF), f2->right, t->right);
1567 gins3(a, nodconst(lo & 0xFFFF0000UL), f2->right, t->right);
1569 gins3(a, nodconst(hi & 0xFFFF), f2->left, t->left);
1571 gins3(a, nodconst(hi & 0xFFFF0000UL), f2->left, t->left);
1575 gandi64(int a, Node *f1, Node *f2, Node *t)
1581 lo = f1->vconst & MASK(32);
1582 hi = (f1->vconst >> 32) & MASK(32);
1584 gins(AMOVW, nodconst(0), t->right);
1586 gins3(a, nodconst(lo), f2->right, t->right);
1588 gins(AMOVW, nodconst(0), t->left);
1590 gins3(a, nodconst(hi), f2->left, t->left);
1609 diag(Z, "bad in gbranch %O", o);
1616 patch(Prog *op, long pc)
1620 op->to.type = D_BRANCH;
1624 gpseudo(int a, Sym *s, Node *n)
1629 p->from.type = D_OREG;
1632 p->reg = (profileflg ? 0 : NOPROF);
1633 p->from.name = D_EXTERN;
1634 if(s->class == CSTATIC)
1635 p->from.name = D_STATIC;
1637 if(a == ADATA || a == AGLOBL)
1645 if(v >= -(1<<15) && v < (1<<15))
1655 if(n->op == OCONST) {
1656 if(!typefd[n->type->etype]) {
1658 if(vv >= -(((vlong)1)<<15) && vv < (((vlong)1)<<15))
1670 if(n->op == OCONST) {
1671 if(!typefd[n->type->etype]) {
1673 if(vv >= 0 && vv < (((vlong)1)<<16))
1685 if(typechlp[t->etype]) {
1686 if(exregoffset <= 3)
1692 if(typefd[t->etype]) {
1693 if(exfregoffset <= 16)
1695 o = exfregoffset + NREG;
1702 schar ewidth[NTYPE] =
1705 SZ_CHAR, /* [TCHAR] */
1706 SZ_CHAR, /* [TUCHAR] */
1707 SZ_SHORT, /* [TSHORT] */
1708 SZ_SHORT, /* [TUSHORT] */
1709 SZ_INT, /* [TINT] */
1710 SZ_INT, /* [TUINT] */
1711 SZ_LONG, /* [TLONG] */
1712 SZ_LONG, /* [TULONG] */
1713 SZ_VLONG, /* [TVLONG] */
1714 SZ_VLONG, /* [TUVLONG] */
1715 SZ_FLOAT, /* [TFLOAT] */
1716 SZ_DOUBLE, /* [TDOUBLE] */
1717 SZ_IND, /* [TIND] */
1723 SZ_INT, /* [TENUM] */
1728 BCHAR|BUCHAR, /* [TCHAR] */
1729 BCHAR|BUCHAR, /* [TUCHAR] */
1730 BSHORT|BUSHORT, /* [TSHORT] */
1731 BSHORT|BUSHORT, /* [TUSHORT] */
1732 BINT|BUINT|BLONG|BULONG|BIND, /* [TINT] */
1733 BINT|BUINT|BLONG|BULONG|BIND, /* [TUINT] */
1734 BINT|BUINT|BLONG|BULONG|BIND, /* [TLONG] */
1735 BINT|BUINT|BLONG|BULONG|BIND, /* [TULONG] */
1736 BVLONG|BUVLONG, /* [TVLONG] */
1737 BVLONG|BUVLONG, /* [TUVLONG] */
1738 BFLOAT, /* [TFLOAT] */
1739 BDOUBLE, /* [TDOUBLE] */
1740 BLONG|BULONG|BIND, /* [TIND] */
1744 BSTRUCT, /* [TSTRUCT] */
1745 BUNION, /* [TUNION] */