1762Speter /* Copyright (c) 1979 Regents of the University of California */ 2762Speter 3*9128Smckusick static char sccsid[] = "@(#)p2put.c 1.11 11/11/82"; 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" 14762Speter #include "pcops.h" 15762Speter #include "pc.h" 16762Speter 17762Speter /* 18762Speter * mash into f77's format 19762Speter * lovely, isn't it? 20762Speter */ 21762Speter #define TOF77( fop,val,rest ) ( ( ( (rest) & 0177777 ) << 16 ) \ 22762Speter | ( ( (val) & 0377 ) << 8 ) \ 23762Speter | ( (fop) & 0377 ) ) 24762Speter 25762Speter /* 26762Speter * emits an ftext operator and a string to the pcstream 27762Speter */ 28762Speter puttext( string ) 29762Speter char *string; 30762Speter { 31762Speter int length = str4len( string ); 32762Speter 333316Speter if ( !CGENNING ) 34762Speter return; 35762Speter p2word( TOF77( P2FTEXT , length , 0 ) ); 36762Speter # ifdef DEBUG 37762Speter if ( opt( 'k' ) ) { 38762Speter fprintf( stdout , "P2FTEXT | %3d | 0 " , length ); 39762Speter } 40762Speter # endif 41762Speter p2string( string ); 42762Speter } 43762Speter 44762Speter int 45762Speter str4len( string ) 46762Speter char *string; 47762Speter { 48762Speter 49762Speter return ( ( strlen( string ) + 3 ) / 4 ); 50762Speter } 51762Speter 52762Speter /* 53762Speter * put formatted text into a buffer for printing to the pcstream. 54762Speter * a call to putpflush actually puts out the text. 55762Speter * none of arg1 .. arg5 need be present. 56762Speter * and you can add more if you need them. 57762Speter */ 58762Speter /* VARARGS */ 59762Speter putprintf( format , incomplete , arg1 , arg2 , arg3 , arg4 , arg5 ) 60762Speter char *format; 61762Speter int incomplete; 62762Speter { 63762Speter static char ppbuffer[ BUFSIZ ]; 64762Speter static char *ppbufp = ppbuffer; 65762Speter 663316Speter if ( !CGENNING ) 67762Speter return; 68762Speter sprintf( ppbufp , format , arg1 , arg2 , arg3 , arg4 , arg5 ); 69762Speter ppbufp = &( ppbuffer[ strlen( ppbuffer ) ] ); 70762Speter if ( ppbufp >= &( ppbuffer[ BUFSIZ ] ) ) 71762Speter panic( "putprintf" ); 72762Speter if ( ! incomplete ) { 73762Speter puttext( ppbuffer ); 74762Speter ppbufp = ppbuffer; 75762Speter } 76762Speter } 77762Speter 78762Speter /* 79762Speter * emit a left bracket operator to pcstream 80762Speter * with function number, the maximum temp register, and total local bytes 81762Speter * until i figure out how to use them, regs 0 .. 11 are free. 82762Speter * one idea for one reg is to save the display pointer on block entry 83762Speter */ 84762Speter putlbracket( ftnno , localbytes ) 85762Speter int ftnno; 86762Speter int localbytes; 87762Speter { 88762Speter # define MAXTP2REG 11 89762Speter 90762Speter p2word( TOF77( P2FLBRAC , MAXTP2REG , ftnno ) ); 91762Speter p2word( BITSPERBYTE * localbytes ); 92762Speter # ifdef DEBUG 93762Speter if ( opt( 'k' ) ) { 94762Speter fprintf( stdout 95762Speter , "P2FLBRAC | %3d | %d " , MAXTP2REG , ftnno ); 96762Speter fprintf( stdout , "%d\n" 97762Speter , BITSPERBYTE * localbytes ); 98762Speter } 99762Speter # endif 100762Speter } 101762Speter 102762Speter /* 103762Speter * emit a right bracket operator 104762Speter * which for the binary (fortran) interface 105762Speter * forces the stack allocate and register mask 106762Speter */ 107762Speter putrbracket( ftnno ) 108762Speter int ftnno; 109762Speter { 110762Speter 111762Speter p2word( TOF77( P2FRBRAC , 0 , ftnno ) ); 112762Speter # ifdef DEBUG 113762Speter if ( opt( 'k' ) ) { 114762Speter fprintf( stdout , "P2FRBRAC | 0 | %d\n" , ftnno ); 115762Speter } 116762Speter # endif 117762Speter } 118762Speter 119762Speter /* 120762Speter * emit an eof operator 121762Speter */ 122762Speter puteof() 123762Speter { 124762Speter 125762Speter p2word( P2FEOF ); 126762Speter # ifdef DEBUG 127762Speter if ( opt( 'k' ) ) { 128762Speter fprintf( stdout , "P2FEOF\n" ); 129762Speter } 130762Speter # endif 131762Speter } 132762Speter 133762Speter /* 134762Speter * emit a dot operator, 135762Speter * with a source file line number and name 136762Speter * if line is negative, there was an error on that line, but who cares? 137762Speter */ 138762Speter putdot( filename , line ) 139762Speter char *filename; 140762Speter int line; 141762Speter { 142762Speter int length = str4len( filename ); 143762Speter 144762Speter if ( line < 0 ) { 145762Speter line = -line; 146762Speter } 147762Speter p2word( TOF77( P2FEXPR , length , line ) ); 148762Speter # ifdef DEBUG 149762Speter if ( opt( 'k' ) ) { 150762Speter fprintf( stdout , "P2FEXPR | %3d | %d " , length , line ); 151762Speter } 152762Speter # endif 153762Speter p2string( filename ); 154762Speter } 155762Speter 156762Speter /* 157762Speter * put out a leaf node 158762Speter */ 159762Speter putleaf( op , lval , rval , type , name ) 160762Speter int op; 161762Speter int lval; 162762Speter int rval; 163762Speter int type; 164762Speter char *name; 165762Speter { 1663316Speter if ( !CGENNING ) 167762Speter return; 168762Speter switch ( op ) { 169762Speter default: 170762Speter panic( "[putleaf]" ); 171762Speter case P2ICON: 172762Speter p2word( TOF77( P2ICON , name != NIL , type ) ); 173762Speter p2word( lval ); 174762Speter # ifdef DEBUG 175762Speter if ( opt( 'k' ) ) { 1762474Speter fprintf( stdout , "P2ICON | %3d | 0x%x " 177762Speter , name != NIL , type ); 178762Speter fprintf( stdout , "%d\n" , lval ); 179762Speter } 180762Speter # endif 181762Speter if ( name ) 182762Speter p2name( name ); 183762Speter break; 184762Speter case P2NAME: 185762Speter p2word( TOF77( P2NAME , lval != 0 , type ) ); 186762Speter if ( lval ) 187762Speter p2word( lval ); 188762Speter # ifdef DEBUG 189762Speter if ( opt( 'k' ) ) { 1902474Speter fprintf( stdout , "P2NAME | %3d | 0x%x " 191762Speter , lval != 0 , type ); 192762Speter if ( lval ) 193762Speter fprintf( stdout , "%d " , lval ); 194762Speter } 195762Speter # endif 196762Speter p2name( name ); 197762Speter break; 198762Speter case P2REG: 199762Speter p2word( TOF77( P2REG , rval , type ) ); 200762Speter # ifdef DEBUG 201762Speter if ( opt( 'k' ) ) { 2022474Speter fprintf( stdout , "P2REG | %3d | 0x%x\n" , 2032474Speter rval , type ); 204762Speter } 205762Speter # endif 206762Speter break; 207762Speter } 208762Speter } 209762Speter 210762Speter /* 211762Speter * rvalues are just lvalues with indirection, except 2123829Speter * special cases for registers and for named globals, 2133829Speter * whose names are their rvalues. 214762Speter */ 2157924Smckusick putRV( name , level , offset , other_flags , type ) 216762Speter char *name; 217762Speter int level; 218762Speter int offset; 2197924Smckusick char other_flags; 220762Speter int type; 221762Speter { 222762Speter char extname[ BUFSIZ ]; 223762Speter char *printname; 2243582Speter int regnumber; 225762Speter 2263316Speter if ( !CGENNING ) 227762Speter return; 2287924Smckusick if ( other_flags & NREGVAR ) { 2293829Speter if ( ( offset < 0 ) || ( offset > P2FP ) ) { 2303829Speter panic( "putRV regvar" ); 2313582Speter } 2323829Speter putleaf( P2REG , 0 , offset , type , 0 ); 2333277Smckusic return; 2343277Smckusic } 2357924Smckusick if ( whereis( level , offset , other_flags ) == GLOBALVAR ) { 2363829Speter if ( name != 0 ) { 2373829Speter if ( name[0] != '_' ) { 2383829Speter sprintf( extname , EXTFORMAT , name ); 2393829Speter printname = extname; 2403829Speter } else { 2413829Speter printname = name; 2423829Speter } 2433829Speter putleaf( P2NAME , offset , 0 , type , printname ); 2443829Speter return; 245762Speter } else { 2463829Speter panic( "putRV no name" ); 247762Speter } 248762Speter } 2497924Smckusick putLV( name , level , offset , other_flags , type ); 250762Speter putop( P2UNARY P2MUL , type ); 251762Speter } 252762Speter 253762Speter /* 254762Speter * put out an lvalue 255762Speter * given a level and offset 256762Speter * special case for 257762Speter * named globals, whose lvalues are just their names as constants. 258762Speter */ 2597924Smckusick putLV( name , level , offset , other_flags , type ) 260762Speter char *name; 261762Speter int level; 262762Speter int offset; 2637924Smckusick char other_flags; 264762Speter int type; 2653277Smckusic { 2663277Smckusic char extname[ BUFSIZ ]; 2673277Smckusic char *printname; 268762Speter 2693316Speter if ( !CGENNING ) 2703277Smckusic return; 2717924Smckusick if ( other_flags & NREGVAR ) { 2723829Speter panic( "putLV regvar" ); 273762Speter } 2747924Smckusick switch ( whereis( level , offset , other_flags ) ) { 2753829Speter case GLOBALVAR: 2763829Speter if ( ( name != 0 ) ) { 2773829Speter if ( name[0] != '_' ) { 2783829Speter sprintf( extname , EXTFORMAT , name ); 2793829Speter printname = extname; 2803829Speter } else { 2813829Speter printname = name; 2823829Speter } 2833829Speter putleaf( P2ICON , offset , 0 , ADDTYPE( type , P2PTR ) 2843829Speter , printname ); 2853829Speter return; 2863829Speter } else { 2873829Speter panic( "putLV no name" ); 2883829Speter } 2893277Smckusic case PARAMVAR: 2903277Smckusic if ( level == cbn ) { 2913277Smckusic putleaf( P2REG , 0 , P2AP , ADDTYPE( type , P2PTR ) , 0 ); 2923277Smckusic } else { 2933277Smckusic putleaf( P2NAME , (level * sizeof(struct dispsave)) + AP_OFFSET 2943277Smckusic , 0 , P2PTR | P2CHAR , DISPLAYNAME ); 295*9128Smckusick parts[ level ] |= NONLOCALVAR; 2963277Smckusic } 2973277Smckusic putleaf( P2ICON , offset , 0 , P2INT , 0 ); 2983277Smckusic putop( P2PLUS , P2PTR | P2CHAR ); 2993277Smckusic break; 3003277Smckusic case LOCALVAR: 3013277Smckusic if ( level == cbn ) { 3023277Smckusic putleaf( P2REG , 0 , P2FP , ADDTYPE( type , P2PTR ) , 0 ); 3033277Smckusic } else { 3043277Smckusic putleaf( P2NAME , (level * sizeof(struct dispsave)) + FP_OFFSET 3053277Smckusic , 0 , P2PTR | P2CHAR , DISPLAYNAME ); 306*9128Smckusick parts[ level ] |= NONLOCALVAR; 3073277Smckusic } 3083277Smckusic putleaf( P2ICON , -offset , 0 , P2INT , 0 ); 3093277Smckusic putop( P2MINUS , P2PTR | P2CHAR ); 3103277Smckusic break; 311*9128Smckusick case NAMEDLOCALVAR: 312*9128Smckusick if ( level == cbn ) { 313*9128Smckusick putleaf( P2REG , 0 , P2FP , ADDTYPE( type , P2PTR ) , 0 ); 314*9128Smckusick } else { 315*9128Smckusick putleaf( P2NAME , (level * sizeof(struct dispsave)) + FP_OFFSET 316*9128Smckusick , 0 , P2PTR | P2CHAR , DISPLAYNAME ); 317*9128Smckusick parts[ level ] |= NONLOCALVAR; 318*9128Smckusick } 319*9128Smckusick putleaf( P2ICON , 0 , 0 , P2INT , name ); 320*9128Smckusick putop( P2MINUS , P2PTR | P2CHAR ); 321*9128Smckusick break; 3223277Smckusic } 3233277Smckusic return; 3243277Smckusic } 325762Speter 326762Speter /* 327762Speter * put out a floating point constant leaf node 328762Speter * the constant is declared in aligned data space 329762Speter * and a P2NAME leaf put out for it 330762Speter */ 3317924Smckusick putCON8( val ) 3327924Smckusick double val; 333762Speter { 334762Speter int label; 335762Speter char name[ BUFSIZ ]; 336762Speter 3373316Speter if ( !CGENNING ) 338762Speter return; 339762Speter putprintf( " .data" , 0 ); 340762Speter putprintf( " .align 2" , 0 ); 341762Speter label = getlab(); 342762Speter putlab( label ); 3437924Smckusick putprintf( " .double 0d%.20e" , 0 , val ); 344762Speter putprintf( " .text" , 0 ); 345762Speter sprintf( name , PREFIXFORMAT , LABELPREFIX , label ); 346762Speter putleaf( P2NAME , 0 , 0 , P2DOUBLE , name ); 347762Speter } 348762Speter 349762Speter /* 350762Speter * put out either an lvalue or an rvalue for a constant string. 351762Speter * an lvalue (for assignment rhs's) is the name as a constant, 352762Speter * an rvalue (for parameters) is just the name. 353762Speter */ 354762Speter putCONG( string , length , required ) 355762Speter char *string; 356762Speter int length; 357762Speter int required; 358762Speter { 359762Speter char name[ BUFSIZ ]; 360762Speter int label; 361762Speter char *cp; 362762Speter int pad; 363762Speter int others; 364762Speter 3653316Speter if ( !CGENNING ) 366762Speter return; 367762Speter putprintf( " .data" , 0 ); 368762Speter label = getlab(); 369762Speter putlab( label ); 370762Speter cp = string; 371762Speter while ( *cp ) { 372762Speter putprintf( " .byte 0%o" , 1 , *cp ++ ); 373762Speter for ( others = 2 ; ( others <= 8 ) && *cp ; others ++ ) { 374762Speter putprintf( ",0%o" , 1 , *cp++ ); 375762Speter } 376762Speter putprintf( "" , 0 ); 377762Speter } 378762Speter pad = length - strlen( string ); 379762Speter while ( pad-- > 0 ) { 380762Speter putprintf( " .byte 0%o" , 1 , ' ' ); 381762Speter for ( others = 2 ; ( others <= 8 ) && ( pad-- > 0 ) ; others++ ) { 382762Speter putprintf( ",0%o" , 1 , ' ' ); 383762Speter } 384762Speter putprintf( "" , 0 ); 385762Speter } 386762Speter putprintf( " .byte 0" , 0 ); 387762Speter putprintf( " .text" , 0 ); 388762Speter sprintf( name , PREFIXFORMAT , LABELPREFIX , label ); 389762Speter if ( required == RREQ ) { 390762Speter putleaf( P2NAME , 0 , 0 , P2ARY | P2CHAR , name ); 391762Speter } else { 392762Speter putleaf( P2ICON , 0 , 0 , P2PTR | P2CHAR , name ); 393762Speter } 394762Speter } 395762Speter 396762Speter /* 397762Speter * map a pascal type to a c type 398762Speter * this would be tail recursive, but i unfolded it into a for (;;). 399762Speter * this is sort of like isa and lwidth 400762Speter * a note on the types used by the portable c compiler: 401762Speter * they are divided into a basic type (char, short, int, long, etc.) 402762Speter * and qualifications on those basic types (pointer, function, array). 403762Speter * the basic type is kept in the low 4 bits of the type descriptor, 404762Speter * and the qualifications are arranged in two bit chunks, with the 405762Speter * most significant on the right, 406762Speter * and the least significant on the left 407762Speter * e.g. int *foo(); 408762Speter * (a function returning a pointer to an integer) 409762Speter * is stored as 410762Speter * <ptr><ftn><int> 411762Speter * so, we build types recursively 4121478Speter * also, we know that /lib/f1 can only deal with 6 qualifications 4131478Speter * so we stop the recursion there. this stops infinite type recursion 4141478Speter * through mutually recursive pointer types. 415762Speter */ 4161478Speter #define MAXQUALS 6 417762Speter int 418762Speter p2type( np ) 4191478Speter { 4201478Speter 4211478Speter return typerecur( np , 0 ); 4221478Speter } 4231478Speter typerecur( np , quals ) 4241478Speter struct nl *np; 4251478Speter int quals; 426762Speter { 427762Speter 4281478Speter if ( np == NIL || quals > MAXQUALS ) { 4291478Speter return P2UNDEF; 4301478Speter } 431762Speter switch ( np -> class ) { 432762Speter case SCAL : 433762Speter case RANGE : 434762Speter if ( np -> type == ( nl + TDOUBLE ) ) { 435762Speter return P2DOUBLE; 436762Speter } 437762Speter switch ( bytes( np -> range[0] , np -> range[1] ) ) { 438762Speter case 1: 439762Speter return P2CHAR; 440762Speter case 2: 441762Speter return P2SHORT; 442762Speter case 4: 443762Speter return P2INT; 444762Speter default: 445762Speter panic( "p2type int" ); 446762Speter } 447762Speter case STR : 448762Speter return ( P2ARY | P2CHAR ); 449762Speter case RECORD : 450762Speter case SET : 451762Speter return P2STRTY; 452762Speter case FILET : 453762Speter return ( P2PTR | P2STRTY ); 454762Speter case CONST : 455762Speter case VAR : 456762Speter case FIELD : 457762Speter return p2type( np -> type ); 458762Speter case TYPE : 459762Speter switch ( nloff( np ) ) { 460762Speter case TNIL : 4611478Speter return ( P2PTR | P2UNDEF ); 462762Speter case TSTR : 463762Speter return ( P2ARY | P2CHAR ); 464762Speter case TSET : 465762Speter return P2STRTY; 466762Speter default : 467762Speter return ( p2type( np -> type ) ); 468762Speter } 469762Speter case REF: 470762Speter case WITHPTR: 471762Speter case PTR : 4721478Speter return ADDTYPE( typerecur( np -> type , quals + 1 ) , P2PTR ); 473762Speter case ARRAY : 4741478Speter return ADDTYPE( typerecur( np -> type , quals + 1 ) , P2ARY ); 475762Speter case FUNC : 476762Speter /* 477762Speter * functions are really pointers to functions 478762Speter * which return their underlying type. 479762Speter */ 4801478Speter return ADDTYPE( ADDTYPE( typerecur( np -> type , quals + 2 ) , 4811478Speter P2FTN ) , P2PTR ); 482762Speter case PROC : 483762Speter /* 484762Speter * procedures are pointers to functions 485762Speter * which return integers (whether you look at them or not) 486762Speter */ 487762Speter return ADDTYPE( ADDTYPE( P2INT , P2FTN ) , P2PTR ); 4881197Speter case FFUNC : 4891197Speter case FPROC : 4901197Speter /* 4911197Speter * formal procedures and functions are pointers 4921197Speter * to structures which describe their environment. 4931197Speter */ 4942474Speter return ( P2PTR | P2STRTY ); 495762Speter default : 496762Speter panic( "p2type" ); 497762Speter } 498762Speter } 499762Speter 500762Speter /* 501762Speter * add a most significant type modifier to a type 502762Speter */ 503762Speter long 504762Speter addtype( underlying , mtype ) 505762Speter long underlying; 506762Speter long mtype; 507762Speter { 508762Speter return ( ( ( underlying & ~P2BASETYPE ) << P2TYPESHIFT ) 509762Speter | mtype 510762Speter | ( underlying & P2BASETYPE ) ); 511762Speter } 512762Speter 513762Speter /* 514762Speter * put a typed operator to the pcstream 515762Speter */ 516762Speter putop( op , type ) 517762Speter int op; 518762Speter int type; 519762Speter { 520762Speter extern char *p2opnames[]; 521762Speter 5223316Speter if ( !CGENNING ) 523762Speter return; 524762Speter p2word( TOF77( op , 0 , type ) ); 525762Speter # ifdef DEBUG 526762Speter if ( opt( 'k' ) ) { 5272474Speter fprintf( stdout , "%s (%d) | 0 | 0x%x\n" 528762Speter , p2opnames[ op ] , op , type ); 529762Speter } 530762Speter # endif 531762Speter } 532762Speter 533762Speter /* 534762Speter * put out a structure operator (STASG, STARG, STCALL, UNARY STCALL ) 535762Speter * which looks just like a regular operator, only the size and 536762Speter * alignment go in the next consecutive words 537762Speter */ 538762Speter putstrop( op , type , size , alignment ) 539762Speter int op; 540762Speter int type; 541762Speter int size; 542762Speter int alignment; 543762Speter { 544762Speter extern char *p2opnames[]; 545762Speter 5463316Speter if ( !CGENNING ) 547762Speter return; 548762Speter p2word( TOF77( op , 0 , type ) ); 549762Speter p2word( size ); 550762Speter p2word( alignment ); 551762Speter # ifdef DEBUG 552762Speter if ( opt( 'k' ) ) { 5532474Speter fprintf( stdout , "%s (%d) | 0 | 0x%x %d %d\n" 554762Speter , p2opnames[ op ] , op , type , size , alignment ); 555762Speter } 556762Speter # endif 557762Speter } 558762Speter 559762Speter /* 560762Speter * the string names of p2ops 561762Speter */ 562762Speter char *p2opnames[] = { 563762Speter "", 564762Speter "P2UNDEFINED", /* 1 */ 565762Speter "P2NAME", /* 2 */ 566762Speter "P2STRING", /* 3 */ 567762Speter "P2ICON", /* 4 */ 568762Speter "P2FCON", /* 5 */ 569762Speter "P2PLUS", /* 6 */ 570762Speter "", 571762Speter "P2MINUS", /* 8 also unary == P2NEG */ 572762Speter "", 573762Speter "P2NEG", 574762Speter "P2MUL", /* 11 also unary == P2INDIRECT */ 575762Speter "", 576762Speter "P2INDIRECT", 577762Speter "P2AND", /* 14 also unary == P2ADDROF */ 578762Speter "", 579762Speter "P2ADDROF", 580762Speter "P2OR", /* 17 */ 581762Speter "", 582762Speter "P2ER", /* 19 */ 583762Speter "", 584762Speter "P2QUEST", /* 21 */ 585762Speter "P2COLON", /* 22 */ 586762Speter "P2ANDAND", /* 23 */ 587762Speter "P2OROR", /* 24 */ 588762Speter "", /* 25 */ 589762Speter "", /* 26 */ 590762Speter "", /* 27 */ 591762Speter "", /* 28 */ 592762Speter "", /* 29 */ 593762Speter "", /* 30 */ 594762Speter "", /* 31 */ 595762Speter "", /* 32 */ 596762Speter "", /* 33 */ 597762Speter "", /* 34 */ 598762Speter "", /* 35 */ 599762Speter "", /* 36 */ 600762Speter "", /* 37 */ 601762Speter "", /* 38 */ 602762Speter "", /* 39 */ 603762Speter "", /* 40 */ 604762Speter "", /* 41 */ 605762Speter "", /* 42 */ 606762Speter "", /* 43 */ 607762Speter "", /* 44 */ 608762Speter "", /* 45 */ 609762Speter "", /* 46 */ 610762Speter "", /* 47 */ 611762Speter "", /* 48 */ 612762Speter "", /* 49 */ 613762Speter "", /* 50 */ 614762Speter "", /* 51 */ 615762Speter "", /* 52 */ 616762Speter "", /* 53 */ 617762Speter "", /* 54 */ 618762Speter "", /* 55 */ 619762Speter "P2LISTOP", /* 56 */ 620762Speter "", 621762Speter "P2ASSIGN", /* 58 */ 622762Speter "P2COMOP", /* 59 */ 623762Speter "P2DIV", /* 60 */ 624762Speter "", 625762Speter "P2MOD", /* 62 */ 626762Speter "", 627762Speter "P2LS", /* 64 */ 628762Speter "", 629762Speter "P2RS", /* 66 */ 630762Speter "", 631762Speter "P2DOT", /* 68 */ 632762Speter "P2STREF", /* 69 */ 633762Speter "P2CALL", /* 70 also unary */ 634762Speter "", 635762Speter "P2UNARYCALL", 636762Speter "P2FORTCALL", /* 73 also unary */ 637762Speter "", 638762Speter "P2UNARYFORTCALL", 639762Speter "P2NOT", /* 76 */ 640762Speter "P2COMPL", /* 77 */ 641762Speter "P2INCR", /* 78 */ 642762Speter "P2DECR", /* 79 */ 643762Speter "P2EQ", /* 80 */ 644762Speter "P2NE", /* 81 */ 645762Speter "P2LE", /* 82 */ 646762Speter "P2LT", /* 83 */ 647762Speter "P2GE", /* 84 */ 648762Speter "P2GT", /* 85 */ 649762Speter "P2ULE", /* 86 */ 650762Speter "P2ULT", /* 87 */ 651762Speter "P2UGE", /* 88 */ 652762Speter "P2UGT", /* 89 */ 653762Speter "P2SETBIT", /* 90 */ 654762Speter "P2TESTBIT", /* 91 */ 655762Speter "P2RESETBIT", /* 92 */ 656762Speter "P2ARS", /* 93 */ 657762Speter "P2REG", /* 94 */ 658762Speter "P2OREG", /* 95 */ 659762Speter "P2CCODES", /* 96 */ 660762Speter "P2FREE", /* 97 */ 661762Speter "P2STASG", /* 98 */ 662762Speter "P2STARG", /* 99 */ 663762Speter "P2STCALL", /* 100 also unary */ 664762Speter "", 665762Speter "P2UNARYSTCALL", 666762Speter "P2FLD", /* 103 */ 667762Speter "P2SCONV", /* 104 */ 668762Speter "P2PCONV", /* 105 */ 669762Speter "P2PMCONV", /* 106 */ 670762Speter "P2PVCONV", /* 107 */ 671762Speter "P2FORCE", /* 108 */ 672762Speter "P2CBRANCH", /* 109 */ 673762Speter "P2INIT", /* 110 */ 674762Speter "P2CAST", /* 111 */ 675762Speter }; 676762Speter 677762Speter /* 678762Speter * low level routines 679762Speter */ 680762Speter 681762Speter /* 682762Speter * puts a long word on the pcstream 683762Speter */ 684762Speter p2word( word ) 685762Speter long word; 686762Speter { 687762Speter 688762Speter putw( word , pcstream ); 689762Speter } 690762Speter 691762Speter /* 692762Speter * put a length 0 mod 4 null padded string onto the pcstream 693762Speter */ 694762Speter p2string( string ) 695762Speter char *string; 696762Speter { 697762Speter int slen = strlen( string ); 698762Speter int wlen = ( slen + 3 ) / 4; 699762Speter int plen = ( wlen * 4 ) - slen; 700762Speter char *cp; 701762Speter int p; 702762Speter 703762Speter for ( cp = string ; *cp ; cp++ ) 704762Speter putc( *cp , pcstream ); 705762Speter for ( p = 1 ; p <= plen ; p++ ) 706762Speter putc( '\0' , pcstream ); 707762Speter # ifdef DEBUG 708762Speter if ( opt( 'k' ) ) { 709762Speter fprintf( stdout , "\"%s" , string ); 710762Speter for ( p = 1 ; p <= plen ; p++ ) 711762Speter fprintf( stdout , "\\0" ); 712762Speter fprintf( stdout , "\"\n" ); 713762Speter } 714762Speter # endif 715762Speter } 716762Speter 717762Speter /* 718762Speter * puts a name on the pcstream 719762Speter */ 720762Speter p2name( name ) 721762Speter char *name; 722762Speter { 723762Speter int pad; 724762Speter 725762Speter fprintf( pcstream , NAMEFORMAT , name ); 726762Speter pad = strlen( name ) % sizeof (long); 727762Speter for ( ; pad < sizeof (long) ; pad++ ) { 728762Speter putc( '\0' , pcstream ); 729762Speter } 730762Speter # ifdef DEBUG 731762Speter if ( opt( 'k' ) ) { 732762Speter fprintf( stdout , NAMEFORMAT , name ); 733762Speter pad = strlen( name ) % sizeof (long); 734762Speter for ( ; pad < sizeof (long) ; pad++ ) { 735762Speter fprintf( stdout , "\\0" ); 736762Speter } 737762Speter fprintf( stdout , "\n" ); 738762Speter } 739762Speter # endif 740762Speter } 741762Speter 742762Speter /* 743762Speter * put out a jump to a label 744762Speter */ 745762Speter putjbr( label ) 746762Speter long label; 747762Speter { 748762Speter 749762Speter printjbr( LABELPREFIX , label ); 750762Speter } 751762Speter 752762Speter /* 753762Speter * put out a jump to any kind of label 754762Speter */ 755762Speter printjbr( prefix , label ) 756762Speter char *prefix; 757762Speter long label; 758762Speter { 759762Speter 760762Speter putprintf( " jbr " , 1 ); 761762Speter putprintf( PREFIXFORMAT , 0 , prefix , label ); 762762Speter } 763762Speter 764762Speter /* 765762Speter * another version of put to catch calls to put 766762Speter */ 767762Speter put( arg1 , arg2 ) 768762Speter { 769762Speter 770762Speter putprintf( "# PUT CALLED!: arg1 = %d arg2 = 0%o" , 0 , arg1 , arg2 ); 771762Speter } 772762Speter 773762Speter #endif PC 774