|
|
1.1 ! root 1: /* ../common/cgen.c */ ! 2: extern struct _iobuf { ! 3: int _cnt; ! 4: unsigned char *_ptr; ! 5: unsigned char *_base; ! 6: short _flag; ! 7: char _file; ! 8: } _iob[20]; ! 9: struct _iobuf *fopen(); ! 10: struct _iobuf *fdopen(); ! 11: struct _iobuf *freopen(); ! 12: long ftell(); ! 13: char *fgets(); ! 14: char *hash(); ! 15: char *savestr(); ! 16: char *tstr(); ! 17: extern int tstrused; ! 18: extern char *tstrbuf[]; ! 19: extern char **curtstr; ! 20: extern int nerrors; ! 21: typedef union ndu NODE; ! 22: typedef unsigned int TWORD; ! 23: typedef long CONSZ; ! 24: extern int dope[]; ! 25: extern char *opst[]; ! 26: ! 27: union ndu { ! 28: struct { ! 29: int op; ! 30: int goal; ! 31: TWORD type; ! 32: int cst[(6+4)]; ! 33: char * name; ! 34: char pad[8 -sizeof(char *)]; ! 35: NODE *left; ! 36: NODE *right; ! 37: }in; ! 38: ! 39: struct { ! 40: int op; ! 41: int goal; ! 42: TWORD type; ! 43: int cst[(6+4)]; ! 44: char * name; ! 45: char pad[8 -sizeof(char *)]; ! 46: CONSZ lval; ! 47: int rval; ! 48: }tn; ! 49: ! 50: struct { ! 51: int op; ! 52: int goal; ! 53: TWORD type; ! 54: int cst[(6+4)]; ! 55: int label; ! 56: int lop; ! 57: }bn; ! 58: struct { ! 59: int op; ! 60: int goal; ! 61: TWORD type; ! 62: int cst[(6+4)]; ! 63: int stsize; ! 64: short stalign; ! 65: short argsize; ! 66: }stn; ! 67: struct { ! 68: int op; ! 69: int goal; ! 70: TWORD type; ! 71: int cdim; ! 72: int csiz; ! 73: }fn; ! 74: ! 75: struct { ! 76: ! 77: int op; ! 78: int goal; ! 79: TWORD type; ! 80: int cdim; ! 81: int csiz; ! 82: double dval; ! 83: }fpn; ! 84: }; ! 85: ! 86: ! 87: ! 88: ! 89: ! 90: ! 91: ! 92: ! 93: extern int busy[]; ! 94: extern NODE node[]; ! 95: typedef struct shape SHAPE; ! 96: ! 97: extern struct shape { ! 98: int op; ! 99: SHAPE *sl; ! 100: SHAPE *sr; ! 101: int sh; ! 102: int sc; ! 103: } shapes[]; ! 104: extern SHAPE *pshape[]; ! 105: typedef struct optab OPTAB; ! 106: struct optab { ! 107: int op; ! 108: int tyop; ! 109: OPTAB *nextop; ! 110: SHAPE **lshape; ! 111: int ltype; ! 112: SHAPE **rshape; ! 113: int rtype; ! 114: int needs; ! 115: int rewrite; ! 116: char *cstring; ! 117: int cost; ! 118: int lcount; ! 119: int rcount; ! 120: int stinline; ! 121: }; ! 122: extern OPTAB ! 123: *match(), ! 124: *ophead[], ! 125: table[]; ! 126: extern NODE resc[]; ! 127: extern int tmpoff; ! 128: extern int maxboff; ! 129: extern int maxtemp; ! 130: extern int maxarg; ! 131: extern int ftnno; ! 132: extern int sideff; ! 133: extern NODE ! 134: *talloc(), ! 135: *ind2type(), ! 136: *tcopy(), ! 137: *getadr(), ! 138: *getlr(); ! 139: extern CONSZ rdin(); ! 140: extern char *rnames[]; ! 141: extern int lineno; ! 142: extern char ftitle[]; ! 143: extern int fldshf, fldsz; ! 144: extern int lflag, udebug, e2debug, odebug, rdebug, radebug, sdebug; ! 145: extern int fast; ! 146: ! 147: ! 148: ! 149: ! 150: typedef struct inst INST; ! 151: struct inst { ! 152: NODE *p; ! 153: OPTAB *q; ! 154: int goal; ! 155: }; ! 156: extern INST inst[300]; ! 157: extern nins; ! 158: ! 159: ! 160: typedef SHAPE *SHTABLE[2][20]; ! 161: extern SHTABLE sha; ! 162: rewcom( p, goal ) ! 163: NODE *p; ! 164: { ! 165: ! 166: ! 167: ! 168: int o, ty, g1, g2; ! 169: NODE *l, *r, *ql, *qr; ! 170: o = p->tn.op; ! 171: g1 = g2 = 6; ! 172: p->tn.goal = goal; ! 173: ! 174: switch( o ) ! 175: { ! 176: case 97: ! 177: cerror( "rewcom(%d) is FREE", p-node ); ! 178: case 110: ! 179: g1 = (6+3); ! 180: break; ! 181: case 59: ! 182: g1 = (6+1); ! 183: g2 = goal; ! 184: break; ! 185: case 22: ! 186: case 112: ! 187: case 56: ! 188: case 108: ! 189: g1 = g2 = goal; ! 190: break; ! 191: case 70: ! 192: case 100: ! 193: case 73: ! 194: g2 = (6+1); ! 195: break; ! 196: } ! 197: switch( ty = (dope[o]&016) ) ! 198: { ! 199: case 010: ! 200: rewcom( r = p->in.right, g2 ); ! 201: case 04: ! 202: rewcom( l = p->in.left, g1 ); ! 203: break; ! 204: case 02: ! 205: return; ! 206: } ! 207: if( o==59 || o==22 || o==108 ) return; ! 208: ! 209: ! 210: ! 211: ! 212: if( l->tn.op == 59 && l->in.left->tn.op != 110 ) ! 213: { ! 214: ! 215: ! 216: ! 217: ql = l->in.left; ! 218: qr = l->in.right; ! 219: *l = *p; ! 220: l->in.left = qr; ! 221: p->in.right = l; ! 222: p->in.left = ql; ! 223: p->tn.op = 59; ! 224: rewcom( p, p->tn.goal ); ! 225: } ! 226: if( ty == 04 ) return; ! 227: if( r->tn.op == 59 && r->in.right->tn.op != 110 ) ! 228: { ! 229: ! 230: ! 231: ! 232: ql = r->in.left; ! 233: qr = r->in.right; ! 234: *r = *p; ! 235: p->tn.op = 59; ! 236: p->in.left = ql; ! 237: r->in.right = qr; ! 238: rewcom( p, p->tn.goal ); ! 239: } ! 240: } ! 241: rewlhs(p) ! 242: NODE *p; ! 243: { ! 244: ! 245: ! 246: NODE *q, *t; ! 247: q = talloc(); ! 248: *q = *p; ! 249: t = tcopy( p->in.left, 0 ); ! 250: p->in.left = q; ! 251: p->in.right = t; ! 252: p->tn.op = 59; ! 253: return; ! 254: } ! 255: rewsto(p) ! 256: NODE *p; ! 257: { ! 258: ! 259: ! 260: int o, ao; ! 261: NODE *t, *q; ! 262: ! 263: while( (o=p->tn.op) == 59 ) p = p->in.right; ! 264: if( o == 95 ) return(0); ! 265: if( o == 99 ) ! 266: { ! 267: ! 268: t = talloc(); ! 269: *t = *p->in.left; ! 270: q = talloc(); ! 271: *q = *t; ! 272: t->tn.op = 95; ! 273: t->tn.lval = freetemp(argsize(p)/32 ); ! 274: t->tn.lval = ((t->tn.lval)/8); ! 275: t->tn.name = (char *) 0; ! 276: t->tn.type = 02000 ; ! 277: q->tn.op = 2+ 14; ! 278: q->in.left = t; ! 279: ! 280: t = talloc(); ! 281: *t = *p; ! 282: t->in.left = q; ! 283: t->in.right = p->in.left; ! 284: t->tn.op = 98; ! 285: ! 286: p->in.left = talloc(); ! 287: p->in.left->tn.op = 59; ! 288: p->in.left->in.left = t; ! 289: p->in.left->in.right = t = talloc(); ! 290: *t = *q; ! 291: t->in.left = talloc(); ! 292: *t->in.left = *q->in.left; ! 293: ! 294: ! 295: if( odebug>1 ) e2print( p ); ! 296: return( 1 ); ! 297: } ! 298: if( odebug>1 ) ! 299: { ! 300: e2print( p ); ! 301: printf( "\nrewritten by rewsto as:\n" ); ! 302: } ! 303: if( (dope[o]&01) && o!=78 && o!=79 && lhsok( p->in.left ) ) { ! 304: ! 305: rewlhs( p ); ! 306: return( 1 ); ! 307: } ! 308: ao = 1+ o; ! 309: if( (dope[ao]&020000) ) ! 310: { ! 311: if( p->in.left->tn.op == 95 ) ! 312: { ! 313: p->tn.op = ao; ! 314: rewlhs( p ); ! 315: if( odebug>1 ) e2print( p ); ! 316: return( 1 ); ! 317: } ! 318: } ! 319: ! 320: ! 321: t = talloc(); ! 322: *t = *p; ! 323: q = talloc(); ! 324: *q = *p; ! 325: t->tn.op = 95; ! 326: t->tn.lval = freetemp(argsize(p)/32 ); ! 327: t->tn.lval = ((t->tn.lval)/8); ! 328: t->tn.name = (char *) 0; ! 329: q->tn.op = 58; ! 330: q->in.left = t; ! 331: q->in.right = talloc(); ! 332: *(q->in.right) = *p; ! 333: ! 334: p->in.right = talloc(); ! 335: *(p->in.right) = *t; ! 336: p->tn.op = 59; ! 337: p->in.left = q; ! 338: ! 339: if( odebug>1 ) e2print( p ); ! 340: return( 1 ); ! 341: } ! 342: iseff( p ) ! 343: NODE *p; ! 344: { ! 345: ! 346: int o; ! 347: o = p->tn.op; ! 348: if( (dope[o]&02000) || (dope[o]&01) ) return( 1 ); ! 349: switch( (dope[ o ]&016) ) ! 350: { ! 351: case 010: ! 352: if( iseff( p->in.right ) ) return( 1 ); ! 353: case 04: ! 354: return( iseff( p->in.left ) ); ! 355: } ! 356: return( 0 ); ! 357: } ! 358: NODE * ! 359: lhsto( p ) ! 360: NODE *p; ! 361: { ! 362: ! 363: ! 364: NODE *q; ! 365: int o; ! 366: for( q = p->in.left; (o=q->tn.op)!=(2+ 11); q=q->in.left ) ! 367: { ! 368: if( (dope[o]&016) == 02 ) return( (NODE *)0); ! 369: } ! 370: ! 371: q = q->in.left; ! 372: o = q->tn.op; ! 373: if( (dope[o]&016) == 02 ) return( (NODE *)0 ); ! 374: else return( q ); ! 375: } ! 376: static int ! 377: c2bigger( p ) NODE *p; { ! 378: ! 379: register TWORD t, tl; ! 380: t = p->tn.type; ! 381: tl = p->in.left->tn.type; ! 382: if( (t|tl)& 04000 ) return( 0 ); ! 383: if( t&040 ) return( 1 ); ! 384: if( tl&040 ) return( 0 ); ! 385: if( t& 020 ) return( 1 ); ! 386: if( tl& 020 ) return( 0 ); ! 387: if( t&( 010| 01000) ) return( 1 ); ! 388: if( tl&( 010| 01000) ) return( 0 ); ! 389: if( t&( ( 04| 010)|(0400| 01000)) ) return( 1 ); ! 390: if( tl&( ( 04| 010)|(0400| 01000)) ) return( 0 ); ! 391: if( t &( 02|0200) ) return( 1 ); ! 392: return( 0 ); ! 393: } ! 394: NODE * ! 395: ind2type( p ) ! 396: register NODE *p; ! 397: { ! 398: ! 399: register TWORD t; ! 400: NODE *q; ! 401: t = p->tn.type; ! 402: if( t == 01 || t == 02 ) t = ( 04| 010); ! 403: else if( t == 0100 || t == 0200 ) t = (0400| 01000); ! 404: else if( t == 020 ) t = 040; ! 405: else return( p ); ! 406: if( p->tn.op == 104 && c2bigger(p) ) ! 407: { ! 408: p->tn.type = t; ! 409: return( p ); ! 410: } ! 411: q = talloc(); ! 412: q->tn.op = 104; ! 413: q->in.left = p; ! 414: q->in.right = 0; ! 415: q->tn.name = (char *) 0; ! 416: q->tn.type = t; ! 417: q->tn.goal = 6; ! 418: return( q ); ! 419: } ! 420: NODE * ! 421: reweop( p ) ! 422: register NODE *p; ! 423: { ! 424: ! 425: ! 426: ! 427: ! 428: ! 429: ! 430: register NODE *q, *t; ! 431: register TWORD ty; ! 432: if( odebug>1 ) ! 433: { ! 434: e2print( p ); ! 435: printf( "\nrewritten by reweop as:\n" ); ! 436: } ! 437: q = tcopy( p, 0 ); ! 438: if( p->in.left->tn.op == 104 ) ! 439: { ! 440: ! 441: ! 442: ! 443: t = p->in.left; ! 444: ty = t->in.left->tn.type; ! 445: p->in.left = t->in.left; ! 446: tfree( p->in.right ); ! 447: p->in.right = t; ! 448: t->in.left = q; ! 449: ! 450: t->tn.type = ty; ! 451: } ! 452: else ! 453: { ! 454: tfree( p->in.right ); ! 455: p->in.right = q; ! 456: } ! 457: ! 458: p->tn.op = 58; ! 459: q->tn.op = (-1)+ q->tn.op; ! 460: p->tn.type = p->in.left->tn.type; ! 461: q->tn.type = q->in.right->tn.type; ! 462: if( odebug>1 ) e2print( p ); ! 463: } ! 464: rewass( p ) ! 465: NODE *p; ! 466: { ! 467: NODE *q; ! 468: int o; ! 469: ! 470: if( odebug ) ! 471: { ! 472: printf( "rewass called with:\n" ); ! 473: e2print( p ); ! 474: } ! 475: o = p->tn.op; ! 476: if( o == 2+ 14 ) ! 477: { ! 478: if( p->in.left->tn.op == 118 ) ! 479: { ! 480: ! 481: q = p->in.left; ! 482: q->tn.op = 4; ! 483: *p = *q; ! 484: q->tn.op = 97; ! 485: return(0); ! 486: } ! 487: ! 488: rewsto( p->in.left ); ! 489: ! 490: if( odebug ) ! 491: { ! 492: printf( "\nrewritten by rewass as:\n" ); ! 493: e2print( p ); ! 494: } ! 495: return(1); ! 496: } ! 497: if( ! (dope[o]&01) || o==58 ) ! 498: { ! 499: if( o==58 ) ! 500: { ! 501: ! 502: o = p->in.left->tn.op; ! 503: if( o==118 || o==120 || o==119 ) ! 504: { ! 505: ! 506: p->in.left->tn.op = 94; ! 507: p->in.left->tn.rval = 0; ! 508: if( odebug ) ! 509: { ! 510: printf( "funny node redone\n" ); ! 511: e2print(p); ! 512: } ! 513: return(0); ! 514: } ! 515: } ! 516: else ! 517: { ! 518: TWORD t = p->in.left->tn.type; ! 519: ! 520: ! 521: p->in.left = ind2type( p->in.left ); ! 522: p->in.right = ind2type( p->in.right ); ! 523: if( odebug ) { ! 524: printf( "conversions inserted" ); ! 525: e2print(p); ! 526: } ! 527: ! 528: if( t != p->in.left->tn.type ) { ! 529: ! 530: return( 0 ); ! 531: } ! 532: } ! 533: e2print(p); ! 534: cerror( "can't deal with op %s", opst[o] ); ! 535: } ! 536: if( o == 78 || o == 79 ) ! 537: { ! 538: ! 539: if( odebug>1 ) ! 540: { ! 541: e2print( p ); ! 542: printf( "\nrewritten by rewass as:\n" ); ! 543: } ! 544: if( p->in.goal == (6+1) ) ! 545: { ! 546: p->in.op = ((o==78)?1+ 6:1+ 8); ! 547: } ! 548: else ! 549: { ! 550: q = tcopy(p, 0); ! 551: regrcl( p->in.left ); ! 552: tfree( p->in.left ); ! 553: p->in.left = q; ! 554: q->tn.op = ((o==78)?1+ 6:1+ 8); ! 555: p->tn.op = ((o==78)?8:6); ! 556: } ! 557: if( odebug ) ! 558: { ! 559: printf( "\nrewritten by rewass as:\n" ); ! 560: e2print( p ); ! 561: } ! 562: return(1); ! 563: } ! 564: ! 565: if( q = lhsto(p) ) ! 566: { ! 567: if( !rewsto( q ) ) cerror( "rewass0" ); ! 568: rewcom( p, p->tn.goal ); ! 569: if( p->tn.op != 59 ) cerror( "rewass1" ); ! 570: if( ! (dope[ p->in.right->tn.op ]&01) ) cerror( "rewass2" ); ! 571: (void)reweop( p->in.right ); ! 572: } ! 573: else (void)reweop( p ); ! 574: return(1); ! 575: } ! 576: outshp( pp ) ! 577: SHAPE **pp; ! 578: { ! 579: SHAPE *p; ! 580: if (pp == 0) ! 581: return; ! 582: for( ; p = *pp; ++pp ) ! 583: { ! 584: printf("\t\t"); ! 585: shpr(p); ! 586: printf( " (%d)\n", p->sc ); ! 587: } ! 588: } ! 589: tabpr() ! 590: { ! 591: register OPTAB *p; ! 592: for (p =table; ;p++) ! 593: { ! 594: printf("Dump of table[%d] (stinline %d)\n", p-table, p->stinline ); ! 595: printf("\top = %s\n", opst[p->op]); ! 596: printf("\tnextop = %d\n", p->nextop?p->nextop-table:-1 ); ! 597: printf("\tlshape = %d\n", p->lshape-pshape); ! 598: printf("\tltype = 0%o\n", p->ltype); ! 599: printf("\trshape = %d\n", p->rshape-pshape); ! 600: printf("\trtype = 0%o\n", p->rtype); ! 601: printf("\tneeds = %d\n", p->needs); ! 602: printf("\trewrite = %d\n", p->rewrite); ! 603: printf("\tcstring = %s", p->cstring); ! 604: printf("\tcost = %d\n", p->cost); ! 605: printf("\tLeft:\n"); ! 606: outshp(p->lshape); ! 607: printf("\tRight:\n"); ! 608: outshp(p->rshape); ! 609: printf("\n"); ! 610: } ! 611: } ! 612: codgen( p ) ! 613: NODE *p; ! 614: { ! 615: ! 616: int i, flag; ! 617: if (odebug > 5) ! 618: { ! 619: tabpr(); ! 620: ! 621: } ! 622: ! 623: ! 624: ! 625: ! 626: again: ! 627: ! 628: rewcom( p, (6+1) ); ! 629: if( odebug ) ! 630: { ! 631: printf( "After goals are computed:" ); ! 632: e2print( p ); ! 633: } ! 634: ! 635: if( costs( p ) ) goto again; ! 636: if( odebug ) ! 637: { ! 638: printf( "After costs are computed:" ); ! 639: e2print( p ); ! 640: } ! 641: ! 642: nins = 0; ! 643: insout( p, (6+1) ); ! 644: ! 645: flag = 0; ! 646: for( i=0; i<nins; ++i ) ! 647: { ! 648: if( inst[i].goal == (6+2) ) ! 649: { ! 650: if( odebug ) ! 651: { ! 652: printf( "subtree is stored in temp:\n" ); ! 653: e2print( inst[i].p ); ! 654: } ! 655: if( rewsto( inst[i].p ) ) { ! 656: if( !fast ) goto again; ! 657: ! 658: flag = 1; ! 659: } ! 660: } ! 661: } ! 662: if( flag ) goto again; ! 663: if( odebug ) e2print(p); ! 664: ! 665: insprt(); ! 666: } ! 667: INST inst[300]; ! 668: int nins; ! 669: insprt() ! 670: { ! 671: int i; ! 672: register INST *pi; ! 673: register NODE *p; ! 674: register OPTAB *q; ! 675: register c, goal; ! 676: for( pi=inst,i=0; i<nins; ++i,++pi ) ! 677: { ! 678: p = pi->p; ! 679: q = pi->q; ! 680: c = pi->goal; ! 681: if( c == (6+3) && (q->rewrite&040) ) goal = 04 ; ! 682: else if( c == (6+1) ) goal = 01 ; ! 683: else goal = 02 ; ! 684: if(odebug > 4) ! 685: { ! 686: printf("INSOUT: %d c=",i); ! 687: preff(c); ! 688: printf(" goal="); ! 689: prgoal(goal); ! 690: printf("\n"); ! 691: e2print(p); ! 692: } ! 693: allo( p, q ); ! 694: expand( p, goal, q->cstring, q ); ! 695: reclaim( p, q->rewrite, goal ); ! 696: ! 697: if( c == (6+3) && p->tn.op != 96 ) ! 698: { ! 699: cfix( p, (6+3) ); ! 700: if( p->tn.op != 96 ) cerror( "ctest fails" ); ! 701: } ! 702: if( c>=0 && c<=6 && ! ( p ->in.op==94 && (( p ->tn.rval)<6)) ) ! 703: { ! 704: cfix( p, 6 ); ! 705: } ! 706: } ! 707: } ! 708: SHTABLE sha; ! 709: int odebug = 0; ! 710: cfix( p, goal ) ! 711: NODE *p; ! 712: { ! 713: ! 714: OPTAB *q; ! 715: NODE *pp; ! 716: int r; ! 717: if(odebug > 4) ! 718: { ! 719: printf("CFIX: goal="); ! 720: prgoal(goal); ! 721: printf("\n"); ! 722: e2print(p); ! 723: } ! 724: if( goal == (6+3) ) ! 725: { ! 726: r = 040; ! 727: p->tn.goal = (6+3); ! 728: } ! 729: else ! 730: { ! 731: r = (04|010|020); ! 732: pp = ( ( (( (dope[ p ->tn.op]&016))==02? p : p ->in.left))); ! 733: if( ( pp ->in.op==94 && (( pp ->tn.rval)<6)) ) r |= 01; ! 734: pp = ( ( (( (dope[ p ->tn.op]&016))==010? p ->in.right: p ))); ! 735: if( ( pp ->in.op==94 && (( pp ->tn.rval)<6)) ) r |= 02; ! 736: } ! 737: if( goal == (6+3) ) goal = 04 ; ! 738: else goal = 02 ; ! 739: for( q=0; q = match( p, q ); ) ! 740: { ! 741: ! 742: ! 743: if( q->rewrite & r ) ! 744: { ! 745: ! 746: allo( p, q ); ! 747: expand( p, goal, q->cstring, q ); ! 748: reclaim( p, q->rewrite, goal ); ! 749: return; ! 750: } ! 751: } ! 752: e2print(p); ! 753: cerror( "cfix trouble" ); ! 754: } ! 755: preff(c) ! 756: { ! 757: char buf[20]; ! 758: register char *p; ! 759: p = c==(6+3) ? "CCC" : c==(6+2) ? "CTEMP" : c==(6+1) ? "CEFF" : 0; ! 760: if(!p) ! 761: { ! 762: sprintf(buf,"0%o",c); ! 763: p = buf; ! 764: } ! 765: printf("%s",p); ! 766: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.