|
|
1.1 ! root 1: /* gencode.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: union ndu { ! 27: struct { ! 28: int op; ! 29: int goal; ! 30: TWORD type; ! 31: int cst[(6+4)]; ! 32: char * name; ! 33: char pad[8 -sizeof(char *)]; ! 34: NODE *left; ! 35: NODE *right; ! 36: }in; ! 37: ! 38: struct { ! 39: int op; ! 40: int goal; ! 41: TWORD type; ! 42: int cst[(6+4)]; ! 43: char * name; ! 44: char pad[8 -sizeof(char *)]; ! 45: CONSZ lval; ! 46: int rval; ! 47: }tn; ! 48: ! 49: struct { ! 50: int op; ! 51: int goal; ! 52: TWORD type; ! 53: int cst[(6+4)]; ! 54: int label; ! 55: int lop; ! 56: }bn; ! 57: struct { ! 58: int op; ! 59: int goal; ! 60: TWORD type; ! 61: int cst[(6+4)]; ! 62: int stsize; ! 63: short stalign; ! 64: short argsize; ! 65: }stn; ! 66: struct { ! 67: int op; ! 68: int goal; ! 69: TWORD type; ! 70: int cdim; ! 71: int csiz; ! 72: }fn; ! 73: ! 74: struct { ! 75: ! 76: int op; ! 77: int goal; ! 78: TWORD type; ! 79: int cdim; ! 80: int csiz; ! 81: double dval; ! 82: }fpn; ! 83: }; ! 84: extern int busy[]; ! 85: extern NODE node[]; ! 86: typedef struct shape SHAPE; ! 87: ! 88: extern struct shape { ! 89: int op; ! 90: SHAPE *sl; ! 91: SHAPE *sr; ! 92: int sh; ! 93: int sc; ! 94: } shapes[]; ! 95: extern SHAPE *pshape[]; ! 96: typedef struct optab OPTAB; ! 97: struct optab { ! 98: int op; ! 99: int tyop; ! 100: OPTAB *nextop; ! 101: SHAPE **lshape; ! 102: int ltype; ! 103: SHAPE **rshape; ! 104: int rtype; ! 105: int needs; ! 106: int rewrite; ! 107: char *cstring; ! 108: int cost; ! 109: int lcount; ! 110: int rcount; ! 111: int stinline; ! 112: }; ! 113: extern OPTAB ! 114: *match(), ! 115: *ophead[], ! 116: table[]; ! 117: extern NODE resc[]; ! 118: extern int tmpoff; ! 119: extern int maxboff; ! 120: extern int maxtemp; ! 121: extern int maxarg; ! 122: extern int ftnno; ! 123: extern int sideff; ! 124: extern NODE ! 125: *talloc(), ! 126: *ind2type(), ! 127: *tcopy(), ! 128: *getadr(), ! 129: *getlr(); ! 130: extern CONSZ rdin(); ! 131: extern char *rnames[]; ! 132: extern int lineno; ! 133: extern char ftitle[]; ! 134: extern int fldshf, fldsz; ! 135: extern int lflag, udebug, e2debug, odebug, rdebug, radebug, sdebug; ! 136: extern int fast; ! 137: typedef struct inst INST; ! 138: struct inst { ! 139: NODE *p; ! 140: OPTAB *q; ! 141: int goal; ! 142: }; ! 143: extern INST inst[300]; ! 144: extern nins; ! 145: typedef SHAPE *SHTABLE[2][20]; ! 146: extern SHTABLE sha; ! 147: typedef struct { ! 148: unsigned char ans; ! 149: unsigned char regmask; ! 150: unsigned short flag; ! 151: } ret; ! 152: ret doit(), allocreg(), reg0(), indir(), tostack(); ! 153: char *genjmp(); ! 154: char bufs[128][64]; ! 155: char *buf; ! 156: char prbuf[10240]; ! 157: char *prptr; ! 158: NODE *copytree(), *gimmenode(); ! 159: extern int ntree; ! 160: typedef int jmp_buf[10]; ! 161: jmp_buf back; ! 162: int acnt; ! 163: gencode(p) ! 164: NODE *p; ! 165: { NODE *q; ! 166: if(setjmp(back)) { ! 167: pr("#\treg\t%d\n", ++acnt); ! 168: if(acnt > 20) { ! 169: prtree(q); ! 170: outpr(); ! 171: return; ! 172: } ! 173: } ! 174: else ! 175: q = copytree(p); ! 176: buf = bufs[1]; ! 177: prptr = prbuf; ! 178: (void) doit(q, 0, 0, 0x3f); ! 179: acnt = ntree = 0; ! 180: outpr(); ! 181: } ! 182: ret ! 183: doit(p, flag, dest, regmask) ! 184: NODE *p; ! 185: ret dest; ! 186: { ret s, t, x; ! 187: char *pp; ! 188: NODE snode, *q; ! 189: int i, j; ! 190: switch(p->in.op) { ! 191: default: ! 192: pr("#\tweird??? %d\n", p->in.op); ! 193: return(dest); ! 194: case 1+ 14: ! 195: flag |= 256; ! 196: flag &= ~1; ! 197: case 14: ! 198: ! 199: t = doit(p->in.left, 2, 0, regmask); ! 200: regmask &= ~t.regmask; ! 201: s = doit(p->in.right, 2, 0, regmask); ! 202: if(s.flag & 1024) { ! 203: totemp(p, 0); ! 204: longjmp(back, 1); ! 205: } ! 206: regmask &= ~s.regmask; ! 207: if(flag & 1) { ! 208: pr("#\tbit%c\t%s,%s\n", childtype(p), bufs[s.ans], bufs[t.ans]); ! 209: dest.ans = 0; ! 210: dest.flag = 1; ! 211: dest.regmask = 0; ! 212: return(dest); ! 213: } ! 214: if(flag & 256) ! 215: dest = x = t; ! 216: if(dest.ans == 0) ! 217: if(s.flag & 16) ! 218: dest = x = s; ! 219: else if(t.flag & 16) ! 220: dest = x = t; ! 221: else ! 222: dest = x = allocreg(p, regmask); ! 223: else ! 224: x = allocreg(p, regmask); ! 225: if(p->in.right->in.op == 4) { ! 226: x = tostack(); ! 227: sprintf( bufs[x.ans], "$%d", -p->in.right->tn.lval - 1); ! 228: } ! 229: else ! 230: pr("#\tmcom%c\t%s,%s\n", childtype(p), bufs[s.ans], bufs[x.ans]); ! 231: if(strcmp( bufs[t.ans], bufs[dest.ans]) == 0) ! 232: pr("#\tbic%c2\t%s,%s\n", childtype(p), bufs[x.ans], bufs[dest.ans]); ! 233: else ! 234: pr("#\tbic%c3\t%s,%s,%s\n", childtype(p), bufs[x.ans], ! 235: bufs[t.ans], bufs[dest.ans]); ! 236: dest.flag |= 1; ! 237: return(dest); ! 238: case 70: ! 239: call: ! 240: funargs(p->in.right, regmask); ! 241: i = p->stn.argsize/32; ! 242: called: ! 243: s = doit(p->in.left, 2|8, 0, regmask & ~3); ! 244: pp = bufs[s.ans]; ! 245: aftercall: ! 246: if(regmask != 0x3f) { ! 247: s.flag = 1024; ! 248: return(s); ! 249: } ! 250: x = reg0(p, regmask); ! 251: pr("#\tcalls\t$%d,%s\n", i, pp); ! 252: if(p->in.op == 100 || p->in.op == 2+ 100 || (flag & 8)) { ! 253: strcat( bufs[x.ans], ")"); ! 254: strshift( bufs[x.ans], 1); ! 255: bufs[x.ans][0] = '('; ! 256: } ! 257: if(dest.ans == 0) ! 258: if(flag & 256) ! 259: dest = doit(p->in.left->in.op == 104? ! 260: p->in.left->in.left: ! 261: p->in.left, 0, 0, regmask & ~x.regmask); ! 262: else ! 263: return(x); ! 264: movexdest: ! 265: if(strcmp( bufs[x.ans], bufs[dest.ans]) == 0) ! 266: return(x); ! 267: if(flag & 4) ! 268: pr("#\tpush%c\t%s\n", type(p), bufs[x.ans]); ! 269: else ! 270: pr("#\tmov%c\t%s,%s\n", type(p), bufs[x.ans], bufs[dest.ans]); ! 271: dest.flag |= 1; ! 272: return(dest); ! 273: case 111: ! 274: s = doit(p->in.left, 2, 0, regmask); ! 275: regmask &= ~s.regmask; ! 276: t = doit(p->in.right, 2, 0, regmask); ! 277: if(t.flag & 1024) { ! 278: totemp(p, 0); ! 279: longjmp(back, 1); ! 280: } ! 281: pr("#\tcmp%c\t%s,%s\n", childtype(p), bufs[s.ans], bufs[t.ans]); ! 282: dest.ans = dest.regmask = 0; ! 283: dest.flag = 1; ! 284: return(dest); ! 285: case 59: ! 286: if(p->in.left->in.op == 108) { ! 287: if(dest.ans == 0) { ! 288: dest = allocreg(p, regmask); ! 289: } ! 290: (void) doit(p->in.left, 2, dest, regmask); ! 291: } ! 292: else ! 293: (void) doit(p->in.left, 0, 0, regmask); ! 294: s = doit(p->in.right, 2, dest, regmask); ! 295: if(flag & 8) { ! 296: dest.ans = 0; ! 297: i = (s.flag & (128|512|16)); ! 298: j = s.regmask; ! 299: buf = bufs[s.ans]; ! 300: goto convbuf; ! 301: } ! 302: return(s); ! 303: case 77: ! 304: s = doit(p->in.left, 2, 0, regmask); ! 305: if(dest.ans == 0) ! 306: if(s.flag & 16) ! 307: dest = s; ! 308: else ! 309: dest = allocreg(p, regmask & ~s.regmask); ! 310: pr("#\tmcom%c\t%s,%s\n", childtype(p), bufs[s.ans], bufs[dest.ans]); ! 311: dest.flag |= 1; ! 312: return(dest); ! 313: case 104: ! 314: if(p->in.left->in.op == 58 && p->in.left->in.left->in.op == (2+ 11)) { ! 315: if(dest.ans == 0) { ! 316: dest = allocreg(p, regmask); ! 317: s = doit(p->in.left, 2, dest, regmask); ! 318: } ! 319: else { ! 320: x = allocreg(p, regmask); ! 321: s = doit(p->in.left, 2, x, regmask & ~x.regmask); ! 322: } ! 323: } ! 324: else ! 325: s = doit(p->in.left, 2, 0, regmask); ! 326: regmask &= ~s.regmask; ! 327: if(childtype(p) == type(p)) ! 328: return(s); ! 329: if(dest.ans == 0) ! 330: if(s.flag & 16) ! 331: dest = s; ! 332: else ! 333: dest = allocreg(p, regmask); ! 334: if(isunsigned(p->in.left) && incrsize(p) > incrsize(p->in.left) ! 335: && type(p) != 'f' && type(p) != 'd') ! 336: pp = "movz"; ! 337: else ! 338: pp = "cvt"; ! 339: pr("#\t%s%c%c\t%s,%s\n", pp, childtype(p), type(p), bufs[s.ans], bufs[dest.ans]); ! 340: dest.flag |= 1; ! 341: return(dest); ! 342: case 79: ! 343: i = -1; ! 344: pp = "sub"; ! 345: incrop: ! 346: if(p->in.right->in.op != 4) ! 347: fflush((&_iob[1])), cerror("codegen! incrop not with ICON"); ! 348: s = doit(p->in.left, 0, 0, regmask); ! 349: t = doit(p->in.right, 0, 0, 0); ! 350: if(flag & 2) { ! 351: if(dest.ans == 0) ! 352: dest = allocreg(p, regmask & ~s.regmask); ! 353: pr("#\tmov%c\t%s,%s\n", childtype(p), bufs[s.ans], bufs[dest.ans]); ! 354: if(t.flag & 64) { ! 355: if(i == 1) ! 356: pp = "inc"; ! 357: else ! 358: pp = "dec"; ! 359: pr("#\t%s%c\t%s\n", pp, childtype(p), bufs[s.ans]); ! 360: } ! 361: else ! 362: pr("#\t%s%c2\t%s,%s\n", pp, childtype(p), ! 363: bufs[t.ans], bufs[s.ans]); ! 364: if(flag & 8) { ! 365: s = dest; ! 366: goto inreg; ! 367: } ! 368: dest.flag &= ~1; ! 369: return(dest); ! 370: } ! 371: if(t.flag & 64) { ! 372: if(i == 1) ! 373: pp = "inc"; ! 374: else ! 375: pp = "dec"; ! 376: pr("#\t%s%c\t%s\n", pp, childtype(p), bufs[s.ans]); ! 377: } ! 378: else ! 379: pr("#\t%s%c2\t%s,%s\n", pp, childtype(p), bufs[t.ans], bufs[s.ans]); ! 380: if(dest.ans) { ! 381: x = s; ! 382: goto movexdest; ! 383: } ! 384: s.flag |= 1; ! 385: return(s); ! 386: case 1+ 60: ! 387: flag |= 256; ! 388: case 60: ! 389: ! 390: if(!isunsigned(p->in.left)) { ! 391: if(p->in.left->in.op == 104 && type(p) == childtype(p->in.left)) { ! 392: p->in.left = p->in.left->in.left; ! 393: } ! 394: if(p->in.right->in.op == 104 && type(p) == childtype(p->in.right)) { ! 395: p->in.right = p->in.right->in.left; ! 396: } ! 397: pp = "div"; ! 398: goto binop; ! 399: } ! 400: pp = "udiv"; ! 401: unsdiv: ! 402: if(incrsize(p->in.right) != 4) { ! 403: snode.in.op = 104; ! 404: snode.in.left = p->in.right; ! 405: snode.in.type = 01000; ! 406: s = doit(&snode, 2|4, tostack(), regmask); ! 407: } ! 408: else ! 409: s = doit(p->in.right, 4, tostack(), regmask); ! 410: regmask &= ~s.regmask; ! 411: if(incrsize(p->in.left) != 4) { ! 412: snode.in.op = 104; ! 413: snode.in.left = p->in.left; ! 414: snode.in.type = 01000; ! 415: t = doit(&snode, 2|4, tostack(), regmask); ! 416: } ! 417: else ! 418: t = doit(p->in.left, 4, tostack(), regmask); ! 419: if(t.flag & 1024) { ! 420: totemp(p, 1); ! 421: longjmp(back, 1); ! 422: } ! 423: i = 2; ! 424: goto aftercall; ! 425: case 1+ 19: ! 426: flag |= 256; ! 427: case 19: ! 428: pp = "xor"; ! 429: binop: ! 430: t = doit(p->in.left, 2, 0, regmask); ! 431: regmask &= ~t.regmask; ! 432: s = doit(p->in.right, 2, 0, regmask); ! 433: if(s.flag & 1024) { ! 434: totemp(p, 0); ! 435: longjmp(back, 1); ! 436: } ! 437: regmask &= ~s.regmask; ! 438: if(type(p) != childtype(p)) { ! 439: x = allocreg(p, regmask); ! 440: pr("#\t%s%c3\t%s,%s,%s\n", pp, childtype(p), bufs[s.ans], ! 441: bufs[t.ans], bufs[x.ans]); ! 442: if(dest.ans == 0) ! 443: dest = x; ! 444: pr("#\tcvt%c%c\t%s,%s\n", childtype(p), type(p), ! 445: bufs[x.ans], bufs[dest.ans]); ! 446: dest.flag |= 1; ! 447: return(dest); ! 448: } ! 449: if(dest.ans == 0) ! 450: if((t.flag & 16) || (flag & 256)) { ! 451: twoop: ! 452: dest = t; ! 453: if(*pp == 'a' && (s.flag & 64)) ! 454: pr("#\tinc%c\t%s\n", childtype(p), bufs[t.ans]); ! 455: else if(*pp == 's' && (s.flag & 64)) ! 456: pr("#\tdec%c\t%s\n", childtype(p), bufs[t.ans]); ! 457: else ! 458: pr("#\t%s%c2\t%s,%s\n", pp, childtype(p), ! 459: bufs[s.ans], bufs[t.ans]); ! 460: if(flag & 8) ! 461: goto binopaddr; ! 462: dest.flag |= 1; ! 463: return(dest); ! 464: } ! 465: else if(s.flag & 16) ! 466: dest = s; ! 467: else ! 468: dest = allocreg(p, regmask); ! 469: if((*pp == 'a' || *pp == 'm' || *pp == 'x' || *pp == 'b') ! 470: && strcmp( bufs[s.ans], bufs[dest.ans]) == 0) { ! 471: dest = s; ! 472: s = t; ! 473: t = dest; ! 474: goto twoop; ! 475: } ! 476: pr("#\t%s%c3\t%s,%s,%s\n", pp, childtype(p), bufs[s.ans], bufs[t.ans], bufs[dest.ans]); ! 477: binopaddr: ! 478: if(flag & 8) { ! 479: if(dest.flag & 128) { ! 480: strcat( bufs[dest.ans], ")"); ! 481: strshift( bufs[dest.ans], 1); ! 482: bufs[dest.ans][0] = '('; ! 483: return(dest); ! 484: } ! 485: if(dest.flag & 512) { ! 486: strshift( bufs[dest.ans], 1); ! 487: bufs[dest.ans][0] = '*'; ! 488: dest.flag &= ~512; ! 489: return(dest); ! 490: } ! 491: dest.flag = 1024; ! 492: return(dest); ! 493: } ! 494: dest.flag |= 1; ! 495: return(dest); ! 496: case 103: ! 497: ! 498: s = doit(p->in.left, 0, 0, regmask); ! 499: if(dest.ans == 0) ! 500: dest = allocreg(p, regmask & ~s.regmask); ! 501: pr("#\text%sv\t$%d,$%d,%s,%s\n", isunsigned(p->in.left)? "z": "", ! 502: p->tn.rval/64, p->tn.rval%64, bufs[s.ans], bufs[dest.ans]); ! 503: dest.flag |= 1; ! 504: return(dest); ! 505: case 110: ! 506: s = doit(p->in.left, 1|2, 0, regmask); ! 507: pp = genjmp(p->bn.lop); ! 508: if(s.flag & 1) ! 509: pr("#\t%s\tL%d\n", pp, p->bn.label); ! 510: else ! 511: pr("#\ttst%c\t%s\n#\t%s\tL%d\n", childtype(p), bufs[s.ans], ! 512: pp, p->bn.label); ! 513: s.flag |= 1; ! 514: return(s); ! 515: case 108: ! 516: s = doit(p->in.left, flag, dest, regmask); ! 517: pr("#L%d:\n", p->bn.label); ! 518: return(s); ! 519: case 112: ! 520: (void) doit(p->in.left, 0, dest, regmask); ! 521: pr("#\tjbr\tL%d\n", p->bn.label); ! 522: s.ans = s.regmask = s.flag = 0; ! 523: return(s); ! 524: case 4: ! 525: if(p->tn.name) ! 526: if(p->tn.lval) ! 527: sprintf(buf, "%s+%d", p->tn.name, p->tn.lval); ! 528: else ! 529: sprintf(buf, "%s", p->tn.name); ! 530: else ! 531: sprintf(buf, "%d", p->tn.lval); ! 532: if(!(flag & 8)) { ! 533: strshift(buf, 1);; ! 534: buf[0] = '$'; ! 535: } ! 536: i = 0; ! 537: if(p->tn.name == 0) ! 538: if(p->tn.lval == 0) ! 539: i = 32; ! 540: else if(p->tn.lval == 1) ! 541: i = 64; ! 542: j = 0; ! 543: convbuf: ! 544: if(dest.ans == 0) { ! 545: if(p->in.op == 4 || !(flag & 8)) { ! 546: s.ans = (buf - bufs[0])/64; buf += 64; s.flag = i; s.regmask = j; return(s); ! 547: } ! 548: if(i & 512) { ! 549: strshift(buf, 1); ! 550: buf[0] = '*'; ! 551: s.ans = (buf - bufs[0])/64; buf += 64; s.flag = i & ~512; s.regmask = j; return(s); ! 552: } ! 553: if(i & 128) { ! 554: strcat(buf, ")"); ! 555: strshift(buf, 1); ! 556: buf[0] = '('; ! 557: s.ans = (buf - bufs[0])/64; buf += 64; s.flag = i; s.regmask = j; return(s); ! 558: } ! 559: pp = buf; ! 560: buf += 64; ! 561: s = allocreg(p, regmask); ! 562: pr("#\tmov%c\t%s,%s\n", type(p), pp, bufs[s.ans]); ! 563: flag &= ~8; ! 564: goto inreg; ! 565: } ! 566: if(flag & 4) ! 567: if(p->in.type != 040) ! 568: pr("#\tpushl\t%s\n", buf); ! 569: else ! 570: pr("#\tmovd\t%s,%s\n", buf, bufs[dest.ans]); ! 571: else if(i & 32) ! 572: pr("#\tclr%c\t%s\n", type(p), bufs[dest.ans]); ! 573: else ! 574: pr("#\tmov%c\t%s,%s\n", type(p), buf, bufs[dest.ans]); ! 575: dest.flag |= 1; ! 576: return(dest); ! 577: case 78: ! 578: i = 1; ! 579: pp = "add"; ! 580: goto incrop; ! 581: case 113: ! 582: s = doit(p->in.left, 8, 0, 0); ! 583: pr("#\t.long\t%s\n", bufs[s.ans]); ! 584: return(dest); ! 585: case 1+ 64: ! 586: flag |= 256; ! 587: case 64: ! 588: s = doit(p->in.left, 2, 0, regmask); ! 589: regmask &= ~s.flag; ! 590: t = doit(p->in.right, 2, 0, regmask); ! 591: if(t.flag & 1024) { ! 592: totemp(p, 0); ! 593: longjmp(back, 1); ! 594: } ! 595: regmask &= ~t.regmask; ! 596: if(dest.ans == 0) ! 597: if((s.flag & 16) || (flag & 256)) ! 598: dest = s; ! 599: else ! 600: dest = allocreg(p, regmask); ! 601: pr("#\tashl\t%s,%s,%s\n", bufs[t.ans], bufs[s.ans], bufs[dest.ans]); ! 602: dest.flag |= 1; ! 603: return(dest); ! 604: case 1+ 8: ! 605: if(p->in.right->in.op == 4) { ! 606: i = -1; ! 607: pp = "sub"; ! 608: flag &= ~2; ! 609: goto incrop; ! 610: } ! 611: flag |= 256; ! 612: case 8: ! 613: pp = "sub"; ! 614: goto binop; ! 615: case 1+ 62: ! 616: flag |= 256; ! 617: if(p->in.left->in.op == 104 && !isunsigned(p)) { ! 618: snode = *p; ! 619: snode.in.left = p->in.left->in.left; ! 620: p = &snode; ! 621: } ! 622: case 62: ! 623: if(isunsigned(p)) { ! 624: pp = "urem"; ! 625: goto unsdiv; ! 626: } ! 627: s = doit(p->in.left, 2, 0, regmask); ! 628: regmask &= ~s.regmask; ! 629: t = doit(p->in.right, 2, 0, regmask); ! 630: regmask &= ~t.regmask; ! 631: x = allocreg(p, regmask); ! 632: pr("#\tdiv%c3\t%s,%s,%s\n", childtype(p), bufs[t.ans], bufs[s.ans], bufs[x.ans]); ! 633: pr("#\tmul%c2\t%s,%s\n", childtype(p), bufs[t.ans], bufs[x.ans]); ! 634: pr("#\tsub%c3\t%s,%s,%s\n", childtype(p), bufs[x.ans], bufs[s.ans], bufs[x.ans]); ! 635: if(dest.ans) ! 636: goto movexdest; ! 637: if(flag & 256) { ! 638: dest = s; ! 639: goto movexdest; ! 640: } ! 641: x.flag |= 1; ! 642: return(x); ! 643: case 1+ 11: ! 644: flag |= 256; ! 645: case 11: ! 646: pp = "mul"; ! 647: goto binop; ! 648: case 2: ! 649: if(p->tn.lval) ! 650: sprintf(buf, "%s+%d", p->tn.name, p->tn.lval); ! 651: else if(p->tn.name) ! 652: sprintf(buf, "%s", p->tn.name); ! 653: else ! 654: sprintf(buf, "0"); ! 655: j = 0; ! 656: i = 512; ! 657: goto convbuf; ! 658: case 1+ 17: ! 659: flag |= 256; ! 660: case 17: ! 661: pp = "bis"; ! 662: goto binop; ! 663: case 1+ 6: ! 664: if(p->in.right->in.op == 4) { ! 665: i = 1; ! 666: pp = "add"; ! 667: flag &= ~2; ! 668: goto incrop; ! 669: } ! 670: flag |= 256; ! 671: case 6: ! 672: pp = "add"; ! 673: goto binop; ! 674: case 94: ! 675: sprintf(buf, "r%d", p->tn.rval); ! 676: j = 0; ! 677: i = 128; ! 678: goto convbuf; ! 679: case 118: case 119: ! 680: x = reg0(p, 3); ! 681: x.regmask = 0; ! 682: if(dest.ans) ! 683: goto movexdest; ! 684: return(x); ! 685: case 120: ! 686: return(reg0(p, regmask)); ! 687: case 1+ 66: ! 688: flag |= 256; ! 689: case 66: ! 690: s = doit(p->in.left, 2, 0, regmask); ! 691: regmask &= ~s.regmask; ! 692: if(dest.ans == 0) ! 693: if((flag & 256) || (s.flag & 16)) ! 694: dest = s; ! 695: else ! 696: dest = allocreg(p, regmask); ! 697: dest.flag |= 1; ! 698: regmask &= ~dest.regmask; ! 699: if(p->in.right->in.op == 4 && (i = p->in.right->tn.lval) >= 0) { ! 700: pr("#\textv\t$%d,$%d,%s,%s\n", i, 32 - i, bufs[s.ans], bufs[dest.ans]); ! 701: return(dest); ! 702: } ! 703: t = doit(p->in.right, 2, 0, regmask); ! 704: regmask &= ~t.regmask; ! 705: x = allocreg(p, regmask); ! 706: pr("#\tmnegl\t%s,%s\n", bufs[t.ans], bufs[x.ans]); ! 707: pr("#\tashl\t%s,%s,%s\n", bufs[x.ans], bufs[s.ans], bufs[dest.ans]); ! 708: return(dest); ! 709: case (2+ 11): ! 710: switch(p->in.left->in.op) { ! 711: case 116: ! 712: case 117: ! 713: case 2: ! 714: s = doit(p->in.left, 2, 0, regmask); ! 715: sprintf(buf, "*%s", bufs[s.ans]); ! 716: j = i = 0; ! 717: goto convbuf; ! 718: case 94: ! 719: s = doit(p->in.left, 2, 0, regmask); ! 720: inreg: ! 721: if(s.flag & 128) { ! 722: sprintf(buf, "(%s)", bufs[s.ans]); ! 723: j = 0; ! 724: i = 512; ! 725: goto convbuf; ! 726: } ! 727: else if(s.flag & 512) { ! 728: sprintf(buf, "*%s", bufs[s.ans]); ! 729: j = 0; ! 730: i = 0; ! 731: goto convbuf; ! 732: } ! 733: else { ! 734: s.flag = 1024; ! 735: return(s); ! 736: } ! 737: } ! 738: q = p->in.left; ! 739: if(q->in.op == 78 ! 740: && q->in.right->in.op == 4 && q->in.left->in.op == 94 ! 741: && incrsize(p) == (int) q->in.right->tn.lval) { ! 742: s = doit(q->in.left, 2, 0, regmask); ! 743: sprintf(buf, "(%s)+", bufs[s.ans]); ! 744: i = 0; ! 745: j = s.regmask; ! 746: goto convbuf; ! 747: } ! 748: if(q->in.op == 6 && q->in.left->in.op == 64 ! 749: && q->in.left->in.right->in.op == 4 ! 750: && shiftsize(p) == (int) q->in.left->in.right->tn.lval) { ! 751: s = doit(q->in.left->in.left, 2, 0, regmask); ! 752: regmask &= ~s.regmask; ! 753: if(!(s.flag & 128)) { ! 754: x = allocreg(p, regmask); ! 755: pr("#\tmov%c\t%s,%s\n", childtype(q), bufs[s.ans], bufs[x.ans]); ! 756: regmask |= s.regmask; ! 757: regmask &= ~x.regmask; ! 758: s = x; ! 759: } ! 760: t = doit(q->in.right, 8, 0, regmask); ! 761: sprintf(buf, "%s[%s]", bufs[t.ans], bufs[s.ans]); ! 762: i = 0; ! 763: j = s.regmask; ! 764: goto convbuf; ! 765: } ! 766: if(q->in.op == 6 ! 767: && (q->in.right->in.op == 4 || q->in.right->in.op == 2)) { ! 768: s = doit(q->in.left, 2, 0, regmask); ! 769: regmask &= ~s.regmask; ! 770: if(!(s.flag & 128)) { ! 771: x = allocreg(p, regmask); ! 772: pr("#\tmov%c\t%s,%s\n", childtype(q), bufs[s.ans], bufs[x.ans]); ! 773: regmask |= s.regmask; ! 774: regmask &= ~x.regmask; ! 775: s = x; ! 776: } ! 777: t = doit(q->in.right, 8, 0, regmask); ! 778: sprintf(buf, "%s(%s)", bufs[t.ans], bufs[s.ans]); ! 779: i = 512; ! 780: j = s.regmask; ! 781: goto convbuf; ! 782: } ! 783: if(q->in.op == 8 && q->in.right->in.op == 4) { ! 784: s = doit(q->in.left, 2, 0, regmask); ! 785: regmask &= ~s.regmask; ! 786: if(!(s.flag & 128)) { ! 787: x = allocreg(p, regmask); ! 788: pr("#\tmov%c\t%s,%s\n", childtype(q), bufs[s.ans], bufs[x.ans]); ! 789: regmask |= s.regmask; ! 790: regmask &= ~x.regmask; ! 791: s = x; ! 792: if(!(s.flag & 128)) { ! 793: s.flag = 1024; ! 794: return(s); ! 795: } ! 796: } ! 797: sprintf(buf, "%d(%s)", -q->in.right->tn.lval, bufs[s.ans]); ! 798: i = 512; ! 799: j = s.regmask; ! 800: goto convbuf; ! 801: } ! 802: if(q->in.op == 1+ 8 ! 803: && q->in.right->in.op == 4 && q->in.left->in.op == 94 ! 804: && incrsize(p) == (int) q->in.right->tn.lval) { ! 805: s = doit(q->in.left, 2, 0, regmask); ! 806: sprintf(buf, "-(%s)", bufs[s.ans]); ! 807: i = 0; ! 808: j = s.regmask; ! 809: goto convbuf; ! 810: } ! 811: if(q->in.op == 6 && q->in.left->in.op == 94 ! 812: && q->in.right->in.op == 94) { ! 813: sprintf(buf, "(r%d)[r%d]", q->in.right->tn.rval, ! 814: q->in.left->tn.rval); ! 815: i = 0; ! 816: j = 0; ! 817: goto convbuf; ! 818: } ! 819: s = doit(p->in.left, 2, 0, regmask); ! 820: if(s.flag & 1024) ! 821: return(s); ! 822: regmask &= ~s.regmask; ! 823: if(s.flag & 512) { ! 824: sprintf(buf, "*%s", bufs[s.ans]); ! 825: i = 0; ! 826: j = s.regmask; ! 827: goto convbuf; ! 828: } ! 829: if(!(s.flag & 128)) { ! 830: x = allocreg(p, regmask); ! 831: pr("#\tmov%c\t%s,%s\n", childtype(q), bufs[s.ans], bufs[x.ans]); ! 832: regmask |= s.regmask; ! 833: regmask &= ~x.regmask; ! 834: s = x; ! 835: } ! 836: if(!(s.flag & 128)) { ! 837: s.flag = 1024; ! 838: return(s); ! 839: } ! 840: sprintf(buf, "(%s)", bufs[s.ans]); ! 841: i = 0; ! 842: j = s.regmask; ! 843: goto convbuf; ! 844: case 98: ! 845: if(p->stn.stsize/8 == 4) { ! 846: i = 'l'; ! 847: stasg: ! 848: s = doit(p->in.right, 2|8, 0, regmask); ! 849: regmask &= ~s.regmask; ! 850: t = doit(p->in.left, 2|8, 0, regmask); ! 851: pr("#\tmov%c\t%s,%s\n", i, bufs[s.ans], bufs[t.ans]); ! 852: s.regmask = s.flag = 0; ! 853: return(s); ! 854: } ! 855: else if(p->stn.stsize/8 == 8) { ! 856: i = 'q'; ! 857: goto stasg; ! 858: } ! 859: if(regmask != 0x3f) { ! 860: s.flag = 1024; ! 861: return(s); ! 862: } ! 863: s = doit(p->in.right, 2|8, 0, regmask); ! 864: regmask &= ~s.regmask; ! 865: t = doit(p->in.left, 2|8, 0, regmask); ! 866: pr("#\tmovc3\t$%d,%s,%s\n", p->stn.stsize/8, bufs[s.ans], bufs[t.ans]); ! 867: s.regmask = s.flag = 0; ! 868: return(s); ! 869: case 100: ! 870: goto call; ! 871: case 116: ! 872: sprintf(buf, "%d(fp)", p->tn.lval); ! 873: j = 0; ! 874: i = 512; ! 875: goto convbuf; ! 876: case 117: ! 877: sprintf(buf, "%d(ap)", p->tn.lval); ! 878: j = 0; ! 879: i = 512; ! 880: goto convbuf; ! 881: case 2+ 14: ! 882: s = doit(p->in.left, 0, 0, regmask); ! 883: regmask &= ~s.regmask; ! 884: if(dest.ans == 0) { ! 885: dest = allocreg(p, regmask); ! 886: } ! 887: if(flag & 4) ! 888: pr("#\tpushal\t%s\n", bufs[s.ans]); ! 889: else { ! 890: pr("#\tmova%c\t%s,%s\n", childtype(p), bufs[s.ans], bufs[dest.ans]); ! 891: } ! 892: if(flag & 8) { ! 893: if(dest.flag & 128) { ! 894: strcat( bufs[dest.ans], ")"); ! 895: strshift( bufs[dest.ans], 1); ! 896: bufs[dest.ans][0] = '('; ! 897: } ! 898: else { ! 899: strshift( bufs[dest.ans], 1); ! 900: bufs[dest.ans][0] = '*'; ! 901: } ! 902: } ! 903: return(dest); ! 904: case 2+ 70: ! 905: i = 0; ! 906: goto called; ! 907: case 2+ 8: ! 908: s = doit(p->in.left, 2, 0, regmask); ! 909: if(dest.ans == 0) ! 910: if(s.flag & 16) ! 911: dest = s; ! 912: else ! 913: dest = allocreg(p, regmask & ~s.regmask); ! 914: pr("#\tmneg%c\t%s,%s\n", childtype(p), bufs[s.ans], bufs[dest.ans]); ! 915: dest.flag |= 1; ! 916: return(dest); ! 917: case 2+ 100: ! 918: i = 0; ! 919: goto called; ! 920: case 58: ! 921: if(p->in.left->in.op == 120 && dest.ans) { ! 922: s = doit(p->in.right, 2, dest, regmask); ! 923: return(s); ! 924: } ! 925: if(p->in.left->in.op == 103) { ! 926: s = doit(p->in.left->in.left, 0, 0, regmask); ! 927: regmask &= ~s.regmask; ! 928: if(p->in.right->in.op == 58) { ! 929: x = allocreg(p->in.right, regmask); ! 930: t = doit(p->in.right, 2, x, regmask & ~x.regmask); ! 931: } ! 932: else ! 933: t = doit(p->in.right, 2, 0, regmask); ! 934: if(t.flag & 1024) { ! 935: totemp(p->in.left, 0); ! 936: longjmp(back, 1); ! 937: } ! 938: pr("#\tinsv\t%s,$%d,$%d,%s\n", bufs[t.ans], p->in.left->tn.rval/64, ! 939: p->in.left->tn.rval % 64, bufs[s.ans]); ! 940: t.flag |= 1; ! 941: return(t); ! 942: } ! 943: if(dest.ans && p->in.left->in.op == (2+ 11)) { ! 944: if(dest.flag & 16) ! 945: x = dest; ! 946: else ! 947: x = allocreg(p, regmask); ! 948: s = doit(p->in.right, 2, x, regmask); ! 949: regmask &= ~s.regmask; ! 950: assignit: ! 951: t = doit(p->in.left, 0, 0, regmask); ! 952: pr("#\tmov%c\t%s,%s\n", type(p), bufs[x.ans], bufs[t.ans]); ! 953: if(strcmp( bufs[x.ans], bufs[dest.ans]) == 0) { ! 954: dest.flag |= 1; ! 955: return(dest); ! 956: } ! 957: goto movexdest; ! 958: } ! 959: if(p->in.right->in.op == 119) ! 960: t = doit(p->in.left, 0, 0, regmask & ~3); ! 961: else ! 962: t = doit(p->in.left, 0, 0, regmask); ! 963: regmask &= ~t.regmask; ! 964: s = doit(p->in.right, 2, t, regmask); ! 965: if(s.flag & 1024) { ! 966: ! 967: if(dest.ans) { ! 968: regmask |= t.regmask; ! 969: s = doit(p->in.right, 2, t, regmask); ! 970: if(s.flag & 1024) ! 971: return(s); ! 972: } ! 973: asgwrite(p); ! 974: longjmp(back, 1); ! 975: } ! 976: if(dest.ans) { ! 977: x = s; ! 978: goto movexdest; ! 979: } ! 980: else if(flag & 8) { ! 981: i = (s.flag & (128|512|16)); ! 982: j = s.regmask; ! 983: buf = bufs[s.ans]; ! 984: goto convbuf; ! 985: } ! 986: s.flag |= 1; ! 987: return(s); ! 988: } ! 989: } ! 990: char * ! 991: genjmp(n) ! 992: { ! 993: switch(n) { ! 994: default: ! 995: return("jweird"); ! 996: case 80: ! 997: return("jeql"); ! 998: case 81: ! 999: return("jneq"); ! 1000: case 85: ! 1001: return("jgtr"); ! 1002: case 84: ! 1003: return("jgeq"); ! 1004: case 83: ! 1005: return("jlss"); ! 1006: case 82: ! 1007: return("jleq"); ! 1008: case 89: ! 1009: return("jgtru"); ! 1010: case 88: ! 1011: return("jgequ"); ! 1012: case 87: ! 1013: return("jlssu"); ! 1014: case 86: ! 1015: return("jlequ"); ! 1016: } ! 1017: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.