xref: /csrg-svn/usr.bin/f77/pass1.vax/vax.c (revision 22879)
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