Annotation of 42BSD/ucb/pascal/src/p2put.c, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.