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