|
|
1.1 ! root 1: #include "defs.h" ! 2: ! 3: #ifdef SDB ! 4: # include <a.out.h> ! 5: extern int types2[]; ! 6: # ifndef N_SO ! 7: # include <stab.h> ! 8: # endif ! 9: #endif ! 10: ! 11: #include "pcc.h" ! 12: ! 13: /* ! 14: TAHOE - SPECIFIC ROUTINES ! 15: */ ! 16: ! 17: int maxregvar = MAXREGVAR; ! 18: int regnum[] = { 10, 9, 8, 7, 6 } ; ! 19: ! 20: ftnint intcon[14] = ! 21: { 2, 2, 2, 2, ! 22: 15, 31, 24, 56, ! 23: -128, -128, 127, 127, ! 24: 0x7FFF, 0x7FFFFFFF }; ! 25: ! 26: #if HERE == VAX || HERE == TAHOE ! 27: /* then put in constants in hex */ ! 28: short realcon[6][4] = ! 29: { ! 30: { 0x80, 0, 0, 0 }, ! 31: { 0x80, 0, 0, 0 }, ! 32: { 0x7FFF, 0xFFFF, 0, 0 }, ! 33: { 0x7FFF, 0xFFFF, 0xFFFF, 0xFFFF }, ! 34: { 0x3480, 0, 0, 0 }, ! 35: { 0x2480, 0, 0, 0 }, ! 36: }; ! 37: #else ! 38: double realcon[6] = ! 39: { ! 40: 2.9387358771e-39, /* 2 ** -128 */ ! 41: 2.938735877055718800e-39, /* 2 ** -128 */ ! 42: 1.7014117332e+38, /* 2**127 * (1 - 2**-24) */ ! 43: 1.701411834604692250e+38, /* 2**127 * (1 - 2**-56) */ ! 44: 5.960464e-8, /* 2 ** -24 */ ! 45: 1.38777878078144567e-17, /* 2 ** -56 */ ! 46: }; ! 47: #endif ! 48: ! 49: /* ! 50: * The VAX assembler has a serious and not easily fixable problem ! 51: * with generating instructions that contain expressions of the form ! 52: * label1-label2 where there are .align's in-between the labels. ! 53: * Therefore, the compiler must keep track of the offsets and output ! 54: * .space where needed. ! 55: */ ! 56: LOCAL int i_offset; /* initfile offset */ ! 57: LOCAL int a_offset; /* asmfile offset */ ! 58: ! 59: prsave(proflab) ! 60: int proflab; ! 61: { ! 62: if(profileflag) ! 63: { ! 64: fprintf(asmfile, "\t.align\t2\n"); ! 65: fprintf(asmfile, "L%d:\t.long\t0\n", proflab); ! 66: p2pi("\tpushl\t$L%d", proflab); ! 67: p2pass("\tcallf\t$8,mcount"); ! 68: } ! 69: p2pi("\tsubl3\t$LF%d,fp,sp", procno); ! 70: } ! 71: ! 72: goret(type) ! 73: int type; ! 74: { ! 75: register int r = 0; ! 76: switch(type) { /* from retval */ ! 77: case TYDREAL: ! 78: r++; ! 79: ! 80: case TYLOGICAL: ! 81: case TYADDR: ! 82: case TYSHORT: ! 83: case TYLONG: ! 84: case TYREAL: ! 85: r++; ! 86: ! 87: case TYCHAR: ! 88: case TYCOMPLEX: ! 89: case TYDCOMPLEX: ! 90: break; ! 91: case TYSUBR: ! 92: if (substars) r++; ! 93: break; ! 94: default: ! 95: badtype("goret", type); ! 96: } ! 97: p2pi("\tret#%d", r); ! 98: } ! 99: ! 100: /* ! 101: * move argument slot arg1 (relative to fp) ! 102: * to slot arg2 (relative to ARGREG) ! 103: */ ! 104: mvarg(type, arg1, arg2) ! 105: int type, arg1, arg2; ! 106: { ! 107: p2pij("\tmovl\t%d(fp),%d(fp)", arg1+ARGOFFSET, arg2+argloc); ! 108: } ! 109: ! 110: prlabel(fp, k) ! 111: FILEP fp; ! 112: int k; ! 113: { ! 114: fprintf(fp, "L%d:\n", k); ! 115: } ! 116: ! 117: prconi(fp, type, n) ! 118: FILEP fp; ! 119: int type; ! 120: ftnint n; ! 121: { ! 122: register int i; ! 123: ! 124: if(type == TYSHORT) ! 125: { ! 126: fprintf(fp, "\t.word\t%ld\n", n); ! 127: i = SZSHORT; ! 128: } ! 129: else ! 130: { ! 131: fprintf(fp, "\t.long\t%ld\n", n); ! 132: i = SZLONG; ! 133: } ! 134: if(fp == initfile) ! 135: i_offset += i; ! 136: else ! 137: a_offset += i; ! 138: } ! 139: ! 140: prcona(fp, a) ! 141: FILEP fp; ! 142: ftnint a; ! 143: { ! 144: fprintf(fp, "\t.long\tL%ld\n", a); ! 145: if(fp == initfile) ! 146: i_offset += SZLONG; ! 147: else ! 148: a_offset += SZLONG; ! 149: } ! 150: ! 151: prconr(fp, type, x) ! 152: FILEP fp; ! 153: int type; ! 154: double x; ! 155: { ! 156: /* ! 157: fprintf(fp, "\t%s\t0f%e\n", (type==TYREAL ? ".float" : ".double"), x); ! 158: */ ! 159: /* non-portable cheat to preserve bit patterns */ ! 160: /* this code should be the same for PDP, VAX and Tahoe */ ! 161: ! 162: register struct sh4 { ! 163: unsigned short sh[4]; ! 164: } *cheat; ! 165: register int i; ! 166: ! 167: cheat = (struct sh4 *)&x; ! 168: if(type == TYREAL) { /* force rounding */ ! 169: float f; ! 170: f = x; ! 171: x = f; ! 172: } ! 173: fprintf(fp, " .long 0x%04x%04x", cheat->sh[0], cheat->sh[1]); ! 174: if(type == TYDREAL) { ! 175: fprintf(fp, ", 0x%04x%04x", cheat->sh[2], cheat->sh[3]); ! 176: fprintf(fp, " # .double %.17g\n", x); ! 177: i = SZDOUBLE; ! 178: } ! 179: else ! 180: { ! 181: fprintf(fp, " # .float %.8g\n", x); ! 182: i = SZFLOAT; ! 183: } ! 184: if(fp == initfile) ! 185: i_offset += i; ! 186: else ! 187: a_offset += i; ! 188: } ! 189: ! 190: praddr(fp, stg, varno, offset) ! 191: FILE *fp; ! 192: int stg, varno; ! 193: ftnint offset; ! 194: { ! 195: char *memname(); ! 196: ! 197: if(stg == STGNULL) ! 198: fprintf(fp, "\t.long\t0\n"); ! 199: else ! 200: { ! 201: fprintf(fp, "\t.long\t%s", memname(stg,varno)); ! 202: if(offset) ! 203: fprintf(fp, "+%ld", offset); ! 204: fprintf(fp, "\n"); ! 205: } ! 206: if(fp == initfile) ! 207: i_offset += SZADDR; ! 208: else ! 209: a_offset += SZADDR; ! 210: } ! 211: pralign(k) ! 212: int k; ! 213: { ! 214: register int lg; ! 215: ! 216: if (k > 4) ! 217: lg = 3; ! 218: else if (k > 2) ! 219: lg = 2; ! 220: else if (k > 1) ! 221: lg = 1; ! 222: else ! 223: return; ! 224: fprintf(initfile, "\t.align\t%d\n", lg); ! 225: i_offset += lg; ! 226: return; ! 227: } ! 228: ! 229: ! 230: ! 231: prspace(n) ! 232: int n; ! 233: { ! 234: ! 235: fprintf(initfile, "\t.space\t%d\n", n); ! 236: i_offset += n; ! 237: } ! 238: ! 239: ! 240: preven(k) ! 241: int k; ! 242: { ! 243: register int lg; ! 244: ! 245: if(k > 4) ! 246: lg = 3; ! 247: else if(k > 2) ! 248: lg = 2; ! 249: else if(k > 1) ! 250: lg = 1; ! 251: else ! 252: return; ! 253: fprintf(asmfile, "\t.align\t%d\n", lg); ! 254: a_offset += lg; ! 255: } ! 256: ! 257: praspace(n) ! 258: int n; ! 259: { ! 260: ! 261: fprintf(asmfile, "\t.space\t%d\n", n); ! 262: a_offset += n; ! 263: } ! 264: ! 265: ! 266: casegoto(index, nlab, labs) ! 267: expptr index; ! 268: register int nlab; ! 269: struct Labelblock *labs[]; ! 270: { ! 271: register int i; ! 272: register int arrlab; ! 273: ! 274: putforce(TYINT, index); ! 275: p2pi("\tcasel\tr0,$1,$%d\n\t.align 1", nlab-1); ! 276: p2pi("L%d:", arrlab = newlabel() ); ! 277: for(i = 0; i< nlab ; ++i) ! 278: if( labs[i] ) ! 279: p2pij("\t.word\tL%d-L%d", labs[i]->labelno, arrlab); ! 280: } ! 281: ! 282: ! 283: prarif(p, neg, zer, pos) ! 284: expptr p; ! 285: int neg, zer, pos; ! 286: { ! 287: putforce(p->headblock.vtype, p); ! 288: p2pass("\ttstl\tr0"); ! 289: p2pi("\tjlss\tL%d", neg); ! 290: p2pi("\tjeql\tL%d", zer); ! 291: p2pi("\tjbr\tL%d", pos); ! 292: } ! 293: ! 294: char *memname(stg, mem) ! 295: int stg, mem; ! 296: { ! 297: static char s[20]; ! 298: ! 299: switch(stg) ! 300: { ! 301: case STGEXT: ! 302: case STGINTR: ! 303: if(extsymtab[mem].extname[0] == '@') { /* function opcodes */ ! 304: strcpy(s, varstr(XL, extsymtab[mem].extname)); ! 305: break; ! 306: } ! 307: case STGCOMMON: ! 308: sprintf(s, "_%s", varstr(XL, extsymtab[mem].extname) ); ! 309: break; ! 310: ! 311: case STGBSS: ! 312: case STGINIT: ! 313: sprintf(s, "v.%d", mem); ! 314: break; ! 315: ! 316: case STGCONST: ! 317: sprintf(s, "L%d", mem); ! 318: break; ! 319: ! 320: case STGEQUIV: ! 321: sprintf(s, "q.%d", mem+eqvstart); ! 322: break; ! 323: ! 324: default: ! 325: badstg("memname", stg); ! 326: } ! 327: return(s); ! 328: } ! 329: ! 330: prlocvar(s, len) ! 331: char *s; ! 332: ftnint len; ! 333: { ! 334: int sz; ! 335: sz = len; ! 336: if (sz % SZINT) ! 337: sz += SZINT - (sz % SZINT); ! 338: fprintf(asmfile, "\t.lcomm\t%s,%ld\n", s, sz); ! 339: } ! 340: ! 341: char * ! 342: packbytes(cp) ! 343: register Constp cp; ! 344: { ! 345: #if HERE == VAX ! 346: static char shrt[16]; ! 347: static char lng[4]; ! 348: #endif ! 349: ! 350: switch (cp->vtype) ! 351: { ! 352: #if HERE == TAHOE ! 353: case TYSHORT: ! 354: { static short shrt; ! 355: shrt = cp->const.ci; ! 356: return ((char *)&shrt); ! 357: } ! 358: case TYLONG: ! 359: case TYLOGICAL: ! 360: case TYREAL: ! 361: case TYDREAL: ! 362: case TYDCOMPLEX: ! 363: return ((char *)&cp->const); ! 364: case TYCOMPLEX: ! 365: { static float quad[2]; ! 366: quad[0] = cp->const.cd[0]; ! 367: quad[1] = cp->const.cd[1]; ! 368: return ((char *)quad); ! 369: } ! 370: #endif ! 371: ! 372: #if HERE == VAX ! 373: case TYLONG: ! 374: case TYLOGICAL: ! 375: swab4((char *)&cp->const.ci, lng, 4); ! 376: return (lng); ! 377: ! 378: case TYSHORT: ! 379: case TYREAL: ! 380: case TYDREAL: ! 381: case TYDCOMPLEX: ! 382: swab((char *)cp->const.cd, shrt, typesize[cp->vtype]); ! 383: return (shrt); ! 384: case TYCOMPLEX: ! 385: swab((char *)cp->const.cd, shrt, 4); ! 386: swab((char *)&(cp->const.cd[1]), &shrt[4], 4); ! 387: return (shrt); ! 388: #endif ! 389: ! 390: default: ! 391: badtype("packbytes", cp->vtype); ! 392: } ! 393: } ! 394: ! 395: #if HERE == VAX ! 396: /* correct the byte order in longs */ ! 397: LOCAL swab4(from, to, n) ! 398: register char *to, *from; ! 399: register int n; ! 400: { ! 401: while(n >= 4) { ! 402: *to++ = from[3]; ! 403: *to++ = from[2]; ! 404: *to++ = from[1]; ! 405: *to++ = from[0]; ! 406: from += 4; ! 407: n -= 4; ! 408: } ! 409: while(n >= 2) { ! 410: *to++ = from[1]; ! 411: *to++ = from[0]; ! 412: from += 2; ! 413: n -= 2; ! 414: } ! 415: if(n > 0) ! 416: *to = *from; ! 417: } ! 418: #endif ! 419: ! 420: prsdata(s, len) ! 421: register char *s; /* must be aligned if HERE==TAHOE */ ! 422: register int len; ! 423: { ! 424: static char longfmt[] = "\t.long\t0x%x\n"; ! 425: static char wordfmt[] = "\t.word\t0x%x\n"; ! 426: static char bytefmt[] = "\t.byte\t0x%x\n"; ! 427: ! 428: register int i; ! 429: #if HERE == VAX ! 430: char quad[8]; ! 431: swab4(s, quad, len); ! 432: s = quad; ! 433: #endif ! 434: ! 435: i = 0; ! 436: if ((len - i) >= 4) ! 437: { ! 438: fprintf(initfile, longfmt, *((int *) s)); ! 439: i += 4; ! 440: } ! 441: if ((len - i) >= 2) ! 442: { ! 443: fprintf(initfile, wordfmt, 0xffff & (*((short *) (s + i)))); ! 444: i += 2; ! 445: } ! 446: if ((len - i) > 0) ! 447: fprintf(initfile,bytefmt, 0xff & s[i]); ! 448: ! 449: i_offset += len; ! 450: return; ! 451: } ! 452: ! 453: prquad(s) ! 454: register long *s; ! 455: { ! 456: static char quadfmt1[] = "\t.quad\t0x%x\n"; ! 457: static char quadfmt2[] = "\t.quad\t0x%x%08x\n"; ! 458: #if HERE == VAX ! 459: char quad[8]; ! 460: swab4((char *)s, quad, 8); ! 461: s = (long *)quad; ! 462: #endif ! 463: ! 464: if (s[0] == 0 ) ! 465: fprintf(initfile, quadfmt1, s[1]); ! 466: else ! 467: fprintf(initfile, quadfmt2, s[0], s[1]); ! 468: ! 469: return; ! 470: } ! 471: ! 472: #ifdef UCBVAXASM ! 473: prfill(n, s) ! 474: int n; ! 475: register long *s; ! 476: { ! 477: static char fillfmt1[] = "\t.fill\t%d,8,0x%x\n"; ! 478: static char fillfmt2[] = "\t.fill\t%d,8,0x%x%08x\n"; ! 479: #if HERE == VAX ! 480: char quad[8]; ! 481: swab4((char *)s, quad, 8); ! 482: s = (long *)quad; ! 483: #endif ! 484: ! 485: if (s[0] == 0 ) ! 486: fprintf(initfile, fillfmt1, n, s[1]); ! 487: else ! 488: fprintf(initfile, fillfmt2, n, s[0], s[1]); ! 489: ! 490: return; ! 491: } ! 492: #endif ! 493: ! 494: prext(ep) ! 495: register struct Extsym *ep; ! 496: { ! 497: static char globlfmt[] = "\t.globl\t_%s\n"; ! 498: static char commfmt[] = "\t.comm\t_%s,%ld\n"; ! 499: static char align2fmt[] = "\t.align\t2\n"; ! 500: static char labelfmt[] = "_%s:\n"; ! 501: ! 502: static char seekerror[] = "seek error on tmp file"; ! 503: static char readerror[] = "read error on tmp file"; ! 504: ! 505: char *tag; ! 506: register int leng; ! 507: long pos; ! 508: register char *p; ! 509: long oldvalue[2]; ! 510: long newvalue[2]; ! 511: register int n; ! 512: register int repl; ! 513: ! 514: tag = varstr(XL, ep->extname); ! 515: leng = ep->maxleng; ! 516: ! 517: if (leng == 0) ! 518: { ! 519: if(*tag != '@') /* function opcodes */ ! 520: fprintf(asmfile, globlfmt, tag); ! 521: return; ! 522: } ! 523: ! 524: if (ep->init == NO) ! 525: { ! 526: fprintf(asmfile, commfmt, tag, leng); ! 527: return; ! 528: } ! 529: ! 530: fprintf(asmfile, globlfmt, tag); ! 531: fprintf(initfile, align2fmt); ! 532: fprintf(initfile, labelfmt, tag); ! 533: ! 534: pos = lseek(cdatafile, ep->initoffset, 0); ! 535: if (pos == -1) ! 536: { ! 537: err(seekerror); ! 538: done(1); ! 539: } ! 540: ! 541: oldvalue[0] = 0; ! 542: oldvalue[1] = 0; ! 543: n = read(cdatafile, oldvalue, 8); ! 544: if (n < 0) ! 545: { ! 546: err(readerror); ! 547: done(1); ! 548: } ! 549: ! 550: if (leng <= 8) ! 551: { ! 552: p = (char *)oldvalue + leng; ! 553: while (p > (char *)oldvalue && *--p == '\0') /* SKIP */; ! 554: if (*p == '\0') ! 555: prspace(leng); ! 556: else if (leng == 8) ! 557: prquad(oldvalue); ! 558: else ! 559: prsdata(oldvalue, leng); ! 560: ! 561: return; ! 562: } ! 563: ! 564: repl = 1; ! 565: leng -= 8; ! 566: ! 567: while (leng >= 8) ! 568: { ! 569: newvalue[0] = 0; ! 570: newvalue[1] = 0; ! 571: ! 572: n = read(cdatafile, newvalue, 8); ! 573: if (n < 0) ! 574: { ! 575: err(readerror); ! 576: done(1); ! 577: } ! 578: ! 579: leng -= 8; ! 580: ! 581: if (oldvalue[0] == newvalue[0] ! 582: && oldvalue[1] == newvalue[1]) ! 583: repl++; ! 584: else ! 585: { ! 586: if (oldvalue[0] == 0 ! 587: && oldvalue[1] == 0) ! 588: prspace(8*repl); ! 589: else if (repl == 1) ! 590: prquad(oldvalue); ! 591: else ! 592: #ifdef UCBVAXASM ! 593: prfill(repl, oldvalue); ! 594: #else ! 595: { ! 596: while (repl-- > 0) ! 597: prquad(oldvalue); ! 598: } ! 599: #endif ! 600: oldvalue[0] = newvalue[0]; ! 601: oldvalue[1] = newvalue[1]; ! 602: repl = 1; ! 603: } ! 604: } ! 605: ! 606: newvalue[0] = 0; ! 607: newvalue[1] = 0; ! 608: ! 609: if (leng > 0) ! 610: { ! 611: n = read(cdatafile, newvalue, leng); ! 612: if (n < 0) ! 613: { ! 614: err(readerror); ! 615: done(1); ! 616: } ! 617: } ! 618: ! 619: if (oldvalue[1] == 0 ! 620: && oldvalue[0] == 0 ! 621: && newvalue[1] == 0 ! 622: && newvalue[0] == 0) ! 623: { ! 624: prspace(8*repl + leng); ! 625: return; ! 626: } ! 627: ! 628: if (oldvalue[1] == 0 ! 629: && oldvalue[0] == 0) ! 630: prspace(8*repl); ! 631: else if (repl == 1) ! 632: prquad(oldvalue); ! 633: else ! 634: #ifdef UCBVAXASM ! 635: prfill(repl, oldvalue); ! 636: #else ! 637: { ! 638: while (repl-- > 0) ! 639: prquad(oldvalue); ! 640: } ! 641: #endif ! 642: ! 643: prsdata(newvalue, leng); ! 644: ! 645: return; ! 646: } ! 647: ! 648: prlocdata(sname, leng, type, initoffset, inlcomm) ! 649: char *sname; ! 650: ftnint leng; ! 651: int type; ! 652: long initoffset; ! 653: char *inlcomm; ! 654: { ! 655: static char seekerror[] = "seek error on tmp file"; ! 656: static char readerror[] = "read error on tmp file"; ! 657: ! 658: static char labelfmt[] = "%s:\n"; ! 659: ! 660: register int k; ! 661: register char *p; ! 662: register int repl; ! 663: register int first; ! 664: register long pos; ! 665: register long n; ! 666: long oldvalue[2]; ! 667: long newvalue[2]; ! 668: ! 669: *inlcomm = NO; ! 670: ! 671: k = leng; ! 672: first = YES; ! 673: ! 674: pos = lseek(vdatafile, initoffset, 0); ! 675: if (pos == -1) ! 676: { ! 677: err(seekerror); ! 678: done(1); ! 679: } ! 680: ! 681: oldvalue[0] = 0; ! 682: oldvalue[1] = 0; ! 683: n = read(vdatafile, oldvalue, 8); ! 684: if (n < 0) ! 685: { ! 686: err(readerror); ! 687: done(1); ! 688: } ! 689: ! 690: if (k <= 8) ! 691: { ! 692: p = (char *)oldvalue + k; ! 693: while (p > (char *)oldvalue && *--p == '\0') ! 694: /* SKIP */ ; ! 695: if (*p == '\0') ! 696: { ! 697: if (SMALLVAR(leng)) ! 698: { ! 699: pralign(typealign[type]); ! 700: fprintf(initfile, labelfmt, sname); ! 701: prspace(leng); ! 702: } ! 703: else ! 704: { ! 705: preven(ALIDOUBLE); ! 706: prlocvar(sname, leng); ! 707: *inlcomm = YES; ! 708: } ! 709: } ! 710: else ! 711: { ! 712: fprintf(initfile, labelfmt, sname); ! 713: if (leng == 8) ! 714: prquad(oldvalue); ! 715: else ! 716: prsdata(oldvalue, leng); ! 717: } ! 718: return; ! 719: } ! 720: ! 721: repl = 1; ! 722: k -= 8; ! 723: ! 724: while (k >=8) ! 725: { ! 726: newvalue[0] = 0; ! 727: newvalue[1] = 0; ! 728: ! 729: n = read(vdatafile, newvalue, 8); ! 730: if (n < 0) ! 731: { ! 732: err(readerror); ! 733: done(1); ! 734: } ! 735: ! 736: k -= 8; ! 737: ! 738: if (oldvalue[0] == newvalue[0] ! 739: && oldvalue[1] == newvalue[1]) ! 740: repl++; ! 741: else ! 742: { ! 743: if (first == YES) ! 744: { ! 745: pralign(typealign[type]); ! 746: fprintf(initfile, labelfmt, sname); ! 747: first = NO; ! 748: } ! 749: ! 750: if (oldvalue[0] == 0 ! 751: && oldvalue[1] == 0) ! 752: prspace(8*repl); ! 753: else ! 754: { ! 755: while (repl-- > 0) ! 756: prquad(oldvalue); ! 757: } ! 758: oldvalue[0] = newvalue[0]; ! 759: oldvalue[1] = newvalue[1]; ! 760: repl = 1; ! 761: } ! 762: } ! 763: ! 764: newvalue[0] = 0; ! 765: newvalue[1] = 0; ! 766: ! 767: if (k > 0) ! 768: { ! 769: n = read(vdatafile, newvalue, k); ! 770: if (n < 0) ! 771: { ! 772: err(readerror); ! 773: done(1); ! 774: } ! 775: } ! 776: ! 777: if (oldvalue[1] == 0 ! 778: && oldvalue[0] == 0 ! 779: && newvalue[1] == 0 ! 780: && newvalue[0] == 0) ! 781: { ! 782: if (first == YES && !SMALLVAR(leng)) ! 783: { ! 784: prlocvar(sname, leng); ! 785: *inlcomm = YES; ! 786: } ! 787: else ! 788: { ! 789: if (first == YES) ! 790: { ! 791: pralign(typealign[type]); ! 792: fprintf(initfile, labelfmt, sname); ! 793: } ! 794: prspace(8*repl + k); ! 795: } ! 796: return; ! 797: } ! 798: ! 799: if (first == YES) ! 800: { ! 801: pralign(typealign[type]); ! 802: fprintf(initfile, labelfmt, sname); ! 803: } ! 804: ! 805: if (oldvalue[1] == 0 ! 806: && oldvalue[0] == 0) ! 807: prspace(8*repl); ! 808: else ! 809: { ! 810: while (repl-- > 0) ! 811: prquad(oldvalue); ! 812: } ! 813: ! 814: prsdata(newvalue, k); ! 815: ! 816: return; ! 817: } ! 818: ! 819: prendproc() ! 820: { ! 821: } ! 822: ! 823: prtail() ! 824: { ! 825: } ! 826: ! 827: prolog(ep, argvec) ! 828: struct Entrypoint *ep; ! 829: Addrp argvec; ! 830: { ! 831: int i, argslot, proflab; ! 832: int size; ! 833: register chainp p; ! 834: register Namep q; ! 835: register struct Dimblock *dp; ! 836: expptr tp; ! 837: static char maskfmt[] = "\t.word\tLWM%d"; ! 838: static char align1fmt[] = "\t.align\t1"; ! 839: ! 840: if(procclass == CLMAIN) { ! 841: if(fudgelabel) ! 842: { ! 843: if(ep->entryname) { ! 844: p2pass(align1fmt); ! 845: p2ps("_%s:", varstr(XL, ep->entryname->extname)); ! 846: p2pi(maskfmt, procno); ! 847: } ! 848: putlabel(fudgelabel); ! 849: fudgelabel = 0; ! 850: } ! 851: else ! 852: { ! 853: p2pass(align1fmt); ! 854: p2pass( "_MAIN_:" ); ! 855: if(ep->entryname == NULL) ! 856: p2pi(maskfmt, procno); ! 857: } ! 858: ! 859: } else if(ep->entryname) ! 860: if(fudgelabel) ! 861: { ! 862: putlabel(fudgelabel); ! 863: fudgelabel = 0; ! 864: } ! 865: else ! 866: { ! 867: p2pass(align1fmt); ! 868: p2ps("_%s:", varstr(XL, ep->entryname->extname)); ! 869: p2pi(maskfmt, procno); ! 870: prsave(newlabel()); ! 871: } ! 872: ! 873: if(procclass == CLBLOCK) ! 874: return; ! 875: if (anylocals == YES) ! 876: p2pi("\tmovl\t$v.%d,r11", bsslabel); ! 877: if(argvec) ! 878: { ! 879: if (argvec->tag != TADDR) badtag ("prolog",argvec->tag); ! 880: argloc = argvec->memoffset->constblock.const.ci + SZINT; ! 881: /* first slot holds count */ ! 882: if(proctype == TYCHAR) ! 883: { ! 884: mvarg(TYADDR, 0, chslot); ! 885: mvarg(TYLENG, SZADDR, chlgslot); ! 886: argslot = SZADDR + SZLENG; ! 887: } ! 888: else if( ISCOMPLEX(proctype) ) ! 889: { ! 890: mvarg(TYADDR, 0, cxslot); ! 891: argslot = SZADDR; ! 892: } ! 893: else ! 894: argslot = 0; ! 895: ! 896: for(p = ep->arglist ; p ; p =p->nextp) ! 897: { ! 898: q = (Namep) (p->datap); ! 899: mvarg(TYADDR, argslot, q->vardesc.varno); ! 900: argslot += SZADDR; ! 901: } ! 902: for(p = ep->arglist ; p ; p = p->nextp) ! 903: { ! 904: q = (Namep) (p->datap); ! 905: if(q->vtype==TYCHAR && q->vclass!=CLPROC) ! 906: { ! 907: if(q->vleng && ! ISCONST(q->vleng) ) ! 908: mvarg(TYLENG, argslot, ! 909: q->vleng->addrblock.memno); ! 910: argslot += SZLENG; ! 911: } ! 912: } ! 913: if ((ep->enamep->vtype == TYCOMPLEX) && (!ep->arglist)) ! 914: p2pass("\tmovl\tfp,r12"); ! 915: else ! 916: p2pi("\tsubl3\t$%d,fp,r12", ARGOFFSET-argloc); ! 917: } else ! 918: if((ep->arglist) || (ISCOMPLEX(proctype)) || (proctype == TYCHAR)) ! 919: p2pass("\tmovl\tfp,r12"); ! 920: ! 921: for(p = ep->arglist ; p ; p = p->nextp) ! 922: { ! 923: q = (Namep) (p->datap); ! 924: if(dp = q->vdim) ! 925: { ! 926: for(i = 0 ; i < dp->ndim ; ++i) ! 927: if(dp->dims[i].dimexpr) ! 928: puteq( fixtype(cpexpr(dp->dims[i].dimsize)), ! 929: fixtype(cpexpr(dp->dims[i].dimexpr))); ! 930: #ifdef SDB ! 931: if(sdbflag) { ! 932: for(i = 0 ; i < dp->ndim ; ++i) { ! 933: if(dp->dims[i].lbaddr) ! 934: puteq( fixtype(cpexpr(dp->dims[i].lbaddr)), ! 935: fixtype(cpexpr(dp->dims[i].lb))); ! 936: if(dp->dims[i].ubaddr) ! 937: puteq( fixtype(cpexpr(dp->dims[i].ubaddr)), ! 938: fixtype(cpexpr(dp->dims[i].ub))); ! 939: ! 940: } ! 941: } ! 942: #endif ! 943: size = typesize[ q->vtype ]; ! 944: if(q->vtype == TYCHAR) ! 945: if( ISICON(q->vleng) ) ! 946: size *= q->vleng->constblock.const.ci; ! 947: else ! 948: size = -1; ! 949: ! 950: /* on TAHOE, get more efficient subscripting if subscripts ! 951: have zero-base, so fudge the argument pointers for arrays. ! 952: Not done if array bounds are being checked. ! 953: */ ! 954: if(dp->basexpr) ! 955: puteq( cpexpr(fixtype(dp->baseoffset)), ! 956: cpexpr(fixtype(dp->basexpr))); ! 957: #ifdef SDB ! 958: if( (! checksubs) && (! sdbflag) ) ! 959: #else ! 960: if(! checksubs) ! 961: #endif ! 962: { ! 963: if(dp->basexpr) ! 964: { ! 965: if(size > 0) ! 966: tp = (expptr) ICON(size); ! 967: else ! 968: tp = (expptr) cpexpr(q->vleng); ! 969: putforce(TYINT, ! 970: fixtype( mkexpr(OPSTAR, tp, ! 971: cpexpr(dp->baseoffset)) )); ! 972: p2pi("\tsubl2\tr0,%d(r12)", ! 973: p->datap->nameblock.vardesc.varno + ! 974: ARGOFFSET); ! 975: } ! 976: else if(dp->baseoffset->constblock.const.ci != 0) ! 977: { ! 978: if(size > 0) ! 979: { ! 980: p2pij("\tsubl2\t$%ld,%d(r12)", ! 981: dp->baseoffset->constblock.const.ci * size, ! 982: p->datap->nameblock.vardesc.varno + ! 983: ARGOFFSET); ! 984: } ! 985: else { ! 986: putforce(TYINT, mkexpr(OPSTAR, cpexpr(dp->baseoffset), ! 987: cpexpr(q->vleng) )); ! 988: p2pi("\tsubl2\tr0,%d(r12)", ! 989: p->datap->nameblock.vardesc.varno + ! 990: ARGOFFSET); ! 991: } ! 992: } ! 993: } ! 994: } ! 995: } ! 996: ! 997: if(typeaddr) ! 998: puteq( cpexpr(typeaddr), mkaddcon(ep->typelabel) ); ! 999: /* replace to avoid long jump problem ! 1000: putgoto(ep->entrylabel); ! 1001: */ ! 1002: p2pi("\tjbr\tL%d", ep->entrylabel); ! 1003: } ! 1004: ! 1005: prhead(fp) ! 1006: FILEP fp; ! 1007: { ! 1008: #if FAMILY==PCC ! 1009: p2triple(PCCF_FLBRAC, ARGREG-highregvar, procno); ! 1010: p2word( (long) (BITSPERCHAR*autoleng) ); ! 1011: p2flush(); ! 1012: #endif ! 1013: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.