BSD 4_1_snap release
[unix-history] / usr / src / cmd / pi / p2put.c
index 4a59d09..cc8f1c6 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)p2put.c 1.3 10/16/80";
+static char sccsid[] = "@(#)p2put.c 1.9 6/1/81";
 
     /*
      * functions to help pi put out
 
     /*
      * functions to help pi put out
@@ -30,7 +30,7 @@ puttext( string )
     {
        int     length = str4len( string );
 
     {
        int     length = str4len( string );
 
-       if ( cgenflg )
+       if ( !CGENNING )
            return;
        p2word( TOF77( P2FTEXT , length , 0 ) );
 #      ifdef DEBUG
            return;
        p2word( TOF77( P2FTEXT , length , 0 ) );
 #      ifdef DEBUG
@@ -63,7 +63,7 @@ putprintf( format , incomplete , arg1 , arg2 , arg3 , arg4 , arg5 )
        static char     ppbuffer[ BUFSIZ ];
        static char     *ppbufp = ppbuffer;
 
        static char     ppbuffer[ BUFSIZ ];
        static char     *ppbufp = ppbuffer;
 
-       if ( cgenflg )
+       if ( !CGENNING )
            return;
        sprintf( ppbufp , format , arg1 , arg2 , arg3 , arg4 , arg5 );
        ppbufp = &( ppbuffer[ strlen( ppbuffer ) ] );
            return;
        sprintf( ppbufp , format , arg1 , arg2 , arg3 , arg4 , arg5 );
        ppbufp = &( ppbuffer[ strlen( ppbuffer ) ] );
@@ -163,7 +163,7 @@ putleaf( op , lval , rval , type , name )
     int                type;
     char       *name;
     {
     int                type;
     char       *name;
     {
-       if ( cgenflg )
+       if ( !CGENNING )
            return;
        switch ( op ) {
            default:
            return;
        switch ( op ) {
            default:
@@ -173,7 +173,7 @@ putleaf( op , lval , rval , type , name )
                p2word( lval );
 #              ifdef DEBUG
                    if ( opt( 'k' ) ) {
                p2word( lval );
 #              ifdef DEBUG
                    if ( opt( 'k' ) ) {
-                       fprintf( stdout , "P2ICON | %3d | %d    " 
+                       fprintf( stdout , "P2ICON | %3d | 0x%x  " 
                               , name != NIL , type );
                        fprintf( stdout , "%d\n" , lval );
                    }
                               , name != NIL , type );
                        fprintf( stdout , "%d\n" , lval );
                    }
@@ -187,7 +187,7 @@ putleaf( op , lval , rval , type , name )
                    p2word( lval );
 #              ifdef DEBUG
                    if ( opt( 'k' ) ) {
                    p2word( lval );
 #              ifdef DEBUG
                    if ( opt( 'k' ) ) {
-                       fprintf( stdout , "P2NAME | %3d | %d    " 
+                       fprintf( stdout , "P2NAME | %3d | 0x%x  " 
                               , lval != 0 , type );
                        if ( lval )
                            fprintf( stdout , "%d       " , lval );
                               , lval != 0 , type );
                        if ( lval )
                            fprintf( stdout , "%d       " , lval );
@@ -199,7 +199,8 @@ putleaf( op , lval , rval , type , name )
                p2word( TOF77( P2REG , rval , type ) );
 #              ifdef DEBUG
                    if ( opt( 'k' ) ) {
                p2word( TOF77( P2REG , rval , type ) );
 #              ifdef DEBUG
                    if ( opt( 'k' ) ) {
-                       fprintf( stdout , "P2REG | %3d | %d\n" , rval , type );
+                       fprintf( stdout , "P2REG | %3d | 0x%x\n" ,
+                               rval , type );
                    }
 #              endif
                break;
                    }
 #              endif
                break;
@@ -208,30 +209,44 @@ putleaf( op , lval , rval , type , name )
 
     /*
      * rvalues are just lvalues with indirection, except
 
     /*
      * rvalues are just lvalues with indirection, except
-     * special case for named globals, whose names are their rvalues
+     * special cases for registers and for named globals,
+     * whose names are their rvalues.
      */
      */
-putRV( name , level , offset , type )
+putRV( name , level , offset , extra_flags , type )
     char       *name;
     int                level;
     int                offset;
     char       *name;
     int                level;
     int                offset;
