BSD 3 development
[unix-history] / usr / src / cmd / mip / pftn.c
index 0a2dbc7..0227862 100644 (file)
@@ -1,4 +1,5 @@
 # include "mfile1"
 # include "mfile1"
+# include <a.out.h>
 
 struct instk {
        int in_sz;   /* size of array element */
 
 struct instk {
        int in_sz;   /* size of array element */
@@ -21,6 +22,7 @@ struct symtab *relook();
 
 
 int ddebug = 0;
 
 
 int ddebug = 0;
+int gdebug;
 
 defid( q, class )  NODE *q; {
        register struct symtab *p;
 
 defid( q, class )  NODE *q; {
        register struct symtab *p;
@@ -293,6 +295,7 @@ defid( q, class )  NODE *q; {
                break;
        case REGISTER:
                p->offset = regvar--;
                break;
        case REGISTER:
                p->offset = regvar--;
+               if( type==FLOAT || type==DOUBLE) p->offset = regvar--;
                if( blevel == 1 ) p->sflags |= SSET;
                if( regvar < minrvar ) minrvar = regvar;
                break;
                if( blevel == 1 ) p->sflags |= SSET;
                if( regvar < minrvar ) minrvar = regvar;
                break;
@@ -300,7 +303,9 @@ defid( q, class )  NODE *q; {
 
        /* user-supplied routine to fix up new definitions */
 
 
        /* user-supplied routine to fix up new definitions */
 
+#ifndef LINT
        FIXDEF(p);
        FIXDEF(p);
+#endif
 
        if( ddebug ) printf( "  dimoff, sizoff, offset: %d, %d, %d\n", p->dimoff, p->sizoff, p->offset );
 
 
        if( ddebug ) printf( "  dimoff, sizoff, offset: %d, %d, %d\n", p->dimoff, p->sizoff, p->offset );
 
@@ -351,6 +356,11 @@ dclargs(){
                        q->rval = j;
                        defid( q, PARAM );
                        }
                        q->rval = j;
                        defid( q, PARAM );
                        }
+#ifndef LINT
+               pstab(p->sname, N_PSYM);
+               if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR);
+               poffs(N_RSYM, p);
+#endif
                oalloc( p, &argoff );  /* always set aside space, even for register arguments */
                }
        cendarg();
                oalloc( p, &argoff );  /* always set aside space, even for register arguments */
                }
        cendarg();
@@ -1366,6 +1376,9 @@ fixtype( p, class ) register NODE *p; {
                uerror( "function illegal in structure or union" );
                type = INCREF(type);
                }
                uerror( "function illegal in structure or union" );
                type = INCREF(type);
                }
+       
+       if( class==REGISTER && type==FLOAT) type = DOUBLE;
+
        p->type = type;
        }
 
        p->type = type;
        }
 
@@ -1430,7 +1443,15 @@ fixclass( class, type ) TWORD type; {
 
        case REGISTER:
                if( blevel == 0 ) uerror( "illegal register declaration" );
 
        case REGISTER:
                if( blevel == 0 ) uerror( "illegal register declaration" );
-               else if( regvar >= MINRVAR && cisreg( type ) ) return( class );
+               switch( type ) {
+                       case FLOAT:
+                       case DOUBLE:
+                               if( (regvar-1) >= MINRVAR && cisreg( type ) ) return ( class );
+                               break;
+                       default:
+                               if( regvar >= MINRVAR && cisreg( type ) ) return ( class );
+                               break;
+               }
                if( blevel == 1 ) return( PARAM );
                else return( AUTO );
 
                if( blevel == 1 ) return( PARAM );
                else return( AUTO );