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