+    char       extra_flags;
     int                type;
     {
        char    extname[ BUFSIZ ];
        char    *printname;
     int                type;
     {
        char    extname[ BUFSIZ ];
        char    *printname;
+       int     regnumber;
 
 
-       if ( cgenflg )
+       if ( !CGENNING )
            return;
            return;
-       if ( ( level <= 1 ) && ( name != 0 ) ) {
-           if ( name[0] != '_' ) {
-                   sprintf( extname , EXTFORMAT , name );
-                   printname = extname;
-           } else {
-                   printname = name;
+       if ( extra_flags & NREGVAR ) {
+           if ( ( offset < 0 ) || ( offset > P2FP ) ) {
+               panic( "putRV regvar" );
            }
            }
-           putleaf( P2NAME , offset , 0 , type , printname );
+           putleaf( P2REG , 0 , offset , type , 0 );
            return;
        }
            return;
        }
-       putLV( name , level , offset , type );
+       if ( whereis( level , offset , extra_flags ) == GLOBALVAR ) {
+           if ( name != 0 ) {
+               if ( name[0] != '_' ) {
+                       sprintf( extname , EXTFORMAT , name );
+                       printname = extname;
+               } else {
+                       printname = name;
+               }
+               putleaf( P2NAME , offset , 0 , type , printname );
+               return;
+           } else {
+               panic( "putRV no name" );
+           }
+       }
+       putLV( name , level , offset , extra_flags , type );
        putop( P2UNARY P2MUL , type );
     }
 
        putop( P2UNARY P2MUL , type );
     }
 
@@ -240,57 +255,60 @@ putRV( name , level , offset , type )
      * given a level and offset
      * special case for
      *     named globals, whose lvalues are just their names as constants.
      * given a level and offset
      * special case for
      *     named globals, whose lvalues are just their names as constants.
-     *     negative offsets, that are offsets from the frame pointer.
-     *     positive offsets, that are offsets from argument pointer.
      */
      */
-putLV( name , level , offset , type )
+putLV( name , level , offset , extra_flags , type )
     char       *name;
     int                level;
     int                offset;
     char       *name;
     int                level;
     int                offset;
+    char       extra_flags;
     int                type;
     int                type;
