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