Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

dagcheck.md (3914B)


      1 %{
      2 #include "c.h"
      3 typedef 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 %%
     44 stmt: INDIRB(P) ""
     45 stmt: INDIRF(P) ""
     46 stmt: INDIRI(P) ""
     47 stmt: INDIRU(P) ""
     48 stmt: INDIRP(P) ""
     49 stmt: CALLF(P) ""
     50 stmt: CALLI(P) ""
     51 stmt: CALLU(P) ""
     52 stmt: CALLP(P) ""
     53 stmt: V ""
     54 bogus: I "" 1
     55 bogus: U "" 1
     56 bogus: P "" 1
     57 bogus: F "" 1
     58 bogus: B "" 1
     59 bogus: V "" 1
     60 I: bogus "" 1
     61 U: bogus "" 1
     62 P: bogus "" 1
     63 F: bogus "" 1
     64 B: bogus "" 1
     65 V: bogus "" 1
     66 F: CNSTF ""
     67 I: CNSTI ""
     68 P: CNSTP ""
     69 U: CNSTU ""
     70 V: ARGB(B) ""
     71 V: ARGF(F) ""
     72 V: ARGI(I) ""
     73 V: ARGU(U) ""
     74 V: ARGP(P) ""
     75 V: ASGNB(P,B) ""
     76 V: ASGNF(P,F) ""
     77 V: ASGNI(P,I) ""
     78 V: ASGNU(P,U) ""
     79 V: ASGNP(P,P) ""
     80 B: INDIRB(P) ""
     81 F: INDIRF(P) ""
     82 I: INDIRI(P) ""
     83 U: INDIRU(P) ""
     84 P: INDIRP(P) ""
     85 I: CVII(I) ""
     86 I: CVUI(U) ""
     87 I: CVFI(F) ""
     88 U: CVIU(I) ""
     89 U: CVUU(U) ""
     90 U: CVPU(P) ""
     91 F: CVIF(I) ""
     92 F: CVFF(F) ""
     93 P: CVUP(U) ""
     94 P: CVPP(P) ""
     95 F: NEGF(F) ""
     96 I: NEGI(I) ""
     97 V: CALLB(P,P) ""
     98 F: CALLF(P) ""
     99 I: CALLI(P) ""
    100 U: CALLU(P) ""
    101 P: CALLP(P) ""
    102 V: CALLV(P) ""
    103 V: RETF(F) ""
    104 V: RETI(I) ""
    105 V: RETU(U) ""
    106 V: RETP(P) ""
    107 V: RETV ""
    108 P: ADDRGP ""
    109 P: ADDRFP ""
    110 P: ADDRLP ""
    111 F: ADDF(F,F) ""
    112 I: ADDI(I,I) ""
    113 P: ADDP(P,I) ""
    114 P: ADDP(I,P) ""
    115 P: ADDP(U,P) ""
    116 P: ADDP(P,U) ""
    117 U: ADDU(U,U) ""
    118 F: SUBF(F,F) ""
    119 I: SUBI(I,I) ""
    120 P: SUBP(P,I) ""
    121 P: SUBP(P,U) ""
    122 U: SUBU(U,U) ""
    123 I: LSHI(I,I) ""
    124 U: LSHU(U,I) ""
    125 I: MODI(I,I) ""
    126 U: MODU(U,U) ""
    127 I: RSHI(I,I) ""
    128 U: RSHU(U,I) ""
    129 U: BANDU(U,U) ""
    130 I: BANDI(I,I) ""
    131 U: BCOMU(U) ""
    132 I: BCOMI(I) ""
    133 I: BORI(I,I) ""
    134 U: BORU(U,U) ""
    135 U: BXORU(U,U) ""
    136 I: BXORI(I,I) ""
    137 F: DIVF(F,F) ""
    138 I: DIVI(I,I) ""
    139 U: DIVU(U,U) ""
    140 F: MULF(F,F) ""
    141 I: MULI(I,I) ""
    142 U: MULU(U,U) ""
    143 V: EQF(F,F) ""
    144 V: EQI(I,I) ""
    145 V: EQU(U,U) ""
    146 V: GEF(F,F) ""
    147 V: GEI(I,I) ""
    148 V: GEU(U,U) ""
    149 V: GTF(F,F) ""
    150 V: GTI(I,I) ""
    151 V: GTU(U,U) ""
    152 V: LEF(F,F) ""
    153 V: LEI(I,I) ""
    154 V: LEU(U,U) ""
    155 V: LTF(F,F) ""
    156 V: LTI(I,I) ""
    157 V: LTU(U,U) ""
    158 V: NEF(F,F) ""
    159 V: NEI(I,I) ""
    160 V: NEU(U,U) ""
    161 V: JUMPV(P) ""
    162 V: LABELV ""
    163 %%
    164 
    165 static 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 
    201 void 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 }