-    {
-       char            extname[ BUFSIZ ];
-       char            *printname;
+{
+    char               extname[ BUFSIZ ];
+    char               *printname;
 
 
-       if ( cgenflg )
-           return;
-       if ( ( level <= 1 ) && ( name != 0 ) ) {
-           if ( name[0] != '_' ) {
-                   sprintf( extname , EXTFORMAT , name );
-                   printname = extname;
-           } else {
-                   printname = name;
-           }
-           putleaf( P2ICON , offset , 0 , ADDTYPE( type , P2PTR )
-                   , printname );
-           return;
-       }
-       if ( level == cbn ) {
-               if ( offset < 0 ) {
-                   putleaf( P2REG , 0 , P2FP , ADDTYPE( type , P2PTR ) , 0 );
-               } else {
-                   putleaf( P2REG , 0 , P2AP , ADDTYPE( type , P2PTR ) , 0 );
-               }
-       } else {
-               if ( offset < 0 ) {
-                       putleaf( P2NAME
-                           , ( level * sizeof(struct dispsave) ) + FP_OFFSET
-                           , 0 , P2PTR | P2CHAR , DISPLAYNAME );
+    if ( !CGENNING )
+       return;
+    if ( extra_flags & NREGVAR ) {
+       panic( "putLV regvar" );
+    }
+    switch ( whereis( level , offset , extra_flags ) ) {
+       case GLOBALVAR:
+           if ( ( name != 0 ) ) {
+               if ( name[0] != '_' ) {
+                       sprintf( extname , EXTFORMAT , name );
+                       printname = extname;
                } else {
                } else {
-                       putleaf( P2NAME
-                           , ( level * sizeof(struct dispsave) ) + AP_OFFSET
-                           , 0 , P2PTR | P2CHAR , DISPLAYNAME );
+                       printname = name;
                }
                }
-       }
-       if ( offset < 0 ) {
-               putleaf( P2ICON , -offset , 0 , P2INT , 0 );
-               putop( P2MINUS , P2PTR | P2CHAR );
-       } else {
-               putleaf( P2ICON , offset , 0 , P2INT , 0 );
-               putop( P2PLUS , P2PTR | P2CHAR );
-       }
-       return;
+               putleaf( P2ICON , offset , 0 , ADDTYPE( type , P2PTR )
+                       , printname );
+               return;
+           } else {
+               panic( "putLV no name" );
+           }
+       case PARAMVAR:
+           if ( level == cbn ) {
+               putleaf( P2REG , 0 , P2AP , ADDTYPE( type , P2PTR ) , 0 );
+           } else {
+               putleaf( P2NAME , (level * sizeof(struct dispsave)) + AP_OFFSET
+                   , 0 , P2PTR | P2CHAR , DISPLAYNAME );
+           }
+           putleaf( P2ICON , offset , 0 , P2INT , 0 );
+           putop( P2PLUS , P2PTR | P2CHAR );
+           break;
+       case LOCALVAR:
+           if ( level == cbn ) {
+               putleaf( P2REG , 0 , P2FP , ADDTYPE( type , P2PTR ) , 0 );
+           } else {
+               putleaf( P2NAME , (level * sizeof(struct dispsave)) + FP_OFFSET
+                   , 0 , P2PTR | P2CHAR , DISPLAYNAME );
+           }
+           putleaf( P2ICON , -offset , 0 , P2INT , 0 );
+           putop( P2MINUS , P2PTR | P2CHAR );
+           break;
     }
     }
+    return;
+}
 
     /*
      * put out a floating point constant leaf node
 
     /*
      * put out a floating point constant leaf node
@@ -303,7 +321,7 @@ putCON8( value )
        int     label;
        char    name[ BUFSIZ ];
 
        int     label;
        char    name[ BUFSIZ ];
 
-       if ( cgenflg )
+       if ( !CGENNING )
            return;
        putprintf( "    .data" , 0 );
        putprintf( "    .align 2" , 0 );
            return;
        putprintf( "    .data" , 0 );
        putprintf( "    .align 2" , 0 );
@@ -331,7 +349,7 @@ putCONG( string , length , required )
        int     pad;
        int     others;
 
        int     pad;
        int     others;
 
-       if ( cgenflg )
+       if ( !CGENNING )
            return;
        putprintf( "    .data" , 0 );
        label = getlab();
            return;
        putprintf( "    .data" , 0 );
        label = getlab();
@@ -460,7 +478,7 @@ typerecur( np , quals )
                     *  formal procedures and functions are pointers
                     *  to structures which describe their environment.
                     */
                     *  formal procedures and functions are pointers
                     *  to structures which describe their environment.
                     */
-               return ADDTYPE( P2PTR , P2STRTY );
+               return ( P2PTR | P2STRTY );
            default :
                panic( "p2type" );
        }
            default :
                panic( "p2type" );
        }
@@ -488,12 +506,12 @@ putop( op , type )
     {
        extern char     *p2opnames[];
        
     {
        extern char     *p2opnames[];
        
-       if ( cgenflg )
+       if ( !CGENNING )
            return;
        p2word( TOF77( op , 0 , type ) );
 #      ifdef DEBUG
            if ( opt( 'k' ) ) {
            return;
        p2word( TOF77( op , 0 , type ) );
 #      ifdef DEBUG
            if ( opt( 'k' ) ) {
-               fprintf( stdout , "%s (%d) |   0 | %d\n"
+               fprintf( stdout , "%s (%d) |   0 | 0x%x\n"
                        , p2opnames[ op ] , op , type );
            }
 #      endif
                        , p2opnames[ op ] , op , type );
            }
 #      endif
@@ -512,14 +530,14 @@ putstrop( op , type , size , alignment )
     {
        extern char     *p2opnames[];
        
     {
        extern char     *p2opnames[];
        
-       if ( cgenflg )
+       if ( !CGENNING )
            return;
        p2word( TOF77( op , 0 , type ) );
        p2word( size );
        p2word( alignment );
 #      ifdef DEBUG
            if ( opt( 'k' ) ) {
            return;
        p2word( TOF77( op , 0 , type ) );
        p2word( size );
        p2word( alignment );
 #      ifdef DEBUG
            if ( opt( 'k' ) ) {
-               fprintf( stdout , "%s (%d) |   0 | %d   %d %d\n"
+               fprintf( stdout , "%s (%d) |   0 | 0x%x %d %d\n"
                        , p2opnames[ op ] , op , type , size , alignment );
            }
 #      endif
                        , p2opnames[ op ] , op , type , size , alignment );
            }
 #      endif