1%{
2#include "c.h"
3typedef Node NODEPTR_TYPE;
4#define OP_LABEL(p)     (specific((p)->op))
5#define LEFT_CHILD(p)   ((p)->kids[0])
6#define RIGHT_CHILD(p)  ((p)->kids[1])
7#define STATE_LABEL(p)  ((p)->x.state)
8#define PANIC	   error
9%}
10%term CNSTF=17 CNSTI=21 CNSTP=23 CNSTU=22
11%term ARGB=41 ARGF=33 ARGI=37 ARGP=39 ARGU=38
12%term ASGNB=57 ASGNF=49 ASGNI=53 ASGNP=55 ASGNU=54
13%term INDIRB=73 INDIRF=65 INDIRI=69 INDIRP=71 INDIRU=70
14%term CVFF=113 CVFI=117
15%term CVIF=129 CVII=133 CVIU=134
16%term CVPP=151 CVPU=150
17%term CVUI=181 CVUP=183 CVUU=182
18%term NEGF=193 NEGI=197
19%term CALLB=217 CALLF=209 CALLI=213 CALLP=215 CALLU=214 CALLV=216
20%term RETF=241 RETI=245 RETP=247 RETU=246 RETV=248
21%term ADDRGP=263
22%term ADDRFP=279
23%term ADDRLP=295
24%term ADDF=305 ADDI=309 ADDP=311 ADDU=310
25%term SUBF=321 SUBI=325 SUBP=327 SUBU=326
26%term LSHI=341 LSHU=342
27%term MODI=357 MODU=358
28%term RSHI=373 RSHU=374
29%term BANDI=389 BANDU=390
30%term BCOMI=405 BCOMU=406
31%term BORI=421 BORU=422
32%term BXORI=437 BXORU=438
33%term DIVF=449 DIVI=453 DIVU=454
34%term MULF=465 MULI=469 MULU=470
35%term EQF=481 EQI=485 EQU=486
36%term GEF=497 GEI=501 GEU=502
37%term GTF=513 GTI=517 GTU=518
38%term LEF=529 LEI=533 LEU=534
39%term LTF=545 LTI=549 LTU=550
40%term NEF=561 NEI=565 NEU=566
41%term JUMPV=584
42%term LABELV=600
43%%
44stmt: INDIRB(P) ""
45stmt: INDIRF(P) ""
46stmt: INDIRI(P) ""
47stmt: INDIRU(P) ""
48stmt: INDIRP(P) ""
49stmt: CALLF(P) ""
50stmt: CALLI(P) ""
51stmt: CALLU(P) ""
52stmt: CALLP(P) ""
53stmt: V ""
54bogus: I "" 1
55bogus: U "" 1
56bogus: P "" 1
57bogus: F "" 1
58bogus: B "" 1
59bogus: V "" 1
60I: bogus "" 1
61U: bogus "" 1
62P: bogus "" 1
63F: bogus "" 1
64B: bogus "" 1
65V: bogus "" 1
66F: CNSTF ""
67I: CNSTI ""
68P: CNSTP ""
69U: CNSTU ""
70V: ARGB(B) ""
71V: ARGF(F) ""
72V: ARGI(I) ""
73V: ARGU(U) ""
74V: ARGP(P) ""
75V: ASGNB(P,B) ""
76V: ASGNF(P,F) ""
77V: ASGNI(P,I) ""
78V: ASGNU(P,U) ""
79V: ASGNP(P,P) ""
80B: INDIRB(P) ""
81F: INDIRF(P) ""
82I: INDIRI(P) ""
83U: INDIRU(P) ""
84P: INDIRP(P) ""
85I: CVII(I) ""
86I: CVUI(U) ""
87I: CVFI(F) ""
88U: CVIU(I) ""
89U: CVUU(U) ""
90U: CVPU(P) ""
91F: CVIF(I) ""
92F: CVFF(F) ""
93P: CVUP(U) ""
94P: CVPP(P) ""
95F: NEGF(F) ""
96I: NEGI(I) ""
97V: CALLB(P,P) ""
98F: CALLF(P) ""
99I: CALLI(P) ""
100U: CALLU(P) ""
101P: CALLP(P) ""
102V: CALLV(P) ""
103V: RETF(F) ""
104V: RETI(I) ""
105V: RETU(U) ""
106V: RETP(P) ""
107V: RETV ""
108P: ADDRGP ""
109P: ADDRFP ""
110P: ADDRLP ""
111F: ADDF(F,F) ""
112I: ADDI(I,I) ""
113P: ADDP(P,I) ""
114P: ADDP(I,P) ""
115P: ADDP(U,P) ""
116P: ADDP(P,U) ""
117U: ADDU(U,U) ""
118F: SUBF(F,F) ""
119I: SUBI(I,I) ""
120P: SUBP(P,I) ""
121P: SUBP(P,U) ""
122U: SUBU(U,U) ""
123I: LSHI(I,I) ""
124U: LSHU(U,I) ""
125I: MODI(I,I) ""
126U: MODU(U,U) ""
127I: RSHI(I,I) ""
128U: RSHU(U,I) ""
129U: BANDU(U,U) ""
130I: BANDI(I,I) ""
131U: BCOMU(U) ""
132I: BCOMI(I) ""
133I: BORI(I,I) ""
134U: BORU(U,U) ""
135U: BXORU(U,U) ""
136I: BXORI(I,I) ""
137F: DIVF(F,F) ""
138I: DIVI(I,I) ""
139U: DIVU(U,U) ""
140F: MULF(F,F) ""
141I: MULI(I,I) ""
142U: MULU(U,U) ""
143V: EQF(F,F) ""
144V: EQI(I,I) ""
145V: EQU(U,U) ""
146V: GEF(F,F) ""
147V: GEI(I,I) ""
148V: GEU(U,U) ""
149V: GTF(F,F) ""
150V: GTI(I,I) ""
151V: GTU(U,U) ""
152V: LEF(F,F) ""
153V: LEI(I,I) ""
154V: LEU(U,U) ""
155V: LTF(F,F) ""
156V: LTI(I,I) ""
157V: LTU(U,U) ""
158V: NEF(F,F) ""
159V: NEI(I,I) ""
160V: NEU(U,U) ""
161V: JUMPV(P) ""
162V: LABELV ""
163%%
164
165static void reduce(NODEPTR_TYPE p, int goalnt) {
166	int i, sz = opsize(p->op), rulenumber = _rule(p->x.state, goalnt);
167	short *nts = _nts[rulenumber];
168	NODEPTR_TYPE kids[10];
169
170	assert(rulenumber);
171	_kids(p, rulenumber, kids);
172	for (i = 0; nts[i]; i++)
173		reduce(kids[i], nts[i]);
174	switch (optype(p->op)) {
175#define xx(ty) if (sz == ty->size) return
176	case I:
177	case U:
178		xx(chartype);
179		xx(shorttype);
180		xx(inttype);
181		xx(longtype);
182		xx(longlong);
183		break;
184	case F:
185		xx(floattype);
186		xx(doubletype);
187		xx(longdouble);
188		break;
189	case P:
190		xx(voidptype);
191		xx(funcptype);
192		break;
193	case V:
194	case B: if (sz == 0) return;
195#undef xx
196	}
197	printdag(p, 2);
198	assert(0);
199}
200
201void check(Node p) {
202	struct _state { short cost[1]; };
203
204	_label(p);
205	if (((struct _state *)p->x.state)->cost[1] > 0) {
206		printdag(p, 2);
207		assert(0);
208	}
209	reduce(p, 1);
210}
211