xref: /csrg-svn/usr.bin/pascal/src/p2put.c (revision 762)
1*762Speter /* Copyright (c) 1979 Regents of the University of California */
2*762Speter 
3*762Speter static	char sccsid[] = "@(#)p2put.c 1.1 08/27/80";
4*762Speter 
5*762Speter     /*
6*762Speter      *	functions to help pi put out
7*762Speter      *	polish postfix binary portable c compiler intermediate code
8*762Speter      *	thereby becoming the portable pascal compiler
9*762Speter      */
10*762Speter 
11*762Speter #include	"whoami.h"
12*762Speter #ifdef PC
13*762Speter #include	"0.h"
14*762Speter #include	"pcops.h"
15*762Speter #include	"pc.h"
16*762Speter 
17*762Speter     /*
18*762Speter      *	mash into f77's format
19*762Speter      *	lovely, isn't it?
20*762Speter      */
21*762Speter #define		TOF77( fop,val,rest )	( ( ( (rest) & 0177777 ) << 16 ) \
22*762Speter 					| ( ( (val) & 0377 ) << 8 )	 \
23*762Speter 					| ( (fop) & 0377 ) )
24*762Speter 
25*762Speter     /*
26*762Speter      *	emits an ftext operator and a string to the pcstream
27*762Speter      */
28*762Speter puttext( string )
29*762Speter     char	*string;
30*762Speter     {
31*762Speter 	int	length = str4len( string );
32*762Speter 
33*762Speter 	if ( cgenflg )
34*762Speter 	    return;
35*762Speter 	p2word( TOF77( P2FTEXT , length , 0 ) );
36*762Speter #	ifdef DEBUG
37*762Speter 	    if ( opt( 'k' ) ) {
38*762Speter 		fprintf( stdout , "P2FTEXT | %3d | 0	" , length );
39*762Speter 	    }
40*762Speter #	endif
41*762Speter 	p2string( string );
42*762Speter     }
43*762Speter 
44*762Speter int
45*762Speter str4len( string )
46*762Speter     char	*string;
47*762Speter     {
48*762Speter 
49*762Speter 	return ( ( strlen( string ) + 3 ) / 4 );
50*762Speter     }
51*762Speter 
52*762Speter     /*
53*762Speter      *	put formatted text into a buffer for printing to the pcstream.
54*762Speter      *	a call to putpflush actually puts out the text.
55*762Speter      *	none of arg1 .. arg5 need be present.
56*762Speter      *	and you can add more if you need them.
57*762Speter      */
58*762Speter     /* VARARGS */
59*762Speter putprintf( format , incomplete , arg1 , arg2 , arg3 , arg4 , arg5 )
60*762Speter     char	*format;
61*762Speter     int		incomplete;
62*762Speter     {
63*762Speter 	static char	ppbuffer[ BUFSIZ ];
64*762Speter 	static char	*ppbufp = ppbuffer;
65*762Speter 
66*762Speter 	if ( cgenflg )
67*762Speter 	    return;
68*762Speter 	sprintf( ppbufp , format , arg1 , arg2 , arg3 , arg4 , arg5 );
69*762Speter 	ppbufp = &( ppbuffer[ strlen( ppbuffer ) ] );
70*762Speter 	if ( ppbufp >= &( ppbuffer[ BUFSIZ ] ) )
71*762Speter 	    panic( "putprintf" );
72*762Speter 	if ( ! incomplete ) {
73*762Speter 	    puttext( ppbuffer );
74*762Speter 	    ppbufp = ppbuffer;
75*762Speter 	}
76*762Speter     }
77*762Speter 
78*762Speter     /*
79*762Speter      *	emit a left bracket operator to pcstream
80*762Speter      *	with function number, the maximum temp register, and total local bytes
81*762Speter      *	until i figure out how to use them, regs 0 .. 11 are free.
82*762Speter      *	one idea for one reg is to save the display pointer on block entry
83*762Speter      */
84*762Speter putlbracket( ftnno , localbytes )
85*762Speter     int	ftnno;
86*762Speter     int	localbytes;
87*762Speter     {
88*762Speter #	define	MAXTP2REG	11
89*762Speter 
90*762Speter 	p2word( TOF77( P2FLBRAC , MAXTP2REG , ftnno ) );
91*762Speter 	p2word( BITSPERBYTE * localbytes );
92*762Speter #	ifdef DEBUG
93*762Speter 	    if ( opt( 'k' ) ) {
94*762Speter 		fprintf( stdout
95*762Speter 			, "P2FLBRAC | %3d | %d	" , MAXTP2REG , ftnno );
96*762Speter 		fprintf( stdout , "%d\n"
97*762Speter 			, BITSPERBYTE * localbytes );
98*762Speter 	    }
99*762Speter #	endif
100*762Speter     }
101*762Speter 
102*762Speter     /*
103*762Speter      *	emit a right bracket operator
104*762Speter      *	which for the binary (fortran) interface
105*762Speter      *	forces the stack allocate and register mask
106*762Speter      */
107*762Speter putrbracket( ftnno )
108*762Speter     int	ftnno;
109*762Speter     {
110*762Speter 
111*762Speter 	p2word( TOF77( P2FRBRAC , 0 , ftnno ) );
112*762Speter #	ifdef DEBUG
113*762Speter 	    if ( opt( 'k' ) ) {
114*762Speter 		fprintf( stdout , "P2FRBRAC |   0 | %d\n" , ftnno );
115*762Speter 	    }
116*762Speter #	endif
117*762Speter     }
118*762Speter 
119*762Speter     /*
120*762Speter      *	emit an eof operator
121*762Speter      */
122*762Speter puteof()
123*762Speter     {
124*762Speter 
125*762Speter 	p2word( P2FEOF );
126*762Speter #	ifdef DEBUG
127*762Speter 	    if ( opt( 'k' ) ) {
128*762Speter 		fprintf( stdout , "P2FEOF\n" );
129*762Speter 	    }
130*762Speter #	endif
131*762Speter     }
132*762Speter 
133*762Speter     /*
134*762Speter      *	emit a dot operator,
135*762Speter      *	with a source file line number and name
136*762Speter      *	if line is negative, there was an error on that line, but who cares?
137*762Speter      */
138*762Speter putdot( filename , line )
139*762Speter     char	*filename;
140*762Speter     int		line;
141*762Speter     {
142*762Speter 	int	length = str4len( filename );
143*762Speter 
144*762Speter 	if ( line < 0 ) {
145*762Speter 	    line = -line;
146*762Speter 	}
147*762Speter 	p2word( TOF77( P2FEXPR , length , line ) );
148*762Speter #	ifdef DEBUG
149*762Speter 	    if ( opt( 'k' ) ) {
150*762Speter 		fprintf( stdout , "P2FEXPR | %3d | %d	" , length , line );
151*762Speter 	    }
152*762Speter #	endif
153*762Speter 	p2string( filename );
154*762Speter     }
155*762Speter 
156*762Speter     /*
157*762Speter      *	put out a leaf node
158*762Speter      */
159*762Speter putleaf( op , lval , rval , type , name )
160*762Speter     int		op;
161*762Speter     int		lval;
162*762Speter     int		rval;
163*762Speter     int		type;
164*762Speter     char	*name;
165*762Speter     {
166*762Speter 	if ( cgenflg )
167*762Speter 	    return;
168*762Speter 	switch ( op ) {
169*762Speter 	    default:
170*762Speter 		panic( "[putleaf]" );
171*762Speter 	    case P2ICON:
172*762Speter 		p2word( TOF77( P2ICON , name != NIL , type ) );
173*762Speter 		p2word( lval );
174*762Speter #		ifdef DEBUG
175*762Speter 		    if ( opt( 'k' ) ) {
176*762Speter 			fprintf( stdout , "P2ICON | %3d | %d	"
177*762Speter 			       , name != NIL , type );
178*762Speter 			fprintf( stdout , "%d\n" , lval );
179*762Speter 		    }
180*762Speter #		endif
181*762Speter 		if ( name )
182*762Speter 		    p2name( name );
183*762Speter 		break;
184*762Speter 	    case P2NAME:
185*762Speter 		p2word( TOF77( P2NAME , lval != 0 , type ) );
186*762Speter 		if ( lval )
187*762Speter 		    p2word( lval );
188*762Speter #		ifdef DEBUG
189*762Speter 		    if ( opt( 'k' ) ) {
190*762Speter 			fprintf( stdout , "P2NAME | %3d | %d	"
191*762Speter 			       , lval != 0 , type );
192*762Speter 			if ( lval )
193*762Speter 			    fprintf( stdout , "%d	" , lval );
194*762Speter 		    }
195*762Speter #		endif
196*762Speter 		p2name( name );
197*762Speter 		break;
198*762Speter 	    case P2REG:
199*762Speter 		p2word( TOF77( P2REG , rval , type ) );
200*762Speter #		ifdef DEBUG
201*762Speter 		    if ( opt( 'k' ) ) {
202*762Speter 			fprintf( stdout , "P2REG | %3d | %d\n" , rval , type );
203*762Speter 		    }
204*762Speter #		endif
205*762Speter 		break;
206*762Speter 	}
207*762Speter     }
208*762Speter 
209*762Speter     /*
210*762Speter      *	rvalues are just lvalues with indirection, except
211*762Speter      *	special case for named globals, whose names are their rvalues
212*762Speter      */
213*762Speter putRV( name , level , offset , type )
214*762Speter     char	*name;
215*762Speter     int		level;
216*762Speter     int		offset;
217*762Speter     int		type;
218*762Speter     {
219*762Speter 	char	extname[ BUFSIZ ];
220*762Speter 	char	*printname;
221*762Speter 
222*762Speter 	if ( cgenflg )
223*762Speter 	    return;
224*762Speter 	if ( ( level <= 1 ) && ( name != 0 ) ) {
225*762Speter 	    if ( name[0] != '_' ) {
226*762Speter 		    sprintf( extname , EXTFORMAT , name );
227*762Speter 		    printname = extname;
228*762Speter 	    } else {
229*762Speter 		    printname = name;
230*762Speter 	    }
231*762Speter 	    putleaf( P2NAME , offset , 0 , type , printname );
232*762Speter 	    return;
233*762Speter 	}
234*762Speter 	putLV( name , level , offset , type );
235*762Speter 	putop( P2UNARY P2MUL , type );
236*762Speter     }
237*762Speter 
238*762Speter     /*
239*762Speter      *	put out an lvalue
240*762Speter      *	given a level and offset
241*762Speter      *	special case for
242*762Speter      *	    named globals, whose lvalues are just their names as constants.
243*762Speter      *	    negative offsets, that are offsets from the frame pointer.
244*762Speter      *	    positive offsets, that are offsets from argument pointer.
245*762Speter      */
246*762Speter putLV( name , level , offset , type )
247*762Speter     char	*name;
248*762Speter     int		level;
249*762Speter     int		offset;
250*762Speter     int		type;
251*762Speter     {
252*762Speter 	char		extname[ BUFSIZ ];
253*762Speter 	char		*printname;
254*762Speter 
255*762Speter 	if ( cgenflg )
256*762Speter 	    return;
257*762Speter 	if ( ( level <= 1 ) && ( name != 0 ) ) {
258*762Speter 	    if ( name[0] != '_' ) {
259*762Speter 		    sprintf( extname , EXTFORMAT , name );
260*762Speter 		    printname = extname;
261*762Speter 	    } else {
262*762Speter 		    printname = name;
263*762Speter 	    }
264*762Speter 	    putleaf( P2ICON , offset , 0 , ADDTYPE( type , P2PTR )
265*762Speter 		    , printname );
266*762Speter 	    return;
267*762Speter 	}
268*762Speter 	if ( level == cbn ) {
269*762Speter 		if ( offset < 0 ) {
270*762Speter 		    putleaf( P2REG , 0 , P2FP , ADDTYPE( type , P2PTR ) , 0 );
271*762Speter 		} else {
272*762Speter 		    putleaf( P2REG , 0 , P2AP , ADDTYPE( type , P2PTR ) , 0 );
273*762Speter 		}
274*762Speter 	} else {
275*762Speter 		if ( offset < 0 ) {
276*762Speter 			putleaf( P2NAME
277*762Speter 			    , ( level * sizeof(struct dispsave) ) + FP_OFFSET
278*762Speter 			    , 0 , P2PTR | P2CHAR , DISPLAYNAME );
279*762Speter 		} else {
280*762Speter 			putleaf( P2NAME
281*762Speter 			    , ( level * sizeof(struct dispsave) ) + AP_OFFSET
282*762Speter 			    , 0 , P2PTR | P2CHAR , DISPLAYNAME );
283*762Speter 		}
284*762Speter 	}
285*762Speter 	if ( offset < 0 ) {
286*762Speter 		putleaf( P2ICON , -offset , 0 , P2INT , 0 );
287*762Speter 		putop( P2MINUS , P2PTR | P2CHAR );
288*762Speter 	} else {
289*762Speter 		putleaf( P2ICON , offset , 0 , P2INT , 0 );
290*762Speter 		putop( P2PLUS , P2PTR | P2CHAR );
291*762Speter 	}
292*762Speter 	return;
293*762Speter     }
294*762Speter 
295*762Speter     /*
296*762Speter      *	put out a floating point constant leaf node
297*762Speter      *	the constant is declared in aligned data space
298*762Speter      *	and a P2NAME leaf put out for it
299*762Speter      */
300*762Speter putCON8( value )
301*762Speter     double	value;
302*762Speter     {
303*762Speter 	int	label;
304*762Speter 	char	name[ BUFSIZ ];
305*762Speter 
306*762Speter 	if ( cgenflg )
307*762Speter 	    return;
308*762Speter 	putprintf( "	.data" , 0 );
309*762Speter 	putprintf( "	.align 2" , 0 );
310*762Speter 	label = getlab();
311*762Speter 	putlab( label );
312*762Speter 	putprintf( "	.double 0d%.20e" , 0 , value );
313*762Speter 	putprintf( "	.text" , 0 );
314*762Speter 	sprintf( name , PREFIXFORMAT , LABELPREFIX , label );
315*762Speter 	putleaf( P2NAME , 0 , 0 , P2DOUBLE , name );
316*762Speter     }
317*762Speter 
318*762Speter 	/*
319*762Speter 	 * put out either an lvalue or an rvalue for a constant string.
320*762Speter 	 * an lvalue (for assignment rhs's) is the name as a constant,
321*762Speter 	 * an rvalue (for parameters) is just the name.
322*762Speter 	 */
323*762Speter putCONG( string , length , required )
324*762Speter     char	*string;
325*762Speter     int		length;
326*762Speter     int		required;
327*762Speter     {
328*762Speter 	char	name[ BUFSIZ ];
329*762Speter 	int	label;
330*762Speter 	char	*cp;
331*762Speter 	int	pad;
332*762Speter 	int	others;
333*762Speter 
334*762Speter 	if ( cgenflg )
335*762Speter 	    return;
336*762Speter 	putprintf( "	.data" , 0 );
337*762Speter 	label = getlab();
338*762Speter 	putlab( label );
339*762Speter 	cp = string;
340*762Speter 	while ( *cp ) {
341*762Speter 	    putprintf( "	.byte	0%o" , 1 , *cp ++ );
342*762Speter 	    for ( others = 2 ; ( others <= 8 ) && *cp ; others ++ ) {
343*762Speter 		putprintf( ",0%o" , 1 , *cp++ );
344*762Speter 	    }
345*762Speter 	    putprintf( "" , 0 );
346*762Speter 	}
347*762Speter 	pad = length - strlen( string );
348*762Speter 	while ( pad-- > 0 ) {
349*762Speter 	    putprintf( "	.byte	0%o" , 1 , ' ' );
350*762Speter 	    for ( others = 2 ; ( others <= 8 ) && ( pad-- > 0 ) ; others++ ) {
351*762Speter 		putprintf( ",0%o" , 1 , ' ' );
352*762Speter 	    }
353*762Speter 	    putprintf( "" , 0 );
354*762Speter 	}
355*762Speter 	putprintf( "	.byte	0" , 0 );
356*762Speter 	putprintf( "	.text"  , 0 );
357*762Speter 	sprintf( name , PREFIXFORMAT , LABELPREFIX , label );
358*762Speter 	if ( required == RREQ ) {
359*762Speter 	    putleaf( P2NAME , 0 , 0 , P2ARY | P2CHAR , name );
360*762Speter 	} else {
361*762Speter 	    putleaf( P2ICON , 0 , 0 , P2PTR | P2CHAR , name );
362*762Speter 	}
363*762Speter     }
364*762Speter 
365*762Speter     /*
366*762Speter      *	map a pascal type to a c type
367*762Speter      *	this would be tail recursive, but i unfolded it into a for (;;).
368*762Speter      *	this is sort of like isa and lwidth
369*762Speter      *	a note on the types used by the portable c compiler:
370*762Speter      *	    they are divided into a basic type (char, short, int, long, etc.)
371*762Speter      *	    and qualifications on those basic types (pointer, function, array).
372*762Speter      *	    the basic type is kept in the low 4 bits of the type descriptor,
373*762Speter      *	    and the qualifications are arranged in two bit chunks, with the
374*762Speter      *	    most significant on the right,
375*762Speter      *	    and the least significant on the left
376*762Speter      *		e.g. int *foo();
377*762Speter      *			(a function returning a pointer to an integer)
378*762Speter      *		is stored as
379*762Speter      *		    <ptr><ftn><int>
380*762Speter      *	so, we build types recursively
381*762Speter      */
382*762Speter int
383*762Speter p2type( np )
384*762Speter     struct nl *np;
385*762Speter     {
386*762Speter 
387*762Speter 	if ( np == NIL )
388*762Speter 	    return P2UNDEFINED;
389*762Speter 	switch ( np -> class ) {
390*762Speter 	    case SCAL :
391*762Speter 	    case RANGE :
392*762Speter 		if ( np -> type == ( nl + TDOUBLE ) ) {
393*762Speter 		    return P2DOUBLE;
394*762Speter 		}
395*762Speter 		switch ( bytes( np -> range[0] , np -> range[1] ) ) {
396*762Speter 		    case 1:
397*762Speter 			return P2CHAR;
398*762Speter 		    case 2:
399*762Speter 			return P2SHORT;
400*762Speter 		    case 4:
401*762Speter 			return P2INT;
402*762Speter 		    default:
403*762Speter 			panic( "p2type int" );
404*762Speter 		}
405*762Speter 	    case STR :
406*762Speter 		return ( P2ARY | P2CHAR );
407*762Speter 		/*
408*762Speter 		return P2STRTY;
409*762Speter 		*/
410*762Speter 	    case RECORD :
411*762Speter 	    case SET :
412*762Speter 		return P2STRTY;
413*762Speter 	    case FILET :
414*762Speter 		return ( P2PTR | P2STRTY );
415*762Speter 	    case CONST :
416*762Speter 	    case VAR :
417*762Speter 	    case FIELD :
418*762Speter 		return p2type( np -> type );
419*762Speter 	    case TYPE :
420*762Speter 		switch ( nloff( np ) ) {
421*762Speter 		    case TNIL :
422*762Speter 			return ( P2PTR | P2UNDEFINED );
423*762Speter 		    case TSTR :
424*762Speter 			return ( P2ARY | P2CHAR );
425*762Speter 			/*
426*762Speter 			return P2STRTY;
427*762Speter 			*/
428*762Speter 		    case TSET :
429*762Speter 			return P2STRTY;
430*762Speter 		    default :
431*762Speter 			return ( p2type( np -> type ) );
432*762Speter 		}
433*762Speter 	    case REF:
434*762Speter 	    case WITHPTR:
435*762Speter 	    case PTR :
436*762Speter 		return ADDTYPE( p2type( np -> type ) , P2PTR );
437*762Speter 	    case ARRAY :
438*762Speter 		return ADDTYPE( p2type( np -> type ) , P2ARY );
439*762Speter 		/*
440*762Speter 		return P2STRTY;
441*762Speter 		*/
442*762Speter 	    case FUNC :
443*762Speter 		    /*
444*762Speter 		     * functions are really pointers to functions
445*762Speter 		     * which return their underlying type.
446*762Speter 		     */
447*762Speter 		return ADDTYPE( ADDTYPE( p2type( np -> type ) , P2FTN )
448*762Speter 				, P2PTR );
449*762Speter 	    case PROC :
450*762Speter 		    /*
451*762Speter 		     * procedures are pointers to functions
452*762Speter 		     * which return integers (whether you look at them or not)
453*762Speter 		     */
454*762Speter 		return ADDTYPE( ADDTYPE( P2INT , P2FTN ) , P2PTR );
455*762Speter 	    default :
456*762Speter 		fprintf( stderr , "[p2type] np -> class %d\n" , np -> class );
457*762Speter 		panic( "p2type" );
458*762Speter 	}
459*762Speter     }
460*762Speter 
461*762Speter     /*
462*762Speter      *	add a most significant type modifier to a type
463*762Speter      */
464*762Speter long
465*762Speter addtype( underlying , mtype )
466*762Speter     long	underlying;
467*762Speter     long	mtype;
468*762Speter     {
469*762Speter 	return ( ( ( underlying & ~P2BASETYPE ) << P2TYPESHIFT )
470*762Speter 	       | mtype
471*762Speter 	       | ( underlying & P2BASETYPE ) );
472*762Speter     }
473*762Speter 
474*762Speter     /*
475*762Speter      *	put a typed operator to the pcstream
476*762Speter      */
477*762Speter putop( op , type )
478*762Speter     int		op;
479*762Speter     int		type;
480*762Speter     {
481*762Speter 	extern char	*p2opnames[];
482*762Speter 
483*762Speter 	if ( cgenflg )
484*762Speter 	    return;
485*762Speter 	p2word( TOF77( op , 0 , type ) );
486*762Speter #	ifdef DEBUG
487*762Speter 	    if ( opt( 'k' ) ) {
488*762Speter 		fprintf( stdout , "%s (%d) |   0 | %d\n"
489*762Speter 			, p2opnames[ op ] , op , type );
490*762Speter 	    }
491*762Speter #	endif
492*762Speter     }
493*762Speter 
494*762Speter     /*
495*762Speter      *	put out a structure operator (STASG, STARG, STCALL, UNARY STCALL )
496*762Speter      *	which looks just like a regular operator, only the size and
497*762Speter      *	alignment go in the next consecutive words
498*762Speter      */
499*762Speter putstrop( op , type , size , alignment )
500*762Speter     int	op;
501*762Speter     int	type;
502*762Speter     int	size;
503*762Speter     int	alignment;
504*762Speter     {
505*762Speter 	extern char	*p2opnames[];
506*762Speter 
507*762Speter 	if ( cgenflg )
508*762Speter 	    return;
509*762Speter 	p2word( TOF77( op , 0 , type ) );
510*762Speter 	p2word( size );
511*762Speter 	p2word( alignment );
512*762Speter #	ifdef DEBUG
513*762Speter 	    if ( opt( 'k' ) ) {
514*762Speter 		fprintf( stdout , "%s (%d) |   0 | %d	%d %d\n"
515*762Speter 			, p2opnames[ op ] , op , type , size , alignment );
516*762Speter 	    }
517*762Speter #	endif
518*762Speter     }
519*762Speter 
520*762Speter     /*
521*762Speter      *	the string names of p2ops
522*762Speter      */
523*762Speter char	*p2opnames[] = {
524*762Speter 	"",
525*762Speter 	"P2UNDEFINED",		/* 1 */
526*762Speter 	"P2NAME",		/* 2 */
527*762Speter 	"P2STRING",		/* 3 */
528*762Speter 	"P2ICON",		/* 4 */
529*762Speter 	"P2FCON",		/* 5 */
530*762Speter 	"P2PLUS",		/* 6 */
531*762Speter 	"",
532*762Speter 	"P2MINUS",		/* 8		also unary == P2NEG */
533*762Speter 	"",
534*762Speter 	"P2NEG",
535*762Speter 	"P2MUL",		/* 11		also unary == P2INDIRECT */
536*762Speter 	"",
537*762Speter 	"P2INDIRECT",
538*762Speter 	"P2AND",		/* 14		also unary == P2ADDROF */
539*762Speter 	"",
540*762Speter 	"P2ADDROF",
541*762Speter 	"P2OR",			/* 17 */
542*762Speter 	"",
543*762Speter 	"P2ER",			/* 19 */
544*762Speter 	"",
545*762Speter 	"P2QUEST",		/* 21 */
546*762Speter 	"P2COLON",		/* 22 */
547*762Speter 	"P2ANDAND",		/* 23 */
548*762Speter 	"P2OROR",		/* 24 */
549*762Speter 	"",			/* 25 */
550*762Speter 	"",			/* 26 */
551*762Speter 	"",			/* 27 */
552*762Speter 	"",			/* 28 */
553*762Speter 	"",			/* 29 */
554*762Speter 	"",			/* 30 */
555*762Speter 	"",			/* 31 */
556*762Speter 	"",			/* 32 */
557*762Speter 	"",			/* 33 */
558*762Speter 	"",			/* 34 */
559*762Speter 	"",			/* 35 */
560*762Speter 	"",			/* 36 */
561*762Speter 	"",			/* 37 */
562*762Speter 	"",			/* 38 */
563*762Speter 	"",			/* 39 */
564*762Speter 	"",			/* 40 */
565*762Speter 	"",			/* 41 */
566*762Speter 	"",			/* 42 */
567*762Speter 	"",			/* 43 */
568*762Speter 	"",			/* 44 */
569*762Speter 	"",			/* 45 */
570*762Speter 	"",			/* 46 */
571*762Speter 	"",			/* 47 */
572*762Speter 	"",			/* 48 */
573*762Speter 	"",			/* 49 */
574*762Speter 	"",			/* 50 */
575*762Speter 	"",			/* 51 */
576*762Speter 	"",			/* 52 */
577*762Speter 	"",			/* 53 */
578*762Speter 	"",			/* 54 */
579*762Speter 	"",			/* 55 */
580*762Speter 	"P2LISTOP",		/* 56 */
581*762Speter 	"",
582*762Speter 	"P2ASSIGN",		/* 58 */
583*762Speter 	"P2COMOP",		/* 59 */
584*762Speter 	"P2DIV",		/* 60 */
585*762Speter 	"",
586*762Speter 	"P2MOD",		/* 62 */
587*762Speter 	"",
588*762Speter 	"P2LS",			/* 64 */
589*762Speter 	"",
590*762Speter 	"P2RS",			/* 66 */
591*762Speter 	"",
592*762Speter 	"P2DOT",		/* 68 */
593*762Speter 	"P2STREF",		/* 69 */
594*762Speter 	"P2CALL",		/* 70		also unary */
595*762Speter 	"",
596*762Speter 	"P2UNARYCALL",
597*762Speter 	"P2FORTCALL",		/* 73		also unary */
598*762Speter 	"",
599*762Speter 	"P2UNARYFORTCALL",
600*762Speter 	"P2NOT",		/* 76 */
601*762Speter 	"P2COMPL",		/* 77 */
602*762Speter 	"P2INCR",		/* 78 */
603*762Speter 	"P2DECR",		/* 79 */
604*762Speter 	"P2EQ",			/* 80 */
605*762Speter 	"P2NE",			/* 81 */
606*762Speter 	"P2LE",			/* 82 */
607*762Speter 	"P2LT",			/* 83 */
608*762Speter 	"P2GE",			/* 84 */
609*762Speter 	"P2GT",			/* 85 */
610*762Speter 	"P2ULE",		/* 86 */
611*762Speter 	"P2ULT",		/* 87 */
612*762Speter 	"P2UGE",		/* 88 */
613*762Speter 	"P2UGT",		/* 89 */
614*762Speter 	"P2SETBIT",		/* 90 */
615*762Speter 	"P2TESTBIT",		/* 91 */
616*762Speter 	"P2RESETBIT",		/* 92 */
617*762Speter 	"P2ARS",		/* 93 */
618*762Speter 	"P2REG",		/* 94 */
619*762Speter 	"P2OREG",		/* 95 */
620*762Speter 	"P2CCODES",		/* 96 */
621*762Speter 	"P2FREE",		/* 97 */
622*762Speter 	"P2STASG",		/* 98 */
623*762Speter 	"P2STARG",		/* 99 */
624*762Speter 	"P2STCALL",		/* 100		also unary */
625*762Speter 	"",
626*762Speter 	"P2UNARYSTCALL",
627*762Speter 	"P2FLD",		/* 103 */
628*762Speter 	"P2SCONV",		/* 104 */
629*762Speter 	"P2PCONV",		/* 105 */
630*762Speter 	"P2PMCONV",		/* 106 */
631*762Speter 	"P2PVCONV",		/* 107 */
632*762Speter 	"P2FORCE",		/* 108 */
633*762Speter 	"P2CBRANCH",		/* 109 */
634*762Speter 	"P2INIT",		/* 110 */
635*762Speter 	"P2CAST",		/* 111 */
636*762Speter     };
637*762Speter 
638*762Speter     /*
639*762Speter      *	low level routines
640*762Speter      */
641*762Speter 
642*762Speter     /*
643*762Speter      *	puts a long word on the pcstream
644*762Speter      */
645*762Speter p2word( word )
646*762Speter     long	word;
647*762Speter     {
648*762Speter 
649*762Speter 	putw( word , pcstream );
650*762Speter     }
651*762Speter 
652*762Speter     /*
653*762Speter      *	put a length 0 mod 4 null padded string onto the pcstream
654*762Speter      */
655*762Speter p2string( string )
656*762Speter     char	*string;
657*762Speter     {
658*762Speter 	int	slen = strlen( string );
659*762Speter 	int	wlen = ( slen + 3 ) / 4;
660*762Speter 	int	plen = ( wlen * 4 ) - slen;
661*762Speter 	char	*cp;
662*762Speter 	int	p;
663*762Speter 
664*762Speter 	for ( cp = string ; *cp ; cp++ )
665*762Speter 	    putc( *cp , pcstream );
666*762Speter 	for ( p = 1 ; p <= plen ; p++ )
667*762Speter 	    putc( '\0' , pcstream );
668*762Speter #	ifdef DEBUG
669*762Speter 	    if ( opt( 'k' ) ) {
670*762Speter 		fprintf( stdout , "\"%s" , string );
671*762Speter 		for ( p = 1 ; p <= plen ; p++ )
672*762Speter 		    fprintf( stdout , "\\0" );
673*762Speter 		fprintf( stdout , "\"\n" );
674*762Speter 	    }
675*762Speter #	endif
676*762Speter     }
677*762Speter 
678*762Speter     /*
679*762Speter      *	puts a name on the pcstream
680*762Speter      */
681*762Speter p2name( name )
682*762Speter     char	*name;
683*762Speter     {
684*762Speter 	int	pad;
685*762Speter 
686*762Speter 	fprintf( pcstream , NAMEFORMAT , name );
687*762Speter 	pad = strlen( name ) % sizeof (long);
688*762Speter 	for ( ; pad < sizeof (long) ; pad++ ) {
689*762Speter 	    putc( '\0' , pcstream );
690*762Speter 	}
691*762Speter #	ifdef DEBUG
692*762Speter 	    if ( opt( 'k' ) ) {
693*762Speter 		fprintf( stdout , NAMEFORMAT , name );
694*762Speter 		pad = strlen( name ) % sizeof (long);
695*762Speter 		for ( ; pad < sizeof (long) ; pad++ ) {
696*762Speter 		    fprintf( stdout , "\\0" );
697*762Speter 		}
698*762Speter 		fprintf( stdout , "\n" );
699*762Speter 	    }
700*762Speter #	endif
701*762Speter     }
702*762Speter 
703*762Speter     /*
704*762Speter      *	put out a jump to a label
705*762Speter      */
706*762Speter putjbr( label )
707*762Speter     long	label;
708*762Speter     {
709*762Speter 
710*762Speter 	printjbr( LABELPREFIX , label );
711*762Speter     }
712*762Speter 
713*762Speter     /*
714*762Speter      *	put out a jump to any kind of label
715*762Speter      */
716*762Speter printjbr( prefix , label )
717*762Speter     char	*prefix;
718*762Speter     long	label;
719*762Speter     {
720*762Speter 
721*762Speter 	putprintf( "	jbr	" , 1 );
722*762Speter 	putprintf( PREFIXFORMAT , 0 , prefix , label );
723*762Speter     }
724*762Speter 
725*762Speter     /*
726*762Speter      *	another version of put to catch calls to put
727*762Speter      */
728*762Speter put( arg1 , arg2 )
729*762Speter     {
730*762Speter 
731*762Speter 	putprintf( "#	PUT CALLED!: arg1 = %d arg2 = 0%o" , 0 , arg1 , arg2 );
732*762Speter     }
733*762Speter 
734*762Speter #endif PC
735