1
// Inferno utils/cc/sub.c
2
// http://code.google.com/p/inferno-os/source/browse/utils/cc/sub.c
4
// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
5
// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
6
// Portions Copyright © 1997-1999 Vita Nuova Limited
7
// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
8
// Portions Copyright © 2004,2006 Bruce Ellis
9
// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
10
// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
11
// Portions Copyright © 2009 The Go Authors. All rights reserved.
13
// Permission is hereby granted, free of charge, to any person obtaining a copy
14
// of this software and associated documentation files (the "Software"), to deal
15
// in the Software without restriction, including without limitation the rights
16
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
// copies of the Software, and to permit persons to whom the Software is
18
// furnished to do so, subject to the following conditions:
20
// The above copyright notice and this permission notice shall be included in
21
// all copies or substantial portions of the Software.
23
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
34
new(int t, Node *l, Node *r)
38
n = alloc(sizeof(*n));
43
n->lineno = l->lineno;
45
n->lineno = r->lineno;
53
new1(int o, Node *l, Node *r)
63
prtree(Node *n, char *s)
66
print(" == %s ==\n", s);
72
prtree1(Node *n, int d, int f)
84
prtree1(n->left, d, 0);
85
prtree1(n->right, d, 1);
95
print(" %d", n->xoffset);
100
print(" %d(R%d)", n->xoffset, n->reg);
106
print(" %d+R%d", n->xoffset, n->reg);
108
print(" R%d", n->reg);
113
print(" \"%s\"", n->cstring);
118
print(" \"%S\"", n->rstring);
128
if(typefd[n->type->etype])
129
print(" \"%.8e\"", n->fconst);
131
print(" \"%lld\"", n->vconst);
136
print(" <%d>", n->addable);
138
print(" %T", n->type);
140
print(" (%d)", n->complex);
141
print(" %L\n", n->lineno);
143
prtree1(n->left, d, 1);
145
prtree1(n->right, d, 1);
153
t = alloc(sizeof(*t));
158
t->width = ewidth[et];
177
garbt(Type *t, int32 b)
183
t1->garb = simpleg(b);
199
case BVOLATILE|BCONSTNT:
200
return GCONSTNT|GVOLATILE;
215
case BAUTO|BREGISTER:
219
case BEXTERN|BREGISTER:
228
diag(Z, "illegal combination of classes %Q", b);
236
b &= ~BCLASS & ~BGARB;
242
case BCHAR|BUNSIGNED:
243
return types[TUCHAR];
248
case BSHORT|BINT|BSIGNED:
249
return types[TSHORT];
251
case BUNSIGNED|BSHORT:
252
case BUNSIGNED|BSHORT|BINT:
253
return types[TUSHORT];
268
case BLONG|BINT|BSIGNED:
271
case BUNSIGNED|BLONG:
272
case BUNSIGNED|BLONG|BINT:
273
return types[TULONG];
276
case BVLONG|BLONG|BINT:
277
case BVLONG|BLONG|BSIGNED:
278
case BVLONG|BLONG|BINT|BSIGNED:
279
return types[TVLONG];
281
case BVLONG|BLONG|BUNSIGNED:
282
case BVLONG|BLONG|BINT|BUNSIGNED:
283
return types[TUVLONG];
286
return types[TFLOAT];
291
return types[TDOUBLE];
297
diag(Z, "illegal combination of types %Q", b);
302
stcompat(Node *n, Type *t1, Type *t2, int32 ttab[])
316
if(b == BSTRUCT || b == BUNION)
317
if(!sametype(t1, t2))
320
if(b == BIND && i == TIND)
321
if(!sametype(t1, t2))
329
tcompat(Node *n, Type *t1, Type *t2, int32 ttab[])
332
if(stcompat(n, t1, t2, ttab)) {
334
diag(n, "incompatible type: \"%T\" for op \"%O\"",
337
diag(n, "incompatible types: \"%T\" and \"%T\" for op \"%O\"",
345
makedot(Node *n, Type *t, int32 o)
350
n1 = new(OXXX, Z, Z);
356
n->addable = n1->left->addable;
359
n->addable = n->left->addable;
360
if(n->addable == 0) {
361
n1 = new1(OCONST, Z, Z);
363
n1->type = types[TLONG];
374
n1 = new1(OCONST, Z, Z);
377
t->width = types[TIND]->width;
380
n2 = new1(OADDR, n->left, Z);
383
n1 = new1(OADD, n1, n2);
392
dotsearch(Sym *s, Type *t, Node *n, int32 *off)
401
for(t1 = t; t1 != T; t1 = t1->down)
411
if(s->class == CTYPEDEF || s->class == CTYPESTR)
412
for(t1 = t; t1 != T; t1 = t1->down)
413
if(t1->sym == S && typesu[t1->etype])
414
if(sametype(s->type, t1)) {
425
* look it up in unnamed substructures
427
for(t1 = t; t1 != T; t1 = t1->down)
428
if(t1->sym == S && typesu[t1->etype]){
429
rt = dotsearch(s, t1->link, n, off);
440
diag(n, "ambiguous structure element: %s", s->name);
445
dotoffset(Type *st, Type *lt, Node *n)
453
* first try matching at the top level
454
* for matching tag names
458
for(t=lt->link; t!=T; t=t->down)
469
* second try matching at the top level
472
for(t=lt->link; t!=T; t=t->down)
474
if(sametype(st, t)) {
483
* last try matching sub-levels
485
for(t=lt->link; t!=T; t=t->down)
487
if(typesu[t->etype]) {
488
o1 = dotoffset(st, t, n);
498
diag(n, "ambiguous unnamed structure element");
503
* look into tree for floating point constant expressions
506
allfloat(Node *n, int flag)
510
if(n->type->etype != TDOUBLE)
515
n->type = types[TFLOAT];
517
case OADD: /* no need to get more exotic than this */
521
if(!allfloat(n->right, flag))
524
if(!allfloat(n->left, flag))
527
n->type = types[TFLOAT];
535
constas(Node *n, Type *il, Type *ir)
544
if(l->garb & GCONSTNT) {
545
warn(n, "assignment to a constant type (%T)", il);
551
if(l->etype != TIND || r->etype != TIND)
557
if(r->garb & GCONSTNT)
558
if(!(l->garb & GCONSTNT)) {
559
warn(n, "assignment of a constant pointer type (%T)", ir);
566
typeext1(Type *st, Node *l)
568
if(st->etype == TFLOAT && allfloat(l, 0))
573
typeext(Type *st, Node *l)
582
if(st->etype == TIND && vconst(l) == 0) {
591
* if assign of struct containing unnamed sub-struct
592
* to type of sub-struct, insert the DOT.
593
* if assign of *struct containing unnamed substruct
594
* to type of *sub-struct, insert the add-offset
596
if(typesu[st->etype] && typesu[lt->etype]) {
597
o = dotoffset(st, lt, l);
599
n1 = new1(OXXX, Z, Z);
608
if(st->etype == TIND && typesu[st->link->etype])
609
if(lt->etype == TIND && typesu[lt->link->etype]) {
610
o = dotoffset(st->link, lt->link, l);
615
n1 = new1(OXXX, Z, Z);
617
n2 = new1(OCONST, Z, Z);
629
* a cast that generates no code
633
nocast(Type *t1, Type *t2)
652
* a cast that has a noop semantic
653
* (small to large, convert)
656
nilcast(Type *t1, Type *t2)
670
if(typefd[et1] && typefd[et2]) {
671
if(ewidth[et1] < ewidth[et2])
675
if(typechlp[et1] && typechlp[et2]) {
676
if(ewidth[et1] < ewidth[et2])
684
* "the usual arithmetic conversions are performed"
687
arith(Node *n, int f)
713
/* convert up to at least int */
720
if(i == TIND && j == TIND) {
721
w = n->right->type->link->width;
722
if(w < 1 || n->left->type->link == T || n->left->type->link->width < 1)
724
n->type = types[ewidth[TIND] <= ewidth[TLONG]? TLONG: TVLONG];
725
if(0 && ewidth[TIND] > ewidth[TLONG]){
726
n1 = new1(OXXX, Z, Z);
731
n->type = types[TLONG];
734
n1 = new1(OXXX, Z, Z);
738
n1 = new1(OCONST, Z, Z);
750
if(!sametype(n->type, n->left->type)) {
751
n->left = new1(OCAST, n->left, Z);
752
n->left->type = n->type;
753
if(n->type->etype == TIND) {
754
w = n->type->link->width;
757
w = n->type->link->width;
762
n1 = new1(OCONST, Z, Z);
765
n->left = new1(OMUL, n->left, n1);
766
n->left->type = n->type;
771
if(!sametype(n->type, n->right->type)) {
772
n->right = new1(OCAST, n->right, Z);
773
n->right->type = n->type;
774
if(n->type->etype == TIND) {
775
w = n->type->link->width;
778
w = n->type->link->width;
783
n1 = new1(OCONST, Z, Z);
786
n->right = new1(OMUL, n->right, n1);
787
n->right->type = n->type;
793
diag(n, "pointer addition not fully declared: %T", n->type->link);
797
* try to rewrite shift & mask
800
simplifyshift(Node *n)
803
int o, s1, s2, c1, c2;
805
if(!typechlp[n->type->etype])
820
if(n->right->op != OCONST)
822
if(n->left->op != OAND)
824
if(n->left->right->op != OCONST)
826
switch(n->left->left->op) {
839
if(n->left->left->right->op != OCONST)
842
c1 = n->right->vconst;
843
c2 = n->left->left->right->vconst;
844
c3 = n->left->right->vconst;
848
print("%.3o %d %d %d #%.ux\n",
849
(s1<<3)|s2, c1, c2, topbit(c3), c3);
854
case 000: /* (((e <<u c2) & c3) <<u c1) */
861
case 002: /* (((e >>s c2) & c3) <<u c1) */
862
if(topbit(c3) >= (32-c2))
864
case 001: /* (((e >>u c2) & c3) <<u c1) */
878
case 022: /* (((e >>s c2) & c3) >>s c1) */
881
case 012: /* (((e >>s c2) & c3) >>u c1) */
882
if(topbit(c3) >= (32-c2))
885
case 021: /* (((e >>u c2) & c3) >>s c1) */
886
if(topbit(c3) >= 31 && c2 <= 0)
889
case 011: /* (((e >>u c2) & c3) >>u c1) */
898
case 020: /* (((e <<u c2) & c3) >>s c1) */
901
case 010: /* (((e <<u c2) & c3) >>u c1) */
915
rewrite0: /* get rid of both shifts */
916
if(debug['<'])prtree(n, "rewrite0");
918
n->left = n->left->left;
919
n->right->vconst = c3;
921
rewrite1: /* get rid of lower shift */
922
if(debug['<'])prtree(n, "rewrite1");
923
n->left->left = n->left->left->left;
924
n->left->right->vconst = c3;
925
n->right->vconst = c1;
928
rewrite2: /* get rid of upper shift */
929
if(debug['<'])prtree(n, "rewrite2");
931
n->right->vconst = c3;
932
n->left->right->vconst = c1;
1006
switch(n->type->etype)
1011
if(n->fconst > i || n->fconst < -i)
1040
return -159; /* first uninteresting constant */
1044
* return log(n) if n is a power of 2 constant
1053
m = MASK(8*sizeof(uvlong));
1054
for(i=32; i; i>>=1) {
1071
if(typefd[n->type->etype])
1074
return xlog2(n->vconst);
1091
* try to cast a constant down
1092
* rather than cast a variable up
1097
relcon(Node *l, Node *r)
1105
if(!nilcast(r->left->type, r->type))
1107
switch(r->type->etype) {
1114
v = convvtox(l->vconst, r->type->etype);
1119
l->type = r->left->type;
1129
diag(Z, "bad in relindex: %O", o);
1148
if(n == Z || n->op != OLIST)
1151
for(n = n->left; n != Z; n = n->left) {
1170
diag(Z, "bad in bitno");
1175
typebitor(int32 a, int32 b)
1181
if((a & b) == BLONG)
1182
c |= BVLONG; /* long long => vlong */
1184
warn(Z, "once is enough: %Q", a & b);
1189
diag(Node *n, char *fmt, ...)
1195
vseprint(buf, buf+sizeof(buf), fmt, arg);
1197
Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1205
prtree(n, "diagnostic");
1209
Bprint(&diagbuf, "too many errors\n");
1215
warn(Node *n, char *fmt, ...)
1221
Bprint(&diagbuf, "warning: ");
1223
vseprint(buf, buf+sizeof(buf), fmt, arg);
1225
Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1229
prtree(n, "warning");
1234
yyerror(char *fmt, ...)
1240
* hack to intercept message from yaccpar
1242
if(strcmp(fmt, "syntax error") == 0) {
1243
yyerror("syntax error, last name: %s", symb);
1247
vseprint(buf, buf+sizeof(buf), fmt, arg);
1249
Bprint(&diagbuf, "%L %s\n", lineno, buf);
1252
Bprint(&diagbuf, "too many errors\n");
1258
fatal(Node *n, char *fmt, ...)
1264
vseprint(buf, buf+sizeof(buf), fmt, arg);
1266
Bprint(&diagbuf, "%L %s\n", (n==Z)? nearln: n->lineno, buf);
1274
prtree(n, "diagnostic");
1280
uint32 thash1 = 0x2edab8c9;
1281
uint32 thash2 = 0x1dc74fb8;
1282
uint32 thash3 = 0x1f241331;
1283
uint32 thash[NALLTYPES];
1286
TXXX, 0x17527bbd, 0,
1287
TCHAR, 0x5cedd32b, 0,
1288
TUCHAR, 0x552c4454, 0,
1289
TSHORT, 0x63040b4b, 0,
1290
TUSHORT, 0x32a45878, 0,
1291
TINT, 0x4151d5bd, 0,
1292
TUINT, 0x5ae707d6, 0,
1293
TLONG, 0x5ef20f47, 0,
1294
TULONG, 0x36d8eb8f, 0,
1295
TVLONG, 0x6e5e9590, 0,
1296
TUVLONG, 0x75910105, 0,
1297
TFLOAT, 0x25fd7af1, 0,
1298
TDOUBLE, 0x7c40a1b2, 0,
1299
TIND, 0x1b832357, 0,
1300
TFUNC, 0x6babc9cb, 0,
1301
TARRAY, 0x7c50986d, 0,
1302
TVOID, 0x44112eff, 0,
1303
TSTRUCT, 0x7c2da3bf, 0,
1304
TUNION, 0x3eb25e98, 0,
1305
TENUM, 0x44b54f61, 0,
1306
TFILE, 0x19242ac3, 0,
1307
TOLD, 0x22b15988, 0,
1308
TDOT, 0x0204f6b3, 0,
1312
char* bnames[NALIGN];
1326
char* tnames[NALLTYPES];
1333
TUSHORT, 0, "USHORT",
1339
TUVLONG, 0, "UVLONG",
1341
TDOUBLE, 0, "DOUBLE",
1346
TSTRUCT, 0, "STRUCT",
1355
char* gnames[NGTYPES];
1359
GCONSTNT, 0, "CONST",
1360
GVOLATILE, 0, "VOLATILE",
1361
GVOLATILE|GCONSTNT, 0, "CONST-VOLATILE",
1365
char* qnames[NALLTYPES];
1372
TUSHORT, 0, "USHORT",
1378
TUVLONG, 0, "UVLONG",
1380
TDOUBLE, 0, "DOUBLE",
1385
TSTRUCT, 0, "STRUCT",
1390
TEXTERN, 0, "EXTERN",
1391
TSTATIC, 0, "STATIC",
1392
TTYPEDEF, 0, "TYPEDEF",
1393
TTYPESTR, 0, "TYPESTR",
1394
TREGISTER, 0, "REGISTER",
1395
TCONSTNT, 0, "CONSTNT",
1396
TVOLATILE, 0, "VOLATILE",
1397
TUNSIGNED, 0, "UNSIGNED",
1398
TSIGNED, 0, "SIGNED",
1404
char* cnames[NCTYPES];
1409
CEXTERN, 0, "EXTERN",
1411
CSTATIC, 0, "STATIC",
1413
CTYPEDEF, 0, "TYPEDEF",
1414
CTYPESTR, 0, "TYPESTR",
1422
char* onames[OEND+1];
1429
OANDAND, 0, "ANDAND",
1435
OASASHL, 0, "ASASHL",
1436
OASASHR, 0, "ASASHR",
1440
OASLDIV, 0, "ASLDIV",
1441
OASLMOD, 0, "ASLMOD",
1442
OASLMUL, 0, "ASLMUL",
1443
OASLSHR, 0, "ASLSHR",
1456
OCONTINUE, 0, "CONTINUE",
1459
ODOTDOT, 0, "DOTDOT",
1460
ODWHILE, 0, "DWHILE",
1473
OINDREG, 0, "INDREG",
1492
OPOSTDEC, 0, "POSTDEC",
1493
OPOSTINC, 0, "POSTINC",
1494
OPREDEC, 0, "PREDEC",
1495
OPREINC, 0, "PREINC",
1497
OREGISTER, 0, "REGISTER",
1498
ORETURN, 0, "RETURN",
1502
OSTRING, 0, "STRING",
1503
OLSTRING, 0, "LSTRING",
1504
OSTRUCT, 0, "STRUCT",
1506
OSWITCH, 0, "SWITCH",
1518
OREGPAIR, 0, "REGPAIR",
1523
/* OEQ, ONE, OLE, OLS, OLT, OLO, OGE, OHS, OGT, OHI */
1526
ONE, OEQ, OGT, OHI, OGE, OHS, OLT, OLO, OLE, OLS,
1530
OEQ, ONE, OGE, OHS, OGT, OHI, OLE, OLS, OLT, OLO,
1534
OEQ, ONE, OLS, OLS, OLO, OLO, OHS, OHS, OHI, OHI,
1540
TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, -1,
1545
TUCHAR, TUSHORT, TUINT, TULONG, TUVLONG, TIND, -1,
1548
uchar typesuv[NTYPE];
1551
TVLONG, TUVLONG, TSTRUCT, TUNION, -1,
1554
uchar typeilp[NTYPE];
1557
TINT, TUINT, TLONG, TULONG, TIND, -1
1560
uchar typechl[NTYPE];
1561
uchar typechlv[NTYPE];
1562
uchar typechlvp[NTYPE];
1565
TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, -1,
1568
uchar typechlp[NTYPE];
1569
int typechlpinit[] =
1571
TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TIND, -1,
1574
uchar typechlpfd[NTYPE];
1575
int typechlpfdinit[] =
1577
TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TFLOAT, TDOUBLE, TIND, -1,
1589
TSHORT, TUSHORT, -1,
1592
uchar typeil[NTYPE];
1595
TINT, TUINT, TLONG, TULONG, -1,
1601
TVLONG, TUVLONG, -1,
1604
uchar typefd[NTYPE];
1607
TFLOAT, TDOUBLE, -1,
1610
uchar typeaf[NTYPE];
1616
uchar typesu[NTYPE];
1619
TSTRUCT, TUNION, -1,
1622
int32 tasign[NTYPE];
1628
TUSHORT, BNUMBER, 0,
1634
TUVLONG, BNUMBER, 0,
1636
TDOUBLE, BNUMBER, 0,
1638
TSTRUCT, BSTRUCT, 0,
1643
int32 tasadd[NTYPE];
1649
TUSHORT, BNUMBER, 0,
1655
TUVLONG, BNUMBER, 0,
1657
TDOUBLE, BNUMBER, 0,
1665
TCHAR, BNUMBER|BIND|BVOID, 0,
1666
TUCHAR, BNUMBER|BIND|BVOID, 0,
1667
TSHORT, BNUMBER|BIND|BVOID, 0,
1668
TUSHORT, BNUMBER|BIND|BVOID, 0,
1669
TINT, BNUMBER|BIND|BVOID, 0,
1670
TUINT, BNUMBER|BIND|BVOID, 0,
1671
TLONG, BNUMBER|BIND|BVOID, 0,
1672
TULONG, BNUMBER|BIND|BVOID, 0,
1673
TVLONG, BNUMBER|BIND|BVOID, 0,
1674
TUVLONG, BNUMBER|BIND|BVOID, 0,
1675
TFLOAT, BNUMBER|BVOID, 0,
1676
TDOUBLE, BNUMBER|BVOID, 0,
1677
TIND, BINTEGER|BIND|BVOID, 0,
1679
TSTRUCT, BSTRUCT|BVOID, 0,
1680
TUNION, BUNION|BVOID, 0,
1687
TCHAR, BNUMBER|BIND, 0,
1688
TUCHAR, BNUMBER|BIND, 0,
1689
TSHORT, BNUMBER|BIND, 0,
1690
TUSHORT, BNUMBER|BIND, 0,
1691
TINT, BNUMBER|BIND, 0,
1692
TUINT, BNUMBER|BIND, 0,
1693
TLONG, BNUMBER|BIND, 0,
1694
TULONG, BNUMBER|BIND, 0,
1695
TVLONG, BNUMBER|BIND, 0,
1696
TUVLONG, BNUMBER|BIND, 0,
1698
TDOUBLE, BNUMBER, 0,
1709
TUSHORT, BNUMBER, 0,
1715
TUVLONG, BNUMBER, 0,
1717
TDOUBLE, BNUMBER, 0,
1718
TIND, BINTEGER|BIND, 0,
1728
TUSHORT, BNUMBER, 0,
1734
TUVLONG, BNUMBER, 0,
1736
TDOUBLE, BNUMBER, 0,
1744
TUCHAR, BINTEGER, 0,
1745
TSHORT, BINTEGER, 0,
1746
TUSHORT, BINTEGER, 0,
1750
TULONG, BINTEGER, 0,
1751
TVLONG, BINTEGER, 0,
1752
TUVLONG, BINTEGER, 0,
1762
TUSHORT, BNUMBER, 0,
1768
TUVLONG, BNUMBER, 0,
1770
TDOUBLE, BNUMBER, 0,
1797
BNUMBER|BIND|BSTRUCT|BUNION,
1800
uchar tab[NTYPE][NTYPE] =
1805
/*TCHAR*/ { 0, TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG,
1806
TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1808
/*TUCHAR*/ { 0, TUCHAR, TUCHAR, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
1809
TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1811
/*TSHORT*/ { 0, TSHORT, TUSHORT, TSHORT, TUSHORT, TINT, TUINT, TLONG,
1812
TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1814
/*TUSHORT*/ { 0, TUSHORT, TUSHORT, TUSHORT, TUSHORT, TUINT, TUINT, TULONG,
1815
TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1817
/*TINT*/ { 0, TINT, TUINT, TINT, TUINT, TINT, TUINT, TLONG,
1818
TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1820
/*TUINT*/ { 0, TUINT, TUINT, TUINT, TUINT, TUINT, TUINT, TULONG,
1821
TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1823
/*TLONG*/ { 0, TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TLONG,
1824
TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1826
/*TULONG*/ { 0, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG,
1827
TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1829
/*TVLONG*/ { 0, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG,
1830
TUVLONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1832
/*TUVLONG*/ { 0, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG,
1833
TUVLONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND,
1835
/*TFLOAT*/ { 0, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT,
1836
TFLOAT, TFLOAT, TFLOAT, TFLOAT, TDOUBLE, TIND,
1838
/*TDOUBLE*/ { 0, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE,
1839
TDOUBLE, TDOUBLE, TDOUBLE, TFLOAT, TDOUBLE, TIND,
1841
/*TIND*/ { 0, TIND, TIND, TIND, TIND, TIND, TIND, TIND,
1842
TIND, TIND, TIND, TIND, TIND, TIND,
1847
urk(char *name, int max, int i)
1850
fprint(2, "bad tinit: %s %d>=%d\n", name, i, max);
1861
for(p=thashinit; p->code >= 0; p++) {
1862
urk("thash", nelem(thash), p->code);
1863
thash[p->code] = p->value;
1865
for(p=bnamesinit; p->code >= 0; p++) {
1866
urk("bnames", nelem(bnames), p->code);
1867
bnames[p->code] = p->s;
1869
for(p=tnamesinit; p->code >= 0; p++) {
1870
urk("tnames", nelem(tnames), p->code);
1871
tnames[p->code] = p->s;
1873
for(p=gnamesinit; p->code >= 0; p++) {
1874
urk("gnames", nelem(gnames), p->code);
1875
gnames[p->code] = p->s;
1877
for(p=qnamesinit; p->code >= 0; p++) {
1878
urk("qnames", nelem(qnames), p->code);
1879
qnames[p->code] = p->s;
1881
for(p=cnamesinit; p->code >= 0; p++) {
1882
urk("cnames", nelem(cnames), p->code);
1883
cnames[p->code] = p->s;
1885
for(p=onamesinit; p->code >= 0; p++) {
1886
urk("onames", nelem(onames), p->code);
1887
onames[p->code] = p->s;
1889
for(ip=typeiinit; *ip>=0; ip++) {
1890
urk("typei", nelem(typei), *ip);
1893
for(ip=typeuinit; *ip>=0; ip++) {
1894
urk("typeu", nelem(typeu), *ip);
1897
for(ip=typesuvinit; *ip>=0; ip++) {
1898
urk("typesuv", nelem(typesuv), *ip);
1901
for(ip=typeilpinit; *ip>=0; ip++) {
1902
urk("typeilp", nelem(typeilp), *ip);
1905
for(ip=typechlinit; *ip>=0; ip++) {
1906
urk("typechl", nelem(typechl), *ip);
1911
for(ip=typechlpinit; *ip>=0; ip++) {
1912
urk("typechlp", nelem(typechlp), *ip);
1916
for(ip=typechlpfdinit; *ip>=0; ip++) {
1917
urk("typechlpfd", nelem(typechlpfd), *ip);
1918
typechlpfd[*ip] = 1;
1920
for(ip=typecinit; *ip>=0; ip++) {
1921
urk("typec", nelem(typec), *ip);
1924
for(ip=typehinit; *ip>=0; ip++) {
1925
urk("typeh", nelem(typeh), *ip);
1928
for(ip=typeilinit; *ip>=0; ip++) {
1929
urk("typeil", nelem(typeil), *ip);
1932
for(ip=typevinit; *ip>=0; ip++) {
1933
urk("typev", nelem(typev), *ip);
1938
for(ip=typefdinit; *ip>=0; ip++) {
1939
urk("typefd", nelem(typefd), *ip);
1942
for(ip=typeafinit; *ip>=0; ip++) {
1943
urk("typeaf", nelem(typeaf), *ip);
1946
for(ip=typesuinit; *ip >= 0; ip++) {
1947
urk("typesu", nelem(typesu), *ip);
1950
for(p=tasigninit; p->code >= 0; p++) {
1951
urk("tasign", nelem(tasign), p->code);
1952
tasign[p->code] = p->value;
1954
for(p=tasaddinit; p->code >= 0; p++) {
1955
urk("tasadd", nelem(tasadd), p->code);
1956
tasadd[p->code] = p->value;
1958
for(p=tcastinit; p->code >= 0; p++) {
1959
urk("tcast", nelem(tcast), p->code);
1960
tcast[p->code] = p->value;
1962
for(p=taddinit; p->code >= 0; p++) {
1963
urk("tadd", nelem(tadd), p->code);
1964
tadd[p->code] = p->value;
1966
for(p=tsubinit; p->code >= 0; p++) {
1967
urk("tsub", nelem(tsub), p->code);
1968
tsub[p->code] = p->value;
1970
for(p=tmulinit; p->code >= 0; p++) {
1971
urk("tmul", nelem(tmul), p->code);
1972
tmul[p->code] = p->value;
1974
for(p=tandinit; p->code >= 0; p++) {
1975
urk("tand", nelem(tand), p->code);
1976
tand[p->code] = p->value;
1978
for(p=trelinit; p->code >= 0; p++) {
1979
urk("trel", nelem(trel), p->code);
1980
trel[p->code] = p->value;
1983
/* 32-bit defaults */
1984
typeword = typechlp;
1985
typecmplx = typesuv;
1989
* return 1 if it is impossible to jump into the middle of n.
1992
deadhead(Node *n, int caseok)
1999
if(!deadhead(n->left, caseok))
2020
return deadhead(n->right, 1);
2036
return deadhead(n->right->left, caseok) && deadhead(n->right->right, caseok);
2048
return deadhead(c->left, 0) && deadhead(c->right, 0);
2052
mixedasop(Type *l, Type *r)
2054
return !typefd[l->etype] && typefd[r->etype];