|
|
1.1 ! root 1: #include "pico.h" ! 2: ! 3: long eval(); ! 4: Node* abase(); ! 5: Node *new(); ! 6: #define ARITH 1 ! 7: #define BOOL 0 ! 8: #define Z ((Node *)0) ! 9: #define OK(x) (x==0) ! 10: #define EQ(x,y) ((x)==(y)) ! 11: #define IS(x,y) EQ((x)->type,(y)) ! 12: #define OSIZE 50 ! 13: ! 14: rewrite(n, context) ! 15: Node *n; ! 16: { ! 17: long v; ! 18: ! 19: if(n == Z) ! 20: return; ! 21: if(isconst(n)) { ! 22: if(!IS(n,CONST) && !IS(n,CONSTB)) ! 23: mkconst(n, eval(n, context)); ! 24: return; ! 25: } ! 26: switch(n->type) ! 27: { ! 28: case LABL: ! 29: rewrite(n->left, context); ! 30: return; ! 31: ! 32: case GOTO: ! 33: case VAR: ! 34: case OARG: ! 35: case REG: ! 36: return; ! 37: ! 38: case CONDI: ! 39: if(isconst(n->other)) { ! 40: v = eval(n->other, BOOL); ! 41: if(v) { ! 42: rewrite(n->left, context); ! 43: *n = *n->left; ! 44: return; ! 45: } ! 46: rewrite(n->right, context); ! 47: *n = *n->right; ! 48: return; ! 49: } ! 50: rewrite(n->other, BOOL); ! 51: iknown(n->other, n->left, 1); ! 52: rewrite(n->left, context); ! 53: if(n->right != Z) { ! 54: iknown(n->other, n->right, 0); ! 55: rewrite(n->right, context); ! 56: if(compr(n->left, n->right) == 0) ! 57: *n = *n->right; ! 58: } ! 59: return; ! 60: ! 61: case DEREFB: ! 62: rewrite(n->left, ARITH); ! 63: rewrite(n->right, ARITH); ! 64: if(n->left->type != VAR) ! 65: return; ! 66: if(IS(n->right,CONST)) { ! 67: n->left->arg += n->right->arg; ! 68: n->right = Z; ! 69: return; ! 70: } ! 71: if(IS(n->right,OADD)) ! 72: if(IS(n->right->right,CONST)) { ! 73: n->left->arg += n->right->right->arg; ! 74: n->right = n->right->left; ! 75: return; ! 76: } ! 77: return; ! 78: ! 79: case DEREFS: ! 80: rewrite(n->left, ARITH); ! 81: rewrite(n->right, ARITH); ! 82: if(n->left->type != VAR) ! 83: return; ! 84: if(IS(n->right,CONST)) { ! 85: n->left->arg += 2*n->right->arg; ! 86: n->right = Z; ! 87: return; ! 88: } ! 89: if(IS(n->right,OADD)) ! 90: if(IS(n->right->right,CONST)) { ! 91: n->left->arg += 2*n->right->right->arg; ! 92: n->right = n->right->left; ! 93: return; ! 94: } ! 95: return; ! 96: ! 97: case DEREFL: ! 98: rewrite(n->left, ARITH); ! 99: rewrite(n->right, ARITH); ! 100: if(n->left->type != VAR) ! 101: return; ! 102: if(IS(n->right,CONST)) { ! 103: n->left->arg += 4*n->right->arg; ! 104: n->right = Z; ! 105: return; ! 106: } ! 107: if(IS(n->right,OADD)) ! 108: if(IS(n->right->right,CONST)) { ! 109: n->left->arg += 4*n->right->right->arg; ! 110: n->right = n->right->left; ! 111: return; ! 112: } ! 113: return; ! 114: ! 115: case OADD: ! 116: case OSUB: ! 117: case OISUB: ! 118: case OMINUS: ! 119: acan(n); ! 120: return; ! 121: ! 122: case OMUL: ! 123: scan(n, 1L); ! 124: return; ! 125: ! 126: case ODIV: ! 127: rewrite(n->left, ARITH); ! 128: rewrite(n->right, ARITH); ! 129: if(IS(n->right,CONST)) { ! 130: v = n->right->arg; ! 131: if(v == 1) ! 132: *n = *n->left; ! 133: } ! 134: return; ! 135: ! 136: case OIDIV: ! 137: rewrite(n->left, ARITH); ! 138: rewrite(n->right, ARITH); ! 139: if(IS(n->left,CONST)) { ! 140: v = n->left->arg; ! 141: if(v == 1) ! 142: *n = *n->right; ! 143: } ! 144: return; ! 145: ! 146: case OPOW: ! 147: case OBIC: ! 148: case OLSH: ! 149: rewrite(n->left, ARITH); ! 150: rewrite(n->right, ARITH); ! 151: return; ! 152: ! 153: case ORETURN: ! 154: rewrite(n->left, ARITH); ! 155: return; ! 156: ! 157: case OAND: ! 158: scan(n, -1L); ! 159: if(IS(n, OAND)) ! 160: if(context == ARITH) ! 161: fixbic(n); ! 162: return; ! 163: ! 164: case OOR: ! 165: case OXOR: ! 166: scan(n, 0L); ! 167: return; ! 168: ! 169: case ONEG: ! 170: rewrite(n->left, context); ! 171: return; ! 172: ! 173: case OCOMMA: ! 174: case ACOMMA: ! 175: rewrite(n->left, ARITH); ! 176: rewrite(n->right, context); ! 177: return; ! 178: ! 179: case OCALL: ! 180: case CCALL: ! 181: rewrite(n->left, ARITH); ! 182: return; ! 183: ! 184: case OASS: ! 185: rewrite(n->left, context); ! 186: rewrite(n->right, context); ! 187: return; ! 188: ! 189: case COMP: ! 190: rewrite(n->left, ARITH); ! 191: return; ! 192: ! 193: case OGT: ! 194: case OLT: ! 195: case OLE: ! 196: case OGE: ! 197: case ONE: ! 198: case OEQ: ! 199: rewrite(n->left, ARITH); ! 200: rewrite(n->right, ARITH); ! 201: if(n->right && IS(n->right,CONST) && n->right->arg == 0) { ! 202: n->right = Z; ! 203: return; ! 204: } ! 205: if(n->left && IS(n->left,CONST) && n->left->arg == 0) { ! 206: n->left = n->right; ! 207: n->right = Z; ! 208: n->type = comop(n->type); ! 209: return; ! 210: } ! 211: return; ! 212: ! 213: case OOROR: ! 214: rewrite(n->left, BOOL); ! 215: rewrite(n->right, BOOL); ! 216: if(IS(n->left,CONST)) { ! 217: *n = *n->right; ! 218: return; ! 219: } ! 220: if(IS(n->right,CONST)) { ! 221: if(!eval(n->right, BOOL)) ! 222: *n = *n->right; ! 223: return; ! 224: } ! 225: iknown(n->left, n->right, 0); ! 226: return; ! 227: ! 228: case OANDAND: ! 229: rewrite(n->left, BOOL); ! 230: rewrite(n->right, BOOL); ! 231: if(IS(n->left,CONST)) { ! 232: *n = *n->right; ! 233: return; ! 234: } ! 235: if(IS(n->right,CONST)) { ! 236: if(eval(n->right, BOOL)) ! 237: *n = *n->right; ! 238: return; ! 239: } ! 240: iknown(n->left, n->right, 1); ! 241: return; ! 242: ! 243: case ONOT: ! 244: rewrite(n->left, BOOL); ! 245: return; ! 246: } ! 247: printf("type = %d\n", n->type); ! 248: } ! 249: ! 250: comop(o) ! 251: { ! 252: ! 253: switch(o) { ! 254: ! 255: case OLT: o = OGE; break; ! 256: case OLE: o = OGT; break; ! 257: case OGT: o = OLE; break; ! 258: case OGE: o = OLT; break; ! 259: } ! 260: return(o); ! 261: } ! 262: ! 263: fixbic(n) ! 264: Node *n; ! 265: { ! 266: ! 267: if(!IS(n->right,CONST)) ! 268: return; ! 269: n->right->arg = ~n->right->arg; ! 270: n->type = OBIC; ! 271: } ! 272: ! 273: iknown(x, n, f) ! 274: Node *n, *x; ! 275: { ! 276: ! 277: if (n == Z) ! 278: return; ! 279: ! 280: known(x, n, f); ! 281: switch(x->type) { ! 282: ! 283: case ONOT: ! 284: iknown(x->left, n, !f); ! 285: break; ! 286: ! 287: case OAND: ! 288: if(f) { ! 289: if(isconst(x->left)) ! 290: iknown(x->right, n, 1); ! 291: if(isconst(x->right)) ! 292: iknown(x->left, n, 1); ! 293: } ! 294: break; ! 295: ! 296: case OOR: ! 297: if(!f) { ! 298: if(isconst(x->left)) ! 299: iknown(x->right, n, 0); ! 300: if(isconst(x->right)) ! 301: iknown(x->left, n, 0); ! 302: } ! 303: break; ! 304: } ! 305: } ! 306: ! 307: known(x, n, f) ! 308: Node *n, *x; ! 309: { ! 310: ! 311: if(compr(x, n) == 0) { ! 312: if(f == 0) { ! 313: mkconst(n, 0L); ! 314: return; ! 315: } ! 316: } ! 317: switch(n->type) { ! 318: ! 319: case CONDI: ! 320: known(x, n->other, f); ! 321: if(compr(x, n->other) == 0) { ! 322: if(f) ! 323: *n = *n->left; ! 324: else ! 325: *n = *n->right; ! 326: known(x, n, f); ! 327: return; ! 328: } ! 329: break; ! 330: ! 331: case OANDAND: ! 332: if(compr(x, n->left) == 0) { ! 333: if(f) ! 334: mkconst(n, 1L); ! 335: else ! 336: *n = *n->right; ! 337: known(x, n, f); ! 338: return; ! 339: } ! 340: if(compr(x, n->right) == 0) { ! 341: if(f) ! 342: mkconst(n->right, 1L); ! 343: else ! 344: *n = *n->left; ! 345: known(x, n, f); ! 346: return; ! 347: } ! 348: break; ! 349: ! 350: case OOROR: ! 351: if(compr(x, n->left) == 0) { ! 352: if(f) ! 353: *n = *n->right; ! 354: else ! 355: mkconst(n, 0L); ! 356: known(x, n, f); ! 357: return; ! 358: } ! 359: if(compr(x, n->right) == 0) { ! 360: if(f) ! 361: *n = *n->left; ! 362: else ! 363: mkconst(n->right, 0L); ! 364: known(x, n, f); ! 365: return; ! 366: } ! 367: break; ! 368: } ! 369: if(n->right) ! 370: known(x, n->right, f); ! 371: if(n->left) ! 372: known(x, n->left, f); ! 373: } ! 374: ! 375: mkconst(n, v) ! 376: Node *n; ! 377: long v; ! 378: { ! 379: ! 380: n->type = CONST; ! 381: n->other = Z; ! 382: n->left = Z; ! 383: n->right = Z; ! 384: n->arg = v; ! 385: } ! 386: ! 387: ! 388: isconst(n) ! 389: Node *n; ! 390: { ! 391: ! 392: if(n == Z) ! 393: return 0; ! 394: switch(n->type) ! 395: { ! 396: ! 397: case CONST: ! 398: case CONSTB: ! 399: return 1; ! 400: ! 401: case REG: ! 402: case VAR: ! 403: case OARG: ! 404: case DEREFB: ! 405: case DEREFS: ! 406: case DEREFL: ! 407: case OCALL: ! 408: case CCALL: ! 409: case OASS: ! 410: case GOTO: ! 411: case LABL: ! 412: case OCOMMA: ! 413: case ACOMMA: ! 414: case ORETURN: ! 415: return 0; ! 416: ! 417: case COMP: ! 418: for (n = n->left; n->type == ACOMMA; n = n->left) ! 419: if(!isconst(n->left)) ! 420: return 0; ! 421: return isconst(n); ! 422: ! 423: case OANDAND: ! 424: if(isconst(n->left)) { ! 425: if(!eval(n->left, BOOL)) ! 426: return 1; ! 427: return isconst(n->right); ! 428: } ! 429: return 0; ! 430: ! 431: case OOROR: ! 432: if(isconst(n->left)) { ! 433: if(eval(n->left, BOOL)) ! 434: return 1; ! 435: return isconst(n->right); ! 436: } ! 437: return 0; ! 438: ! 439: case CONDI: ! 440: if(!isconst(n->other)) ! 441: return 0; ! 442: if(eval(n->other, BOOL)) ! 443: return isconst(n->left); ! 444: return isconst(n->right); ! 445: } ! 446: if(n->left) ! 447: if(!isconst(n->left)) ! 448: return 0; ! 449: if(n->right) ! 450: if(!isconst(n->right)) ! 451: return 0; ! 452: return 1; ! 453: } ! 454: ! 455: struct O ! 456: { ! 457: struct l ! 458: { ! 459: Node *n; ! 460: long f; ! 461: } l[OSIZE]; ! 462: Node *free; ! 463: int count; ! 464: } O; ! 465: ! 466: cancmp1(p1, p2) ! 467: struct l *p1, *p2; ! 468: { ! 469: ! 470: return compr(p1->n, p2->n); ! 471: } ! 472: ! 473: scan1(n, o) ! 474: Node *n; ! 475: { ! 476: ! 477: if(IS(n,o)) { ! 478: scan1(n->left, o); ! 479: scan1(n->right, o); ! 480: return; ! 481: } ! 482: rewrite(n, ARITH); ! 483: } ! 484: ! 485: scan2(n, o) ! 486: Node *n; ! 487: { ! 488: ! 489: if(IS(n,o)) { ! 490: scan2(n->left, o); ! 491: scan2(n->right, o); ! 492: n->type = o; ! 493: n->left = O.free; ! 494: n->right = Z; ! 495: n->arg = 0; ! 496: O.free = n; ! 497: return; ! 498: } ! 499: O.l[O.count].n = n; ! 500: O.count++; ! 501: if(O.count >= OSIZE) ! 502: yyerror("OSIZE too small"); ! 503: } ! 504: ! 505: scan(n, z) ! 506: Node *n; ! 507: long z; ! 508: { ! 509: Node t; ! 510: int i, j, o; ! 511: ! 512: o = n->type; ! 513: scan1(n, o); ! 514: O.count = 0; ! 515: O.free = Z; ! 516: scan2(n, o); ! 517: qsort(O.l, O.count, sizeof O.l[0], cancmp1); ! 518: ! 519: j = 0; ! 520: for(i=0; i<O.count; i++) { ! 521: if(j) ! 522: if(IS(O.l[i].n,CONST)) { ! 523: t.type = o; ! 524: t.left = O.l[i].n; ! 525: t.right = O.l[j-1].n; ! 526: mkconst(O.l[i].n, eval(&t, ARITH)); ! 527: O.l[j-1].n = O.l[i].n; ! 528: continue; ! 529: } ! 530: if(j) ! 531: if(compr(O.l[j-1].n, O.l[i].n) == 0) { ! 532: /* x^x => 0 */ ! 533: if(o == OXOR) { ! 534: j--; ! 535: continue; ! 536: } ! 537: /* x&x => x */ ! 538: /* x|x => x */ ! 539: if(o == OAND || o == OOR) ! 540: continue; ! 541: } ! 542: O.l[j].n = O.l[i].n; ! 543: if(IS(O.l[j].n,CONST)) ! 544: if(O.l[j].n->arg == z) ! 545: continue; ! 546: j++; ! 547: } ! 548: O.count = j; ! 549: if(n != O.free) ! 550: yyerror("scan smells"); ! 551: if(O.count == 0) { ! 552: mkconst(n, z); ! 553: return; ! 554: } ! 555: if(O.count == 1) { ! 556: *n = *O.l[0].n; ! 557: return; ! 558: } ! 559: for(i=0; i<O.count-2; i++) { ! 560: O.free->right = O.l[i].n; ! 561: O.free = O.free->left; ! 562: } ! 563: O.free->right = O.l[i].n; ! 564: O.free->left = O.l[i+1].n; ! 565: } ! 566: ! 567: acan1(n) ! 568: Node *n; ! 569: { ! 570: register t; ! 571: ! 572: t = n->type; ! 573: if(EQ(t,OADD)||EQ(t,OSUB)||EQ(t,OMINUS)||EQ(t,OISUB)) { ! 574: acan1(n->left); ! 575: if(n->right) ! 576: acan1(n->right); ! 577: return; ! 578: } ! 579: if (t == OISUB) yyerror("hit bug in optimizer (loop)"); ! 580: rewrite(n, ARITH); ! 581: } ! 582: ! 583: acan2(n, f) ! 584: Node *n; ! 585: long f; ! 586: { ! 587: register t; ! 588: ! 589: t = n->type; ! 590: if(EQ(t,OADD)) { ! 591: acan2(n->left, f); ! 592: acan2(n->right, f); ! 593: goto out; ! 594: } ! 595: if(EQ(t,OSUB)) { ! 596: acan2(n->left, f); ! 597: acan2(n->right, -f); ! 598: goto out; ! 599: } ! 600: if(EQ(t,OISUB)) { ! 601: acan2(n->left, -f); ! 602: acan2(n->right, f); ! 603: goto out; ! 604: } ! 605: if(EQ(t,OMINUS)) { ! 606: acan2(n->left, -f); ! 607: goto out; ! 608: } ! 609: if(EQ(t,OMUL)) ! 610: if(IS(n->right,CONST)) { ! 611: f *= n->right->arg; ! 612: acan2(n->left, f); ! 613: goto out; ! 614: } ! 615: if(f != 1 && IS(n,CONST)) { ! 616: mkconst(n, f*n->arg); ! 617: f = 1; ! 618: } ! 619: O.l[O.count].n = n; ! 620: O.l[O.count].f = f; ! 621: O.count++; ! 622: if(O.count >= OSIZE) ! 623: yyerror("OSIZE too small"); ! 624: return; ! 625: ! 626: out: ! 627: n->type = OADD; ! 628: n->left = O.free; ! 629: n->right = Z; ! 630: n->arg = 0; ! 631: O.free = n; ! 632: } ! 633: ! 634: acan3() ! 635: { ! 636: int i, j; ! 637: long nator, dator; ! 638: Node *t; ! 639: ! 640: if(IS(O.l[0].n,CONST)) ! 641: if(O.l[0].n->arg < 0) { ! 642: O.l[0].n->arg = -O.l[0].n->arg; ! 643: O.l[0].f = -O.l[0].f; ! 644: } ! 645: for(i=0; i<O.count; i++) { ! 646: if(IS(O.l[i].n,CONST)) ! 647: continue; ! 648: dator = O.l[i].f; ! 649: if(dator < 0) ! 650: dator = -dator; ! 651: if(dator <= 1) ! 652: continue; ! 653: for(j=0; j<O.count; j++) { ! 654: if(i == j) ! 655: continue; ! 656: nator = O.l[j].f; ! 657: if(IS(O.l[j].n,CONST)) ! 658: nator = O.l[j].n->arg; ! 659: if(nator < 0) ! 660: nator = -nator; ! 661: if(nator%dator) ! 662: continue; ! 663: if(IS(O.l[j].n,CONST)) { ! 664: O.l[j].n->arg = nator/dator; ! 665: t = O.l[j].n; ! 666: } else ! 667: if(dator == nator) { ! 668: t = O.l[j].n; ! 669: } else { ! 670: t = new(CONST, Z, Z, nator/dator); ! 671: t = new(OMUL, O.l[j].n, t, 0L); ! 672: } ! 673: if(O.l[j].f < 0) ! 674: t = new(OSUB, O.l[i].n, t, 0L); ! 675: else ! 676: t = new(OADD, O.l[i].n, t, 0L); ! 677: O.l[i].n = t; ! 678: O.l[j].f = 0; ! 679: } ! 680: } ! 681: j = 0; ! 682: for(i=0; i<O.count; i++) { ! 683: if(O.l[i].f == 0) ! 684: continue; ! 685: O.l[j].n = O.l[i].n; ! 686: O.l[j].f = O.l[i].f; ! 687: j++; ! 688: } ! 689: O.count = j; ! 690: for(i=O.count-1; i>=0; i--) { ! 691: if(O.l[i].f < 0) ! 692: continue; ! 693: } ! 694: } ! 695: ! 696: Node * ! 697: atemp(i) ! 698: { ! 699: Node *t; ! 700: int f; ! 701: ! 702: f = O.l[i].f; ! 703: if(f < 0) ! 704: f = -f; ! 705: if(f != 1) { ! 706: t = new(CONST, Z, Z, f); ! 707: if(f) ! 708: t = new(OMUL, O.l[i].n, t, 0L); ! 709: return t; ! 710: } ! 711: return O.l[i].n; ! 712: } ! 713: ! 714: acan(n) ! 715: Node *n; ! 716: { ! 717: Node t; ! 718: int i, j; ! 719: ! 720: acan1(n); ! 721: O.count = 0; ! 722: O.free = Z; ! 723: acan2(n, 1L); ! 724: qsort(O.l, O.count, sizeof O.l[0], cancmp1); ! 725: ! 726: j = 0; ! 727: for(i=0; i<O.count; i++) { ! 728: if(j) ! 729: if(IS(O.l[i].n,CONST)) { ! 730: t.type = OADD; ! 731: t.left = O.l[i].n; ! 732: t.right = O.l[j-1].n; ! 733: mkconst(O.l[i].n, eval(&t, ARITH)); ! 734: O.l[j-1].n = O.l[i].n; ! 735: continue; ! 736: } ! 737: if(j) ! 738: if(compr(O.l[j-1].n, O.l[i].n) == 0) { ! 739: O.l[j-1].f += O.l[i].f; ! 740: if(O.l[j-1].f == 0) ! 741: j--; ! 742: continue; ! 743: } ! 744: O.l[j].n = O.l[i].n; ! 745: O.l[j].f = O.l[i].f; ! 746: if(IS(O.l[j].n,CONST)) ! 747: if(O.l[j].n->arg == 0) ! 748: continue; ! 749: j++; ! 750: } ! 751: O.count = j; ! 752: acan3(); ! 753: if(n != O.free) ! 754: yyerror("acan smells"); ! 755: if(O.count == 0) { ! 756: mkconst(n, 0L); ! 757: return; ! 758: } ! 759: j = -1; ! 760: for(i=0; i<O.count; i++) ! 761: if(O.l[i].f >= 0) ! 762: j = i; ! 763: if(j < 0) { ! 764: if(IS(O.l[0].n,CONST)) { ! 765: O.l[0].n->arg = -O.l[0].n->arg; ! 766: O.l[0].f = -O.l[0].f; ! 767: j = 0; ! 768: } else { ! 769: O.free->type = OMINUS; ! 770: if(O.count == 1) { ! 771: O.free->left = atemp(0); ! 772: return; ! 773: } ! 774: O.free = O.free->left; ! 775: } ! 776: } ! 777: for(i=j+1; i<O.count; i++) ! 778: O.l[i].f = -O.l[i].f; ! 779: if(O.count == 1) { ! 780: *O.free = *atemp(0); ! 781: return; ! 782: } ! 783: for(i=0; i<O.count-2; i++) { ! 784: O.free->right = atemp(i); ! 785: if(O.l[i].f < 0) ! 786: O.free->type = OSUB; ! 787: else ! 788: if(i == j) ! 789: O.free->type = OISUB; ! 790: O.free = O.free->left; ! 791: } ! 792: O.free->right = atemp(i); ! 793: if(O.l[i].f < 0) ! 794: O.free->type = OSUB; ! 795: else ! 796: if(i == j) ! 797: O.free->type = OISUB; ! 798: O.free->left = atemp(i+1); ! 799: } ! 800: ! 801: compr(n1, n2) ! 802: Node *n1, *n2; ! 803: { ! 804: int v; ! 805: ! 806: v = n1->type - n2->type; ! 807: if(v) { ! 808: if(IS(n1,CONST)) ! 809: return -1; ! 810: if(IS(n2,CONST)) ! 811: return 1; ! 812: return v; ! 813: } ! 814: switch(n1->type) ! 815: { ! 816: ! 817: case VAR: ! 818: case CONST: ! 819: case REG: ! 820: case OARG: ! 821: v = n1->arg - n2->arg; ! 822: return v; ! 823: ! 824: case CONDI: ! 825: v = compr(n1->other, n2->other); ! 826: if(v) ! 827: return v; ! 828: ! 829: case OCALL: ! 830: case CCALL: ! 831: case LABL: ! 832: case GOTO: ! 833: return -1; ! 834: } ! 835: v = compr(n1->left, n2->left); ! 836: if(v) ! 837: return v; ! 838: if(n1->right) ! 839: return compr(n1->right, n2->right); ! 840: return 0; ! 841: } ! 842: ! 843: dlist() ! 844: { ! 845: int i; ! 846: ! 847: for(i=0; i<O.count; i++) { ! 848: printf("[%2d] ", i); ! 849: printf("%3d ", O.l[i].f); ! 850: prtree(O.l[i].n, 0, 5); ! 851: } ! 852: printf("\n"); ! 853: } ! 854: ! 855: long ! 856: eval(n, context) ! 857: Node *n; ! 858: { ! 859: Node n1, n2; ! 860: long v; ! 861: ! 862: ! 863: if(context == BOOL) { ! 864: n1.type = ONOT; ! 865: n1.left = &n2; ! 866: n1.right = Z; ! 867: n1.other = Z; ! 868: ! 869: n2.type = ONOT; ! 870: n2.left = n; ! 871: n2.right = Z; ! 872: n2.other = Z; ! 873: ! 874: n = &n1; ! 875: } ! 876: gencode(n); ! 877: v = callit(); ! 878: return v; ! 879: } ! 880: ! 881: callit() ! 882: { ! 883: register x, y, z; ! 884: extern program(); ! 885: ! 886: x = y = z = 0; ! 887: asm(" jsb *_program "); ! 888: asm(" x: brb x+9 "); ! 889: x = program(); ! 890: return(x); ! 891: } ! 892:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.