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