Annotation of 3BSD/cmd/pi/ppc.c, revision 1.1.1.1

1.1       root        1:     /*
                      2:      * functions to help pi put out
                      3:      * polish postfix binary portable c compiler intermediate code
                      4:      * thereby becoming the portable pascal compiler
                      5:      */
                      6: 
                      7: #include       "whoami"
                      8: #ifdef PPC
                      9: #include       "0.h"
                     10: #include       "opcode.h"
                     11: #include       "ppc.h"
                     12: 
                     13:     /*
                     14:      * extract from pi's format
                     15:      */
                     16: #define                FROMPI( nth , word )    ( ( ( word ) >> ( (nth) * 8 ) ) & 0377 )
                     17: 
                     18:     /*
                     19:      * mash into f77's format
                     20:      */
                     21: #define                TOF77( fop,val,rest )   ( ( ( (rest) & 0177777 ) << 16 ) \
                     22:                                        | ( ( (val) & 0377 ) << 8 )      \
                     23:                                        | ( (fop) & 0377 ) )
                     24: 
                     25:     /*
                     26:      * this version of put generates stephen c johnson intermediate code
                     27:      * as modified for the fortran77 compiler, to be both
                     28:      * binary and postfix.
                     29:      * it still uses the address of its argument
                     30:      * as the address of its (variable length) argument list.
                     31:      * the name is changed by a #define for the ctags program.
                     32:      */
                     33: #define        ppcput  put
                     34: ppcput( arglist )
                     35:     {
                     36:        register int    *argp;
                     37:        int             narg;
                     38:        int             op;
                     39:        int             subop;
                     40: 
                     41:            /*
                     42:             * are we not generating code?
                     43:             */
                     44:        if ( cgenflg )
                     45:            return;
                     46:        argp = &arglist;
                     47:        narg = *argp++;
                     48:        op = FROMPI( 0 , *argp );
                     49:        subop = FROMPI( 1 , *argp );
                     50:        putprintf( "#           [put] op = 0%o subop = %d argp[1] = %d"
                     51:                 , op , subop , argp[1] );
                     52:        switch( op ) {
                     53:            default:
                     54:                /*
                     55:                 * panic( "[put] op" );
                     56:                 */
                     57:                putprintf( "#           [put] op ignored" );
                     58:                break;
                     59:            case O_LV:
                     60:                putLV( subop >> 1 , argp[1] , P2PTR | P2INT );
                     61:                break;
                     62:            case O_RV1:
                     63:            case O_RV2:
                     64:            case O_RV4:
                     65:            case O_RV8:
                     66:                putRV( op , subop >> 1 , argp[1] , 0 );
                     67:                break;
                     68:            case O_RV:
                     69:                putRV( op , subop >> 1 , argp[1] , argp[2] );
                     70:                break;
                     71:            case O_CON1:
                     72:            case O_CON2:
                     73:            case O_CON4:
                     74:                putCON( op , argp[1] );
                     75:                break;
                     76:            case O_CON8:
                     77:                putCON( op , *( (double *) &argp[1] ) );
                     78:                break;
                     79:            case O_AS21:
                     80:            case O_AS41:
                     81:            case O_AS2:
                     82:            case O_AS42:
                     83:            case O_AS24:
                     84:            case O_AS4:
                     85:            case O_AS28:
                     86:            case O_AS48:
                     87:            case O_AS8:
                     88:                putAS( op , 0 );
                     89:                break;
                     90:            case O_AS:
                     91:                putAS( op , argp[1] );
                     92:                break;
                     93:            case O_ADD2:
                     94:            case O_ADD42:
                     95:            case O_ADD82:
                     96:            case O_ADD24:
                     97:            case O_ADD4:
                     98:            case O_ADD84:
                     99:            case O_ADD28:
                    100:            case O_ADD48:
                    101:            case O_ADD8:
                    102:                putADD( op );
                    103:                break;
                    104:            case O_SUB2:
                    105:            case O_SUB42:
                    106:            case O_SUB82:
                    107:            case O_SUB24:
                    108:            case O_SUB4:
                    109:            case O_SUB84:
                    110:            case O_SUB28:
                    111:            case O_SUB48:
                    112:            case O_SUB8:
                    113:                putSUB( op );
                    114:                break;
                    115:            case O_MUL2:
                    116:            case O_MUL42:
                    117:            case O_MUL82:
                    118:            case O_MUL24:
                    119:            case O_MUL4:
                    120:            case O_MUL84:
                    121:            case O_MUL28:
                    122:            case O_MUL48:
                    123:            case O_MUL8:
                    124:                putMUL( op );
                    125:                break;
                    126:            case O_DVD2:
                    127:            case O_DVD42:
                    128:            case O_DVD82:
                    129:            case O_DVD24:
                    130:            case O_DVD4:
                    131:            case O_DVD84:
                    132:            case O_DVD28:
                    133:            case O_DVD48:
                    134:            case O_DVD8:
                    135:                putDVD( op );
                    136:                break;
                    137:            case O_DIV2:
                    138:            case O_DIV42:
                    139:            case O_DIV24:
                    140:            case O_DIV4:
                    141:                putDIV( op );
                    142:                break;
                    143:            case O_MOD2:
                    144:            case O_MOD42:
                    145:            case O_MOD24:
                    146:            case O_MOD4:
                    147:                putMOD( op );
                    148:                break;
                    149:        }
                    150:     }
                    151: 
                    152: 
                    153: putLV( level , offset , type )
                    154:     int        level;
                    155:     int        offset;
                    156:     int        type;
                    157:     {
                    158:        if ( level == cbn ) {
                    159:                putleaf( P2REG , 0 , P2FP , P2PTR | P2INT , 0 );
                    160:        } else {
                    161:                putleaf( P2NAME , level * sizeof (int *) , 0 , P2PTR | P2INT 
                    162:                       , "_display" );
                    163:        }
                    164:        putleaf( P2ICON , offset , 0 , P2INT , 0 );
                    165:        putop( P2PLUS , P2PTR | P2INT );
                    166:        putop( P2UNARY P2MUL , type );
                    167:     }
                    168: 
                    169:     /*
                    170:      * an operand, given its level and offset, 
                    171:      * and its length if it is other than 1, 2, 4, or 8
                    172:      */
                    173: putRV( op , level , offset , length )
                    174:     int        op;
                    175:     int        level;
                    176:     int        offset;
                    177:     int        length;
                    178:     {
                    179:        int             type;
                    180: 
                    181:        switch ( op ) {
                    182:            default:
                    183:                panic( "putRV" );
                    184:            case O_RV:
                    185:                /*
                    186:                 * no structures, yet
                    187:                 */
                    188:                panic( "putRV O_RV" );
                    189:            case O_RV1:
                    190:                type = P2CHAR;
                    191:                break;
                    192:            case O_RV2:
                    193:                type = P2SHORT;
                    194:                break;
                    195:            case O_RV4:
                    196:                type = P2LONG;
                    197:                break;
                    198:            case O_RV8:
                    199:                type = P2DOUBLE;
                    200:                break;
                    201:        }
                    202:        putLV( level , offset , type );
                    203:     }
                    204: 
                    205: putCON( op , value )
                    206:     int op;
                    207:     int        value;
                    208:     {
                    209:        int     type;
                    210: 
                    211:        switch( op ) {
                    212:            case O_CON1:
                    213:                type = P2CHAR;
                    214:                break;
                    215:            case O_CON2:
                    216:                type = P2SHORT;
                    217:                break;
                    218:            case O_CON4:
                    219:                type = P2LONG;
                    220:                break;
                    221:            case O_CON8:
                    222:                type = P2DOUBLE;
                    223:                break;
                    224:        }
                    225:        if ( type != P2DOUBLE ) {
                    226:                putleaf( P2ICON , value , 0 , type , 0 );
                    227:        } else {
                    228:                char    name[8];
                    229: 
                    230:                sprintf( name , "D%d" , newlabel() );
                    231:                puttext( "      .data" );
                    232:                puttext( "      .align 2" );
                    233:                putprintf( "%s:" , name );
                    234:                putprintf( "    .double 0d%.20e" , *( (double *) &value ) );
                    235:                puttext( "      .text" );
                    236:                puttext( "      .align 1" );
                    237:                putleaf( P2NAME , 0 , 0 , P2DOUBLE , name );
                    238:        }
                    239:     }
                    240: 
                    241:     /*
                    242:      * generate an assignment
                    243:      * given the length of the destination if not 1, 2, 4, or 8
                    244:      */
                    245: putAS( op , length )
                    246:     int        op;
                    247:     int        length;
                    248:     {
                    249:        int     type;
                    250:        
                    251:        switch ( op ) {
                    252:            default:
                    253:                panic( "[putAS]" );
                    254:            case O_AS:
                    255:                /*
                    256:                 * no structures, yet
                    257:                 */
                    258:                panic( "[putAS] O_AS" );
                    259:            case O_AS21:
                    260:            case O_AS41:
                    261:                type = P2CHAR;
                    262:                break;
                    263:            case O_AS2:
                    264:            case O_AS42:
                    265:                type = P2SHORT;
                    266:                break;
                    267:            case O_AS24:
                    268:            case O_AS4:
                    269:                type = P2LONG;
                    270:                break;
                    271:            case O_AS28:
                    272:            case O_AS48:
                    273:            case O_AS8:
                    274:                type = P2DOUBLE;
                    275:                break;
                    276:        }
                    277:        putop( P2ASSIGN , type );
                    278:     }
                    279: 
                    280:     /*
                    281:      * the various additions
                    282:      */
                    283: putADD( op )
                    284:     int        op;
                    285:     {
                    286:        int     type;
                    287: 
                    288:        switch ( op ) {
                    289:            case O_ADD2:
                    290:            case O_ADD42:
                    291:            case O_ADD82:
                    292:                type = P2SHORT;
                    293:                break;
                    294:            case O_ADD24:
                    295:            case O_ADD4:
                    296:            case O_ADD84:
                    297:                type = P2LONG;
                    298:                break;
                    299:            case O_ADD28:
                    300:            case O_ADD48:
                    301:            case O_ADD8:
                    302:                type = P2DOUBLE;
                    303:                break;
                    304:        }
                    305:        putop( P2PLUS , type );
                    306:     }
                    307: 
                    308:     /*
                    309:      * the various subtractions
                    310:      */
                    311: putSUB( op )
                    312:     int        op;
                    313:     {
                    314:        int     type;
                    315: 
                    316:        switch ( op ) {
                    317:            case O_SUB2:
                    318:            case O_SUB42:
                    319:            case O_SUB82:
                    320:                type = P2SHORT;
                    321:                break;
                    322:            case O_SUB24:
                    323:            case O_SUB4:
                    324:            case O_SUB84:
                    325:                type = P2LONG;
                    326:                break;
                    327:            case O_SUB28:
                    328:            case O_SUB48:
                    329:            case O_SUB8:
                    330:                type = P2DOUBLE;
                    331:                break;
                    332:        }
                    333:        putop( P2MINUS , type );
                    334:     }
                    335: 
                    336:     /*
                    337:      * the various multiplications
                    338:      */
                    339: putMUL( op )
                    340:     int        op;
                    341:     {
                    342:        int     type;
                    343: 
                    344:        switch ( op ) {
                    345:            case O_MUL2:
                    346:            case O_MUL42:
                    347:            case O_MUL82:
                    348:                type = P2SHORT;
                    349:                break;
                    350:            case O_MUL24:
                    351:            case O_MUL4:
                    352:            case O_MUL84:
                    353:                type = P2LONG;
                    354:                break;
                    355:            case O_MUL28:
                    356:            case O_MUL48:
                    357:            case O_MUL8:
                    358:                type = P2DOUBLE;
                    359:                break;
                    360:        }
                    361:        putop( P2MUL , type );
                    362:     }
                    363: 
                    364:     /*
                    365:      * the various divisions (floating results)
                    366:      */
                    367: putDVD( op )
                    368:     int        op;
                    369:     {
                    370:        int     type;
                    371: 
                    372:        switch ( op ) {
                    373:            case O_DVD2:
                    374:            case O_DVD42:
                    375:            case O_DVD82:
                    376:                type = P2SHORT;
                    377:                break;
                    378:            case O_DVD24:
                    379:            case O_DVD4:
                    380:            case O_DVD84:
                    381:                type = P2LONG;
                    382:                break;
                    383:            case O_DVD28:
                    384:            case O_DVD48:
                    385:            case O_DVD8:
                    386:                type = P2DOUBLE;
                    387:                break;
                    388:        }
                    389:        /*
                    390:         * convert the right operand to a double to force floating result
                    391:         *      putop( P2SCONV , P2DOUBLE );
                    392:         * unfortunately, this doesn't work, and both operands have to
                    393:         * be converted, and it's too late to get the left one. (sigh).
                    394:         * that would work if the left operand were already a double,
                    395:         * but for now ...
                    396:         */
                    397:        if ( op != O_DVD8 )
                    398:            panic( "[putDVD]" );
                    399:        putop( P2DIV , type );
                    400:     }
                    401: 
                    402:     /*
                    403:      * the various DIVs (truncated integer results)
                    404:      */
                    405: putDIV( op )
                    406:     int        op;
                    407:     {
                    408:        int     type;
                    409: 
                    410:        switch ( op ) {
                    411:            case O_DIV2:
                    412:            case O_DIV42:
                    413:                type = P2SHORT;
                    414:                break;
                    415:            case O_DIV24:
                    416:            case O_DIV4:
                    417:                type = P2LONG;
                    418:                break;
                    419:        }
                    420:        putop( P2DIV , type );
                    421:     }
                    422: 
                    423:     /*
                    424:      * the various MODs (truncated integer results)
                    425:      */
                    426: putMOD( op )
                    427:     int        op;
                    428:     {
                    429:        int     type;
                    430: 
                    431:        switch ( op ) {
                    432:            case O_MOD2:
                    433:            case O_MOD42:
                    434:                type = P2SHORT;
                    435:                break;
                    436:            case O_MOD24:
                    437:            case O_MOD4:
                    438:                type = P2LONG;
                    439:                break;
                    440:        }
                    441:        putop( P2MOD , type );
                    442:     }
                    443: 
                    444: 
                    445:     /*
                    446:      * this returns a unique integer to be made into a label
                    447:      */
                    448: int
                    449: newlabel()
                    450:     {
                    451:        static lastlabel = 0;
                    452: 
                    453:        return ++lastlabel;
                    454:     }
                    455: 
                    456:     /*
                    457:      * to round string lengths up to 0 mod 4
                    458:      */
                    459: str4len( string )
                    460:     char       *string;
                    461:     {
                    462:        
                    463:        return ( ( strlen( string ) + 3 ) / 4 );
                    464:     }
                    465: 
                    466: 
                    467:     /*
                    468:      * emits an ftext operator and a string to the ppcstream
                    469:      */
                    470: puttext( string )
                    471:     char       *string;
                    472:     {
                    473:        int     length = str4len( string );
                    474: 
                    475:        emitword( TOF77( P2FTEXT , length , 0 ) );
                    476: #      ifdef DEBUG
                    477:            if ( ppcdebug ) {
                    478:                fprintf( ppcdstream , "P2FTEXT | %d | 0\n" , length );
                    479:            }
                    480: #      endif
                    481:        emitstring( string );
                    482:     }
                    483: 
                    484:     /*
                    485:      * puts out formatted text to the ppcstream.
                    486:      * none of arg1 .. arg5 need be present.
                    487:      * and you can add more if you need them.
                    488:      */
                    489:     /* VARARGS */
                    490: putprintf( format , arg1 , arg2 , arg3 , arg4 , arg5 )
                    491:     char       *format;
                    492:     {
                    493:        char    buffer[128];
                    494: 
                    495:        sprintf( buffer , format , arg1 , arg2 , arg3 , arg4 , arg5 );
                    496:        puttext( buffer );
                    497:     }
                    498: 
                    499:     /*
                    500:      * emit a left bracket operator to ppcstream
                    501:      * with function number, the maximum temp register, and total locals
                    502:      * from globals ftnno and sizes[ cbn ]
                    503:      * until i figure out how to use them, regs 0 .. 11 are free.
                    504:      * one idea for one reg is to save the display pointer on block entry
                    505:      */
                    506: putlbracket()
                    507:     {
                    508: #      define  MAXTP2REG       11
                    509: #      define  BITSPERBYTE     8
                    510: 
                    511:        emitword( TOF77( P2FLBRAC , MAXTP2REG , ftnno ) );
                    512:        emitword( BITSPERBYTE * -sizes[ cbn ].om_off );
                    513: #      ifdef DEBUG
                    514:            if ( ppcdebug ) {
                    515:                fprintf( ppcdstream , "P2FLBRAC | %d | %d\n" , MAXTP2REG , ftnno );
                    516:                fprintf( ppcdstream , "%d\n"
                    517:                       , BITSPERBYTE * -sizes[ cbn ].om_off );
                    518:            }
                    519: #      endif
                    520:     }
                    521: 
                    522:     /*
                    523:      * emit a right bracket operator
                    524:      * which for the binary (fortran) interface
                    525:      * doesn't have any (label) arguments,
                    526:      * it just forces the stack allocate and register mask
                    527:      */
                    528: putrbracket()
                    529:     {
                    530: 
                    531:        emitword( P2FRBRAC );
                    532: #      ifdef DEBUG
                    533:            if ( ppcdebug ) {
                    534:                fprintf( ppcdstream , "P2FRBRAC\n" );
                    535:            }
                    536: #      endif
                    537:     }
                    538: 
                    539:     /*
                    540:      * emit an eof operator
                    541:      */
                    542: puteof()
                    543:     {
                    544:        
                    545:        emitword( P2FEOF );
                    546: #      ifdef DEBUG
                    547:            if ( ppcdebug ) {
                    548:                fprintf( ppcdstream , "P2FEOF\n" );
                    549:            }
                    550: #      endif
                    551:     }
                    552: 
                    553:     /*
                    554:      * emit a dot operator,
                    555:      * with a source file line number and name
                    556:      * from globals filename and line
                    557:      */
                    558: putexpr()
                    559:     {
                    560:        int     length = str4len( filename );
                    561: 
                    562:        emitword( TOF77( P2FEXPR , length , line ) );
                    563: #      ifdef DEBUG
                    564:            if ( ppcdebug ) {
                    565:                fprintf( ppcdstream , "P2FEXPR | %d | %d\n" , length , line );
                    566:            }
                    567: #      endif
                    568:        emitstring( filename );
                    569:     }
                    570: 
                    571:     /*
                    572:      * put out a leaf node
                    573:      */
                    574: putleaf( op , lval , rval , type , name )
                    575:     int                op;
                    576:     int                lval;
                    577:     int                rval;
                    578:     int                type;
                    579:     char       *name;
                    580:     {
                    581:        switch ( op ) {
                    582:            default:
                    583:                panic( "[putleaf]" );
                    584:            case P2ICON:
                    585:                emitword( TOF77( P2ICON , name != NIL , type ) );
                    586:                emitword( lval );
                    587: #              ifdef DEBUG
                    588:                    if ( ppcdebug ) {
                    589:                        fprintf( ppcdstream , "P2ICON | %d | %d\n" 
                    590:                               , name != NIL , type );
                    591:                        fprintf( ppcdstream , "%d\n" , lval );
                    592:                    }
                    593: #              endif
                    594:                if ( name )
                    595:                    emitname( name );
                    596:                break;
                    597:            case P2NAME:
                    598:                emitword( TOF77( P2NAME , lval != 0 , type ) );
                    599:                if ( lval ) 
                    600:                    emitword( lval );
                    601: #              ifdef DEBUG
                    602:                    if ( ppcdebug ) {
                    603:                        fprintf( ppcdstream , "P2NAME | %d | %d\n" 
                    604:                               , lval != 0 , type );
                    605:                        if ( lval )
                    606:                            fprintf( ppcdstream , "%d\n" , lval );
                    607:                    }
                    608: #              endif
                    609:                emitname( name );
                    610:                break;
                    611:            case P2REG:
                    612:                emitword( TOF77( P2REG , rval , type ) );
                    613: #              ifdef DEBUG
                    614:                    if ( ppcdebug ) {
                    615:                        fprintf( ppcdstream , "P2REG | %d | %d\n" , rval , type );
                    616:                    }
                    617: #              endif
                    618:                break;
                    619:        }
                    620:     }
                    621: 
                    622:     /*
                    623:      * put a typed operator to the ppcstream
                    624:      */
                    625: putop( op , type )
                    626:     int                op;
                    627:     int                type;
                    628:     {
                    629:        
                    630:        emitword( TOF77( op , 0 , type ) );
                    631: #      ifdef DEBUG
                    632:            if ( ppcdebug ) {
                    633:                fprintf( ppcdstream , "%d | 0 | %d\n" , op , type );
                    634:            }
                    635: #      endif
                    636:     }
                    637: 
                    638: 
                    639:     /*
                    640:      * puts a long word on the ppcstream
                    641:      */
                    642: emitword( word )
                    643:     long       word;
                    644:     {
                    645: 
                    646:        putw( word , ppcstream );
                    647:     };
                    648: 
                    649:     /*
                    650:      * put a length 0 mod 4 null padded string onto the ppcstream
                    651:      * this would use
                    652:      *         fprintf( ppcstream , "%*s" , -str4len( string ) , string )
                    653:      * except that doesn't work, and also it wants to be padded with nulls.
                    654:      */
                    655: emitstring( string )
                    656:     char       *string;
                    657:     {
                    658:        int     slen = strlen( string );
                    659:        int     wlen = ( slen + 3 ) / 4;
                    660:        int     plen = ( wlen * 4 ) - slen;
                    661:        char    *cp;
                    662:        int     p;
                    663: 
                    664:        for ( cp = string ; *cp ; cp++ )
                    665:            putc( *cp , ppcstream );
                    666:        for ( p = 1 ; p <= plen ; p++ )
                    667:            putc( '\0' , ppcstream );
                    668: #      ifdef DEBUG
                    669:            if ( ppcdebug ) {
                    670:                fprintf( ppcdstream , "\"%s" , string );
                    671:                for ( p = 1 ; p <= plen ; p++ )
                    672:                    fprintf( ppcdstream , "\\0" );
                    673:                fprintf( ppcdstream , "\"\n" );
                    674:            }
                    675: #      endif
                    676:     }
                    677: 
                    678:     /*
                    679:      * puts a blank-padded 8 character name on the ppcstream
                    680:      */
                    681: emitname( name )
                    682:     char       *name;
                    683:     {
                    684: 
                    685:        fprintf( ppcstream , "%-8.8s" , name );
                    686: #      ifdef DEBUG
                    687:            if ( ppcdebug ) {
                    688:                fprintf( ppcdstream , "<%-8.8s>\n" , name );
                    689:            }
                    690: #      endif
                    691:     }
                    692:     
                    693: #endif PPC

unix.superglobalmegacorp.com

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