1762Speter /* Copyright (c) 1979 Regents of the University of California */ 2762Speter 3*11329Speter static char sccsid[] = "@(#)p2put.c 1.13 02/28/83"; 4762Speter 5762Speter /* 6762Speter * functions to help pi put out 7762Speter * polish postfix binary portable c compiler intermediate code 8762Speter * thereby becoming the portable pascal compiler 9762Speter */ 10762Speter 11762Speter #include "whoami.h" 12762Speter #ifdef PC 13762Speter #include "0.h" 1410653Speter #include "objfmt.h" 15762Speter #include "pcops.h" 16762Speter #include "pc.h" 1710653Speter #include "align.h" 18*11329Speter #include "tmps.h" 19762Speter 20762Speter /* 21762Speter * mash into f77's format 22762Speter * lovely, isn't it? 23762Speter */ 24762Speter #define TOF77( fop,val,rest ) ( ( ( (rest) & 0177777 ) << 16 ) \ 25762Speter | ( ( (val) & 0377 ) << 8 ) \ 26762Speter | ( (fop) & 0377 ) ) 27762Speter 28762Speter /* 29762Speter * emits an ftext operator and a string to the pcstream 30762Speter */ 31762Speter puttext( string ) 32762Speter char *string; 33762Speter { 34762Speter int length = str4len( string ); 35762Speter 363316Speter if ( !CGENNING ) 37762Speter return; 38762Speter p2word( TOF77( P2FTEXT , length , 0 ) ); 39762Speter # ifdef DEBUG 40762Speter if ( opt( 'k' ) ) { 41762Speter fprintf( stdout , "P2FTEXT | %3d | 0 " , length ); 42762Speter } 43762Speter # endif 44762Speter p2string( string ); 45762Speter } 46762Speter 47762Speter int 48762Speter str4len( string ) 49762Speter char *string; 50762Speter { 51762Speter 52762Speter return ( ( strlen( string ) + 3 ) / 4 ); 53762Speter } 54762Speter 55762Speter /* 56762Speter * put formatted text into a buffer for printing to the pcstream. 57762Speter * a call to putpflush actually puts out the text. 58762Speter * none of arg1 .. arg5 need be present. 59762Speter * and you can add more if you need them. 60762Speter */ 61762Speter /* VARARGS */ 62762Speter putprintf( format , incomplete , arg1 , arg2 , arg3 , arg4 , arg5 ) 63762Speter char *format; 64762Speter int incomplete; 65762Speter { 66762Speter static char ppbuffer[ BUFSIZ ]; 67762Speter static char *ppbufp = ppbuffer; 68762Speter 693316Speter if ( !CGENNING ) 70762Speter return; 71762Speter sprintf( ppbufp , format , arg1 , arg2 , arg3 , arg4 , arg5 ); 72762Speter ppbufp = &( ppbuffer[ strlen( ppbuffer ) ] ); 73762Speter if ( ppbufp >= &( ppbuffer[ BUFSIZ ] ) ) 74762Speter panic( "putprintf" ); 75762Speter if ( ! incomplete ) { 76762Speter puttext( ppbuffer ); 77762Speter ppbufp = ppbuffer; 78762Speter } 79762Speter } 80762Speter 81762Speter /* 82762Speter * emit a left bracket operator to pcstream 83762Speter * with function number, the maximum temp register, and total local bytes 84762Speter */ 85*11329Speter putlbracket(ftnno, sizesp) 86*11329Speter int ftnno; 87*11329Speter struct om *sizesp; 88*11329Speter { 89*11329Speter int maxtempreg; 90*11329Speter int alignedframesize; 91762Speter 92*11329Speter # ifdef vax 93*11329Speter maxtempreg = sizesp->curtmps.next_avail[REG_GENERAL]; 94*11329Speter # endif vax 95*11329Speter # ifdef mc68000 96*11329Speter /* 97*11329Speter * this is a5 and d7 mashed together. 98*11329Speter */ 99*11329Speter maxtempreg = (5 << 4) | (7); 100*11329Speter # endif mc68000 101*11329Speter alignedframesize = 102*11329Speter roundup(BITSPERBYTE * -sizesp->curtmps.om_off, BITSPERBYTE * A_STACK); 103*11329Speter p2word( TOF77( P2FLBRAC , maxtempreg , ftnno ) ); 104*11329Speter p2word(alignedframesize); 105*11329Speter # ifdef DEBUG 106*11329Speter if ( opt( 'k' ) ) { 107*11329Speter fprintf(stdout, "P2FLBRAC | %3d | %d %d\n", 108*11329Speter maxtempreg, ftnno, alignedframesize); 109*11329Speter } 110*11329Speter # endif 111*11329Speter } 112762Speter 113762Speter /* 114762Speter * emit a right bracket operator 115762Speter * which for the binary (fortran) interface 116762Speter * forces the stack allocate and register mask 117762Speter */ 118762Speter putrbracket( ftnno ) 119762Speter int ftnno; 120762Speter { 121762Speter 122762Speter p2word( TOF77( P2FRBRAC , 0 , ftnno ) ); 123762Speter # ifdef DEBUG 124762Speter if ( opt( 'k' ) ) { 125762Speter fprintf( stdout , "P2FRBRAC | 0 | %d\n" , ftnno ); 126762Speter } 127762Speter # endif 128762Speter } 129762Speter 130762Speter /* 131762Speter * emit an eof operator 132762Speter */ 133762Speter puteof() 134762Speter { 135762Speter 136762Speter p2word( P2FEOF ); 137762Speter # ifdef DEBUG 138762Speter if ( opt( 'k' ) ) { 139762Speter fprintf( stdout , "P2FEOF\n" ); 140762Speter } 141762Speter # endif 142762Speter } 143762Speter 144762Speter /* 145762Speter * emit a dot operator, 146762Speter * with a source file line number and name 147762Speter * if line is negative, there was an error on that line, but who cares? 148762Speter */ 149762Speter putdot( filename , line ) 150762Speter char *filename; 151762Speter int line; 152762Speter { 153762Speter int length = str4len( filename ); 154762Speter 155762Speter if ( line < 0 ) { 156762Speter line = -line; 157762Speter } 158762Speter p2word( TOF77( P2FEXPR , length , line ) ); 159762Speter # ifdef DEBUG 160762Speter if ( opt( 'k' ) ) { 161762Speter fprintf( stdout , "P2FEXPR | %3d | %d " , length , line ); 162762Speter } 163762Speter # endif 164762Speter p2string( filename ); 165762Speter } 166762Speter 167762Speter /* 168762Speter * put out a leaf node 169762Speter */ 170762Speter putleaf( op , lval , rval , type , name ) 171762Speter int op; 172762Speter int lval; 173762Speter int rval; 174762Speter int type; 175762Speter char *name; 176762Speter { 1773316Speter if ( !CGENNING ) 178762Speter return; 179762Speter switch ( op ) { 180762Speter default: 181762Speter panic( "[putleaf]" ); 182762Speter case P2ICON: 183762Speter p2word( TOF77( P2ICON , name != NIL , type ) ); 184762Speter p2word( lval ); 185762Speter # ifdef DEBUG 186762Speter if ( opt( 'k' ) ) { 1872474Speter fprintf( stdout , "P2ICON | %3d | 0x%x " 188762Speter , name != NIL , type ); 189762Speter fprintf( stdout , "%d\n" , lval ); 190762Speter } 191762Speter # endif 192762Speter if ( name ) 193762Speter p2name( name ); 194762Speter break; 195762Speter case P2NAME: 196762Speter p2word( TOF77( P2NAME , lval != 0 , type ) ); 197762Speter if ( lval ) 198762Speter p2word( lval ); 199762Speter # ifdef DEBUG 200762Speter if ( opt( 'k' ) ) { 2012474Speter fprintf( stdout , "P2NAME | %3d | 0x%x " 202762Speter , lval != 0 , type ); 203762Speter if ( lval ) 204762Speter fprintf( stdout , "%d " , lval ); 205762Speter } 206762Speter # endif 207762Speter p2name( name ); 208762Speter break; 209762Speter case P2REG: 210762Speter p2word( TOF77( P2REG , rval , type ) ); 211762Speter # ifdef DEBUG 212762Speter if ( opt( 'k' ) ) { 2132474Speter fprintf( stdout , "P2REG | %3d | 0x%x\n" , 2142474Speter rval , type ); 215762Speter } 216762Speter # endif 217762Speter break; 218762Speter } 219762Speter } 220762Speter 221762Speter /* 222762Speter * rvalues are just lvalues with indirection, except 2233829Speter * special cases for registers and for named globals, 2243829Speter * whose names are their rvalues. 225762Speter */ 2267924Smckusick putRV( name , level , offset , other_flags , type ) 227762Speter char *name; 228762Speter int level; 229762Speter int offset; 2307924Smckusick char other_flags; 231762Speter int type; 232762Speter { 233762Speter char extname[ BUFSIZ ]; 234762Speter char *printname; 2353582Speter int regnumber; 236762Speter 2373316Speter if ( !CGENNING ) 238762Speter return; 2397924Smckusick if ( other_flags & NREGVAR ) { 2403829Speter if ( ( offset < 0 ) || ( offset > P2FP ) ) { 2413829Speter panic( "putRV regvar" ); 2423582Speter } 2433829Speter putleaf( P2REG , 0 , offset , type , 0 ); 2443277Smckusic return; 2453277Smckusic } 2467924Smckusick if ( whereis( level , offset , other_flags ) == GLOBALVAR ) { 2473829Speter if ( name != 0 ) { 2483829Speter if ( name[0] != '_' ) { 2493829Speter sprintf( extname , EXTFORMAT , name ); 2503829Speter printname = extname; 2513829Speter } else { 2523829Speter printname = name; 2533829Speter } 2543829Speter putleaf( P2NAME , offset , 0 , type , printname ); 2553829Speter return; 256762Speter } else { 2573829Speter panic( "putRV no name" ); 258762Speter } 259762Speter } 2607924Smckusick putLV( name , level , offset , other_flags , type ); 261762Speter putop( P2UNARY P2MUL , type ); 262762Speter } 263762Speter 264762Speter /* 265762Speter * put out an lvalue 266762Speter * given a level and offset 267762Speter * special case for 268762Speter * named globals, whose lvalues are just their names as constants. 269762Speter */ 2707924Smckusick putLV( name , level , offset , other_flags , type ) 271762Speter char *name; 272762Speter int level; 273762Speter int offset; 2747924Smckusick char other_flags; 275762Speter int type; 2763277Smckusic { 2773277Smckusic char extname[ BUFSIZ ]; 2783277Smckusic char *printname; 279762Speter 2803316Speter if ( !CGENNING ) 2813277Smckusic return; 2827924Smckusick if ( other_flags & NREGVAR ) { 2833829Speter panic( "putLV regvar" ); 284762Speter } 2857924Smckusick switch ( whereis( level , offset , other_flags ) ) { 2863829Speter case GLOBALVAR: 2873829Speter if ( ( name != 0 ) ) { 2883829Speter if ( name[0] != '_' ) { 2893829Speter sprintf( extname , EXTFORMAT , name ); 2903829Speter printname = extname; 2913829Speter } else { 2923829Speter printname = name; 2933829Speter } 2943829Speter putleaf( P2ICON , offset , 0 , ADDTYPE( type , P2PTR ) 2953829Speter , printname ); 2963829Speter return; 2973829Speter } else { 2983829Speter panic( "putLV no name" ); 2993829Speter } 3003277Smckusic case PARAMVAR: 3013277Smckusic if ( level == cbn ) { 3023277Smckusic putleaf( P2REG , 0 , P2AP , ADDTYPE( type , P2PTR ) , 0 ); 3033277Smckusic } else { 3043277Smckusic putleaf( P2NAME , (level * sizeof(struct dispsave)) + AP_OFFSET 3053277Smckusic , 0 , P2PTR | P2CHAR , DISPLAYNAME ); 3069128Smckusick parts[ level ] |= NONLOCALVAR; 3073277Smckusic } 3083277Smckusic putleaf( P2ICON , offset , 0 , P2INT , 0 ); 3093277Smckusic putop( P2PLUS , P2PTR | P2CHAR ); 3103277Smckusic break; 3113277Smckusic case LOCALVAR: 3123277Smckusic if ( level == cbn ) { 3133277Smckusic putleaf( P2REG , 0 , P2FP , ADDTYPE( type , P2PTR ) , 0 ); 3143277Smckusic } else { 3153277Smckusic putleaf( P2NAME , (level * sizeof(struct dispsave)) + FP_OFFSET 3163277Smckusic , 0 , P2PTR | P2CHAR , DISPLAYNAME ); 3179128Smckusick parts[ level ] |= NONLOCALVAR; 3183277Smckusic } 3193277Smckusic putleaf( P2ICON , -offset , 0 , P2INT , 0 ); 3203277Smckusic putop( P2MINUS , P2PTR | P2CHAR ); 3213277Smckusic break; 3229128Smckusick case NAMEDLOCALVAR: 3239128Smckusick if ( level == cbn ) { 3249128Smckusick putleaf( P2REG , 0 , P2FP , ADDTYPE( type , P2PTR ) , 0 ); 3259128Smckusick } else { 3269128Smckusick putleaf( P2NAME , (level * sizeof(struct dispsave)) + FP_OFFSET 3279128Smckusick , 0 , P2PTR | P2CHAR , DISPLAYNAME ); 3289128Smckusick parts[ level ] |= NONLOCALVAR; 3299128Smckusick } 3309128Smckusick putleaf( P2ICON , 0 , 0 , P2INT , name ); 3319128Smckusick putop( P2MINUS , P2PTR | P2CHAR ); 3329128Smckusick break; 3333277Smckusic } 3343277Smckusic return; 3353277Smckusic } 336762Speter 337762Speter /* 338762Speter * put out a floating point constant leaf node 339762Speter * the constant is declared in aligned data space 340762Speter * and a P2NAME leaf put out for it 341762Speter */ 3427924Smckusick putCON8( val ) 3437924Smckusick double val; 344762Speter { 345762Speter int label; 346762Speter char name[ BUFSIZ ]; 347762Speter 3483316Speter if ( !CGENNING ) 349762Speter return; 35010653Speter label = getlab(); 351762Speter putprintf( " .data" , 0 ); 35210653Speter aligndot(A_DOUBLE); 353762Speter putlab( label ); 35410653Speter # ifdef vax 35510653Speter putprintf( " .double 0d%.20e" , 0 , val ); 35610653Speter # endif vax 35710653Speter # ifdef mc68000 35810653Speter putprintf( " .long 0x%x,0x%x", 0, val); 35910653Speter # endif mc68000 360762Speter putprintf( " .text" , 0 ); 361762Speter sprintf( name , PREFIXFORMAT , LABELPREFIX , label ); 362762Speter putleaf( P2NAME , 0 , 0 , P2DOUBLE , name ); 363762Speter } 364762Speter 365762Speter /* 366762Speter * put out either an lvalue or an rvalue for a constant string. 367762Speter * an lvalue (for assignment rhs's) is the name as a constant, 368762Speter * an rvalue (for parameters) is just the name. 369762Speter */ 370762Speter putCONG( string , length , required ) 371762Speter char *string; 372762Speter int length; 373762Speter int required; 374762Speter { 375762Speter char name[ BUFSIZ ]; 376762Speter int label; 377762Speter char *cp; 378762Speter int pad; 379762Speter int others; 380762Speter 3813316Speter if ( !CGENNING ) 382762Speter return; 383762Speter putprintf( " .data" , 0 ); 38410653Speter aligndot(A_STRUCT); 385762Speter label = getlab(); 386762Speter putlab( label ); 387762Speter cp = string; 388762Speter while ( *cp ) { 389762Speter putprintf( " .byte 0%o" , 1 , *cp ++ ); 390762Speter for ( others = 2 ; ( others <= 8 ) && *cp ; others ++ ) { 391762Speter putprintf( ",0%o" , 1 , *cp++ ); 392762Speter } 393762Speter putprintf( "" , 0 ); 394762Speter } 395762Speter pad = length - strlen( string ); 396762Speter while ( pad-- > 0 ) { 397762Speter putprintf( " .byte 0%o" , 1 , ' ' ); 398762Speter for ( others = 2 ; ( others <= 8 ) && ( pad-- > 0 ) ; others++ ) { 399762Speter putprintf( ",0%o" , 1 , ' ' ); 400762Speter } 401762Speter putprintf( "" , 0 ); 402762Speter } 403762Speter putprintf( " .byte 0" , 0 ); 404762Speter putprintf( " .text" , 0 ); 405762Speter sprintf( name , PREFIXFORMAT , LABELPREFIX , label ); 406762Speter if ( required == RREQ ) { 407762Speter putleaf( P2NAME , 0 , 0 , P2ARY | P2CHAR , name ); 408762Speter } else { 409762Speter putleaf( P2ICON , 0 , 0 , P2PTR | P2CHAR , name ); 410762Speter } 411762Speter } 412762Speter 413762Speter /* 414762Speter * map a pascal type to a c type 415762Speter * this would be tail recursive, but i unfolded it into a for (;;). 416762Speter * this is sort of like isa and lwidth 417762Speter * a note on the types used by the portable c compiler: 418762Speter * they are divided into a basic type (char, short, int, long, etc.) 419762Speter * and qualifications on those basic types (pointer, function, array). 420762Speter * the basic type is kept in the low 4 bits of the type descriptor, 421762Speter * and the qualifications are arranged in two bit chunks, with the 422762Speter * most significant on the right, 423762Speter * and the least significant on the left 424762Speter * e.g. int *foo(); 425762Speter * (a function returning a pointer to an integer) 426762Speter * is stored as 427762Speter * <ptr><ftn><int> 428762Speter * so, we build types recursively 4291478Speter * also, we know that /lib/f1 can only deal with 6 qualifications 4301478Speter * so we stop the recursion there. this stops infinite type recursion 4311478Speter * through mutually recursive pointer types. 432762Speter */ 4331478Speter #define MAXQUALS 6 434762Speter int 435762Speter p2type( np ) 4361478Speter { 4371478Speter 4381478Speter return typerecur( np , 0 ); 4391478Speter } 4401478Speter typerecur( np , quals ) 4411478Speter struct nl *np; 4421478Speter int quals; 443762Speter { 444762Speter 4451478Speter if ( np == NIL || quals > MAXQUALS ) { 4461478Speter return P2UNDEF; 4471478Speter } 448762Speter switch ( np -> class ) { 449762Speter case SCAL : 450762Speter case RANGE : 451762Speter if ( np -> type == ( nl + TDOUBLE ) ) { 452762Speter return P2DOUBLE; 453762Speter } 454762Speter switch ( bytes( np -> range[0] , np -> range[1] ) ) { 455762Speter case 1: 456762Speter return P2CHAR; 457762Speter case 2: 458762Speter return P2SHORT; 459762Speter case 4: 460762Speter return P2INT; 461762Speter default: 462762Speter panic( "p2type int" ); 463762Speter } 464762Speter case STR : 465762Speter return ( P2ARY | P2CHAR ); 466762Speter case RECORD : 467762Speter case SET : 468762Speter return P2STRTY; 469762Speter case FILET : 470762Speter return ( P2PTR | P2STRTY ); 471762Speter case CONST : 472762Speter case VAR : 473762Speter case FIELD : 474762Speter return p2type( np -> type ); 475762Speter case TYPE : 476762Speter switch ( nloff( np ) ) { 477762Speter case TNIL : 4781478Speter return ( P2PTR | P2UNDEF ); 479762Speter case TSTR : 480762Speter return ( P2ARY | P2CHAR ); 481762Speter case TSET : 482762Speter return P2STRTY; 483762Speter default : 484762Speter return ( p2type( np -> type ) ); 485762Speter } 486762Speter case REF: 487762Speter case WITHPTR: 488762Speter case PTR : 4891478Speter return ADDTYPE( typerecur( np -> type , quals + 1 ) , P2PTR ); 490762Speter case ARRAY : 4911478Speter return ADDTYPE( typerecur( np -> type , quals + 1 ) , P2ARY ); 492762Speter case FUNC : 493762Speter /* 494762Speter * functions are really pointers to functions 495762Speter * which return their underlying type. 496762Speter */ 4971478Speter return ADDTYPE( ADDTYPE( typerecur( np -> type , quals + 2 ) , 4981478Speter P2FTN ) , P2PTR ); 499762Speter case PROC : 500762Speter /* 501762Speter * procedures are pointers to functions 502762Speter * which return integers (whether you look at them or not) 503762Speter */ 504762Speter return ADDTYPE( ADDTYPE( P2INT , P2FTN ) , P2PTR ); 5051197Speter case FFUNC : 5061197Speter case FPROC : 5071197Speter /* 5081197Speter * formal procedures and functions are pointers 5091197Speter * to structures which describe their environment. 5101197Speter */ 5112474Speter return ( P2PTR | P2STRTY ); 512762Speter default : 513762Speter panic( "p2type" ); 514762Speter } 515762Speter } 516762Speter 517762Speter /* 518762Speter * add a most significant type modifier to a type 519762Speter */ 520762Speter long 521762Speter addtype( underlying , mtype ) 522762Speter long underlying; 523762Speter long mtype; 524762Speter { 525762Speter return ( ( ( underlying & ~P2BASETYPE ) << P2TYPESHIFT ) 526762Speter | mtype 527762Speter | ( underlying & P2BASETYPE ) ); 528762Speter } 529762Speter 530762Speter /* 531762Speter * put a typed operator to the pcstream 532762Speter */ 533762Speter putop( op , type ) 534762Speter int op; 535762Speter int type; 536762Speter { 537762Speter extern char *p2opnames[]; 538762Speter 5393316Speter if ( !CGENNING ) 540762Speter return; 541762Speter p2word( TOF77( op , 0 , type ) ); 542762Speter # ifdef DEBUG 543762Speter if ( opt( 'k' ) ) { 5442474Speter fprintf( stdout , "%s (%d) | 0 | 0x%x\n" 545762Speter , p2opnames[ op ] , op , type ); 546762Speter } 547762Speter # endif 548762Speter } 549762Speter 550762Speter /* 551762Speter * put out a structure operator (STASG, STARG, STCALL, UNARY STCALL ) 552762Speter * which looks just like a regular operator, only the size and 553762Speter * alignment go in the next consecutive words 554762Speter */ 555762Speter putstrop( op , type , size , alignment ) 556762Speter int op; 557762Speter int type; 558762Speter int size; 559762Speter int alignment; 560762Speter { 561762Speter extern char *p2opnames[]; 562762Speter 5633316Speter if ( !CGENNING ) 564762Speter return; 565762Speter p2word( TOF77( op , 0 , type ) ); 566762Speter p2word( size ); 567762Speter p2word( alignment ); 568762Speter # ifdef DEBUG 569762Speter if ( opt( 'k' ) ) { 5702474Speter fprintf( stdout , "%s (%d) | 0 | 0x%x %d %d\n" 571762Speter , p2opnames[ op ] , op , type , size , alignment ); 572762Speter } 573762Speter # endif 574762Speter } 575762Speter 576762Speter /* 577762Speter * the string names of p2ops 578762Speter */ 579762Speter char *p2opnames[] = { 580762Speter "", 581762Speter "P2UNDEFINED", /* 1 */ 582762Speter "P2NAME", /* 2 */ 583762Speter "P2STRING", /* 3 */ 584762Speter "P2ICON", /* 4 */ 585762Speter "P2FCON", /* 5 */ 586762Speter "P2PLUS", /* 6 */ 587762Speter "", 588762Speter "P2MINUS", /* 8 also unary == P2NEG */ 589762Speter "", 590762Speter "P2NEG", 591762Speter "P2MUL", /* 11 also unary == P2INDIRECT */ 592762Speter "", 593762Speter "P2INDIRECT", 594762Speter "P2AND", /* 14 also unary == P2ADDROF */ 595762Speter "", 596762Speter "P2ADDROF", 597762Speter "P2OR", /* 17 */ 598762Speter "", 599762Speter "P2ER", /* 19 */ 600762Speter "", 601762Speter "P2QUEST", /* 21 */ 602762Speter "P2COLON", /* 22 */ 603762Speter "P2ANDAND", /* 23 */ 604762Speter "P2OROR", /* 24 */ 605762Speter "", /* 25 */ 606762Speter "", /* 26 */ 607762Speter "", /* 27 */ 608762Speter "", /* 28 */ 609762Speter "", /* 29 */ 610762Speter "", /* 30 */ 611762Speter "", /* 31 */ 612762Speter "", /* 32 */ 613762Speter "", /* 33 */ 614762Speter "", /* 34 */ 615762Speter "", /* 35 */ 616762Speter "", /* 36 */ 617762Speter "", /* 37 */ 618762Speter "", /* 38 */ 619762Speter "", /* 39 */ 620762Speter "", /* 40 */ 621762Speter "", /* 41 */ 622762Speter "", /* 42 */ 623762Speter "", /* 43 */ 624762Speter "", /* 44 */ 625762Speter "", /* 45 */ 626762Speter "", /* 46 */ 627762Speter "", /* 47 */ 628762Speter "", /* 48 */ 629762Speter "", /* 49 */ 630762Speter "", /* 50 */ 631762Speter "", /* 51 */ 632762Speter "", /* 52 */ 633762Speter "", /* 53 */ 634762Speter "", /* 54 */ 635762Speter "", /* 55 */ 636762Speter "P2LISTOP", /* 56 */ 637762Speter "", 638762Speter "P2ASSIGN", /* 58 */ 639762Speter "P2COMOP", /* 59 */ 640762Speter "P2DIV", /* 60 */ 641762Speter "", 642762Speter "P2MOD", /* 62 */ 643762Speter "", 644762Speter "P2LS", /* 64 */ 645762Speter "", 646762Speter "P2RS", /* 66 */ 647762Speter "", 648762Speter "P2DOT", /* 68 */ 649762Speter "P2STREF", /* 69 */ 650762Speter "P2CALL", /* 70 also unary */ 651762Speter "", 652762Speter "P2UNARYCALL", 653762Speter "P2FORTCALL", /* 73 also unary */ 654762Speter "", 655762Speter "P2UNARYFORTCALL", 656762Speter "P2NOT", /* 76 */ 657762Speter "P2COMPL", /* 77 */ 658762Speter "P2INCR", /* 78 */ 659762Speter "P2DECR", /* 79 */ 660762Speter "P2EQ", /* 80 */ 661762Speter "P2NE", /* 81 */ 662762Speter "P2LE", /* 82 */ 663762Speter "P2LT", /* 83 */ 664762Speter "P2GE", /* 84 */ 665762Speter "P2GT", /* 85 */ 666762Speter "P2ULE", /* 86 */ 667762Speter "P2ULT", /* 87 */ 668762Speter "P2UGE", /* 88 */ 669762Speter "P2UGT", /* 89 */ 670762Speter "P2SETBIT", /* 90 */ 671762Speter "P2TESTBIT", /* 91 */ 672762Speter "P2RESETBIT", /* 92 */ 673762Speter "P2ARS", /* 93 */ 674762Speter "P2REG", /* 94 */ 675762Speter "P2OREG", /* 95 */ 676762Speter "P2CCODES", /* 96 */ 677762Speter "P2FREE", /* 97 */ 678762Speter "P2STASG", /* 98 */ 679762Speter "P2STARG", /* 99 */ 680762Speter "P2STCALL", /* 100 also unary */ 681762Speter "", 682762Speter "P2UNARYSTCALL", 683762Speter "P2FLD", /* 103 */ 684762Speter "P2SCONV", /* 104 */ 685762Speter "P2PCONV", /* 105 */ 686762Speter "P2PMCONV", /* 106 */ 687762Speter "P2PVCONV", /* 107 */ 688762Speter "P2FORCE", /* 108 */ 689762Speter "P2CBRANCH", /* 109 */ 690762Speter "P2INIT", /* 110 */ 691762Speter "P2CAST", /* 111 */ 692762Speter }; 693762Speter 694762Speter /* 695762Speter * low level routines 696762Speter */ 697762Speter 698762Speter /* 699762Speter * puts a long word on the pcstream 700762Speter */ 701762Speter p2word( word ) 702762Speter long word; 703762Speter { 704762Speter 705762Speter putw( word , pcstream ); 706762Speter } 707762Speter 708762Speter /* 709762Speter * put a length 0 mod 4 null padded string onto the pcstream 710762Speter */ 711762Speter p2string( string ) 712762Speter char *string; 713762Speter { 714762Speter int slen = strlen( string ); 715762Speter int wlen = ( slen + 3 ) / 4; 716762Speter int plen = ( wlen * 4 ) - slen; 717762Speter char *cp; 718762Speter int p; 719762Speter 720762Speter for ( cp = string ; *cp ; cp++ ) 721762Speter putc( *cp , pcstream ); 722762Speter for ( p = 1 ; p <= plen ; p++ ) 723762Speter putc( '\0' , pcstream ); 724762Speter # ifdef DEBUG 725762Speter if ( opt( 'k' ) ) { 726762Speter fprintf( stdout , "\"%s" , string ); 727762Speter for ( p = 1 ; p <= plen ; p++ ) 728762Speter fprintf( stdout , "\\0" ); 729762Speter fprintf( stdout , "\"\n" ); 730762Speter } 731762Speter # endif 732762Speter } 733762Speter 734762Speter /* 735762Speter * puts a name on the pcstream 736762Speter */ 737762Speter p2name( name ) 738762Speter char *name; 739762Speter { 740762Speter int pad; 741762Speter 742762Speter fprintf( pcstream , NAMEFORMAT , name ); 743762Speter pad = strlen( name ) % sizeof (long); 744762Speter for ( ; pad < sizeof (long) ; pad++ ) { 745762Speter putc( '\0' , pcstream ); 746762Speter } 747762Speter # ifdef DEBUG 748762Speter if ( opt( 'k' ) ) { 749762Speter fprintf( stdout , NAMEFORMAT , name ); 750762Speter pad = strlen( name ) % sizeof (long); 751762Speter for ( ; pad < sizeof (long) ; pad++ ) { 752762Speter fprintf( stdout , "\\0" ); 753762Speter } 754762Speter fprintf( stdout , "\n" ); 755762Speter } 756762Speter # endif 757762Speter } 758762Speter 759762Speter /* 760762Speter * put out a jump to a label 761762Speter */ 762762Speter putjbr( label ) 763762Speter long label; 764762Speter { 765762Speter 766762Speter printjbr( LABELPREFIX , label ); 767762Speter } 768762Speter 769762Speter /* 770762Speter * put out a jump to any kind of label 771762Speter */ 772762Speter printjbr( prefix , label ) 773762Speter char *prefix; 774762Speter long label; 775762Speter { 776762Speter 77710653Speter # ifdef vax 77810653Speter putprintf( " jbr " , 1 ); 77910653Speter putprintf( PREFIXFORMAT , 0 , prefix , label ); 78010653Speter # endif vax 78110653Speter # ifdef mc68000 78210653Speter putprintf( " jra " , 1 ); 78310653Speter putprintf( PREFIXFORMAT , 0 , prefix , label ); 78410653Speter # endif mc68000 785762Speter } 786762Speter 787762Speter /* 788762Speter * another version of put to catch calls to put 789762Speter */ 790762Speter put( arg1 , arg2 ) 791762Speter { 792762Speter 79310653Speter panic("put()"); 794762Speter } 795762Speter 796762Speter #endif PC 797