Much improved asxxxx code generation
authorNick Downing <nick@ndcode.org>
Wed, 10 Aug 2022 04:31:55 +0000 (14:31 +1000)
committerNick Downing <nick@ndcode.org>
Wed, 10 Aug 2022 04:31:55 +0000 (14:31 +1000)
usr/src/cmd/c/c10.c
usr/src/cmd/c/c11.c
usr/src/cmd/c/table.s
usr/src/libc/a.sh
usr/src/libc/n.sh

index 6d631d2..97752d4 100644 (file)
@@ -497,14 +497,14 @@ struct table *table;
        string = opt->tabstring;
        p1 = tree->tr1;
        if (p1->op==FCON && p1->value>0) {
-               printf(".area   data\nL%d:%o;%o;%o;%o\n.area    text\n", p1->value, p1->fvalue);
+               printf(".area   data\nL%d:.dw %d,%d,%d,%d\n.area        text\n", p1->value, p1->fvalue);
                p1->value = -p1->value;
        }
        p2 = 0;
        if (opdope[tree->op]&BINARY) {
                p2 = tree->tr2;
                if (p2->op==FCON && p2->value>0) {
-                       printf(".area   data\nL%d:%o;%o;%o;%o\n.area    text\n", p2->value, p2->fvalue);
+                       printf(".area   data\nL%d:.dw %d,%d,%d,%d\n.area        text\n", p2->value, p2->fvalue);
                        p2->value = -p2->value;
                }
        }
@@ -782,7 +782,7 @@ loop:
         * Mask used in field assignments
         */
        case 'Z':
-               printf("#%o", tree->mask);
+               printf("#%d", tree->mask);
                goto loop;
 
        /*
@@ -1058,7 +1058,7 @@ int *flagp;
                } else {
                        if (retval!=0)
                                printf("mov     r%d,r0\n", retval);
-                       printf("mov     #%o,r1\n", size);
+                       printf("mov     #%d,r1\n", size);
                        printf("L%d:mov -(r0),-(sp)\ndec\tr1\njne\tL%d\n", isn, isn);
                        isn++;
                }
@@ -1105,11 +1105,13 @@ struct tnode *atree;
        tree = atree;
        type = atype;
        if (type==CHAR) {
-               printf(".byte ");
+               printf(".db ");
                if (tree->type&XTYPE)
                        goto illinit;
                type = INT;
        }
+       else
+               printf(".dw ");
        if (type&XTYPE)
                type = INT;
        switch (type) {
@@ -1130,7 +1132,7 @@ struct tnode *atree;
                        tree->value = lval;
                }
                if (tree->op == CON)
-                       printf("%o\n", tree->value);
+                       printf("%d\n", tree->value);
                else if (tree->op==AMPER) {
                        pname(tree->tr1, 0);
                        putchar('\n');
@@ -1155,9 +1157,9 @@ struct tnode *atree;
                        goto illinit;
                if (type==FLOAT) {
                        sfval = fval;
-                       printf("%o; %o\n", sfval);
+                       printf("%d,%d\n", sfval);
                } else
-                       printf("%o; %o; %o; %o\n", fval);
+                       printf("%d,%d,%d,%d\n", fval);
                return;
 
        case LONG:
@@ -1176,7 +1178,7 @@ struct tnode *atree;
                        lval = tree->lvalue;
                else
                        goto illinit;
-               printf("%o; %o\n", lval);
+               printf("%d,%d\n", lval);
                return;
        }
 illinit:
index 004aab9..eb67821 100644 (file)
@@ -49,7 +49,7 @@ loop:
        switch(p->op) {
 
        case LCON:
-               printf("#%o", flag>10? p->lvalue.intx[1]:p->lvalue.intx[0]);
+               printf("#%d", flag>10? p->lvalue.intx[1]:p->lvalue.intx[0]);
                return;
 
        case SFCON:
@@ -335,7 +335,7 @@ arlength(t)
  */
 
 char   dirsw[] {"\
-cmp    r0,#%o\n\
+cmp    r0,#%d\n\
 jhi    L%d\n\
 asl    r0\n\
 jmp    *L%d(r0)\n\
@@ -346,7 +346,7 @@ L%d:\
 char   hashsw[] {"\
 mov    r0,r1\n\
 clr    r0\n\
-div    #%o,r0\n\
+div    #%d,r0\n\
 asl    r1\n\
 jmp    *L%d(r1)\n\
 .area  data\n\
@@ -380,7 +380,7 @@ struct swtab *afp, *alp;
        /* direct switch */
        if (range>0 && range <= 3*ncase) {
                if (fp->swval)
-                       printf("sub     #%o,r0\n", fp->swval);
+                       printf("sub     #%d,r0\n", fp->swval);
                printf(dirsw, range, deflab, isn, isn);
                isn++;
                for (i=fp->swval; ; i++) {
@@ -444,7 +444,7 @@ breq(v, l)
        if (v==0)
                printf("tst     r0\n");
        else
-               printf("cmp     r0,#%o\n", v);
+               printf("cmp     r0,#%d\n", v);
        printf("jeq     L%d\n", l);
 }
 
@@ -738,7 +738,7 @@ popstk(a)
                printf("cmp     (sp)+,(sp)+\n");
                return;
        }
-       printf("add     #%o,sp\n", a);
+       printf("add     #%d,sp\n", a);
 }
 
 error(s, p1, p2, p3, p4, p5, p6)
@@ -759,7 +759,7 @@ psoct(an)
                n = -n;
                sign = '-';
        }
-       printf("%c%o", sign, n);
+       printf("%c%d", sign, n);
 }
 
 /*
@@ -796,7 +796,7 @@ getree()
                switch(op =& 0377) {
 
        case SINIT:
-               printf("%o\n", geti());
+               printf("%d\n", geti());
                break;
 
        case EOFC:
@@ -804,9 +804,9 @@ getree()
 
        case BDATA:
                if (geti() == 1) {
-                       printf(".byte ");
+                       printf(".db ");
                        for (;;)  {
-                               printf("%o", geti());
+                               printf("%d", geti());
                                if (geti() != 1)
                                        break;
                                printf(",");
@@ -829,7 +829,8 @@ getree()
 
        case SYMDEF:
                outname(s);
-               printf(".globl%s%.8s\n", s[0]?" ":"", s);
+               if (s[0])
+                       printf(".globl %.8s\n", s);
                sfuncr.nloc = 0;
                break;
 
@@ -839,11 +840,11 @@ getree()
 
        case CSPACE:
                t = outname(s);
-               printf(".comm   %.8s,%o\n", t, geti());
+               printf(".comm   %.8s,%d\n", t, geti());
                break;
 
        case SSPACE:
-               printf(".=.+%o\n", (t=geti()));
+               printf(".=.+%d\n", (t=geti()));
                totspace += (unsigned)t;
                break;
 
@@ -860,7 +861,7 @@ getree()
                if (t==2)
                        printf("tst     -(sp)\n");
                else if (t != 0)
-                       printf("sub     #%o,sp\n", t);
+                       printf("sub     #%d,sp\n", t);
                break;
 
        case PROFIL:
@@ -876,7 +877,7 @@ getree()
 
        case ANAME:
                t = outname(s);
-               printf(";~%s=%o\n", t+1, geti());
+               printf(";~%s=%d\n", t+1, geti());
                break;
 
        case RNAME:
@@ -937,6 +938,7 @@ getree()
                        np = getblk(sizeof(*xnp));
                        np->type = geti();
                        outname(np->name);
+                       printf(".globl %.8s\n", np->name);
                } else {
                        np = getblk(sizeof(*np));
                        np->type = geti();
@@ -1075,7 +1077,7 @@ struct fasgn *atp;
                if (tp->op==RFORCE) {   /* function return */
                        if (sfuncr.nloc==0) {
                                sfuncr.nloc = isn++;
-                               printf(".area   bss\nL%d:.=.+%o\n.area  text\n", sfuncr.nloc, nwords*sizeof(int));
+                               printf(".area   bss\nL%d:.=.+%d\n.area  text\n", sfuncr.nloc, nwords*sizeof(int));
                        }
                        atp->tr1 = tnode(ASSIGN, STRUCT, &sfuncr, tp->tr1);
                        strasg(atp);
@@ -1113,7 +1115,7 @@ struct fasgn *atp;
                }
                if (nreg<=1)
                        printf("mov     r2,-(sp)\n");
-               printf("mov     #%o,r2\n", nwords);
+               printf("mov     #%d,r2\n", nwords);
                printf("L%d:mov (r1)+,(r0)+\ndec\tr2\njne\tL%d\n", isn, isn);
                isn++;
                if (nreg<=1)
index 1da42db..a49dac3 100644 (file)
@@ -71,7 +71,6 @@ cr102:
 / call
 cr100:
 %a,n
-       .globl  IA1
        jsr     pc,IA1
 
 %n*,n
@@ -803,6 +802,7 @@ cr82:
 %nl,nl
        SS
        FS
+       .globl  I
        jsr     pc,I
        add     #10,sp
 
@@ -812,6 +812,7 @@ cr86:
 %n,nl
        SS
        FS
+       .globl  I
        jsr     pc,I
        add     #6,sp
 
index 4551f67..1b5dc98 100755 (executable)
@@ -2,6 +2,4 @@
 mkdir --parents ../../../tmp
 export APOUT_ROOT=`pwd`/../../..
 export PATH=`pwd`/../../../bin:`pwd`
-cc -S -O /usr/src/libc/stdio/filbuf.c
-as -o filbuf.o filbuf.s
-#cc -c -O /usr/src/libc/stdio/filbuf.c
+cc -c -O /usr/src/libc/stdio/getgrent.c
index be8566a..9fe87b7 100755 (executable)
@@ -5,5 +5,160 @@ then
 fi
 export APOUT_ROOT=`pwd`/../../..
 export PATH=`pwd`/../../../bin:`pwd`
-./compall
+#./compall
+
+echo "=== getgrgid.c ==="; cc -c -O /usr/src/libc/stdio/getgrgid.c
+echo "=== getgrnam.c ==="; cc -c -O /usr/src/libc/stdio/getgrnam.c
+echo "=== getgrent.c ==="; cc -c -O /usr/src/libc/stdio/getgrent.c
+echo "=== getpass.c ==="; cc -c -O /usr/src/libc/stdio/getpass.c
+echo "=== getpwnam.c ==="; cc -c -O /usr/src/libc/stdio/getpwnam.c
+echo "=== getpwuid.c ==="; cc -c -O /usr/src/libc/stdio/getpwuid.c
+echo "=== getpwent.c ==="; cc -c -O /usr/src/libc/stdio/getpwent.c
+echo "=== fgetc.c ==="; cc -c -O /usr/src/libc/stdio/fgetc.c
+echo "=== fputc.c ==="; cc -c -O /usr/src/libc/stdio/fputc.c
+echo "=== getchar.c ==="; cc -c -O /usr/src/libc/stdio/getchar.c
+echo "=== putchar.c ==="; cc -c -O /usr/src/libc/stdio/putchar.c
+echo "=== popen.c ==="; cc -c -O /usr/src/libc/stdio/popen.c
+echo "=== freopen.c ==="; cc -c -O /usr/src/libc/stdio/freopen.c
+echo "=== fgets.c ==="; cc -c -O /usr/src/libc/stdio/fgets.c
+echo "=== fputs.c ==="; cc -c -O /usr/src/libc/stdio/fputs.c
+echo "=== getpw.c ==="; cc -c -O /usr/src/libc/stdio/getpw.c
+echo "=== fseek.c ==="; cc -c -O /usr/src/libc/stdio/fseek.c
+echo "=== ftell.c ==="; cc -c -O /usr/src/libc/stdio/ftell.c
+echo "=== rew.c ==="; cc -c -O /usr/src/libc/stdio/rew.c
+echo "=== rdwr.c ==="; cc -c -O /usr/src/libc/stdio/rdwr.c
+echo "=== system.c ==="; cc -c -O /usr/src/libc/stdio/system.c
+echo "=== fopen.c ==="; cc -c -O /usr/src/libc/stdio/fopen.c
+echo "=== fdopen.c ==="; cc -c -O /usr/src/libc/stdio/fdopen.c
+echo "=== scanf.c ==="; cc -c -O /usr/src/libc/stdio/scanf.c
+echo "=== doscan.c ==="; cc -c -O /usr/src/libc/stdio/doscan.c
+echo "=== fprintf.c ==="; cc -c -O /usr/src/libc/stdio/fprintf.c
+echo "=== gets.c ==="; cc -c -O /usr/src/libc/stdio/gets.c
+echo "=== getw.c ==="; cc -c -O /usr/src/libc/stdio/getw.c
+echo "=== printf.c ==="; cc -c -O /usr/src/libc/stdio/printf.c
+echo "=== puts.c ==="; cc -c -O /usr/src/libc/stdio/puts.c
+echo "=== putw.c ==="; cc -c -O /usr/src/libc/stdio/putw.c
+echo "=== sprintf.c ==="; cc -c -O /usr/src/libc/stdio/sprintf.c
+echo "=== ungetc.c ==="; cc -c -O /usr/src/libc/stdio/ungetc.c
+echo "=== filbuf.c ==="; cc -c -O /usr/src/libc/stdio/filbuf.c
+echo "=== setbuf.c ==="; cc -c -O /usr/src/libc/stdio/setbuf.c
+echo "=== fltpr.s ==="; cc -c /usr/src/libc/stdio/fltpr.s
+echo "=== doprnt.s ==="; cc -c /usr/src/libc/stdio/doprnt.s
+echo "=== gcvt.c ==="; cc -c -O /usr/src/libc/stdio/gcvt.c
+echo "=== ffltpr.s ==="; cc -c /usr/src/libc/stdio/ffltpr.s
+echo "=== strout.c ==="; cc -c -O /usr/src/libc/stdio/strout.c
+echo "=== flsbuf.c ==="; cc -c -O /usr/src/libc/stdio/flsbuf.c
+echo "=== endopen.c ==="; cc -c -O /usr/src/libc/stdio/endopen.c
+echo "=== findiop.c ==="; cc -c -O /usr/src/libc/stdio/findiop.c
+echo "=== clrerr.c ==="; cc -c -O /usr/src/libc/stdio/clrerr.c
+echo "=== data.c ==="; cc -c -O /usr/src/libc/stdio/data.c
+echo "=== cuexit.s ==="; cc -c /usr/src/libc/gen/cuexit.s
+echo "=== execvp.c ==="; cc -c -O /usr/src/libc/gen/execvp.c
+echo "=== getenv.c ==="; cc -c -O /usr/src/libc/gen/getenv.c
+echo "=== getlogin.c ==="; cc -c -O /usr/src/libc/gen/getlogin.c
+echo "=== perror.c ==="; cc -c -O /usr/src/libc/gen/perror.c
+echo "=== sleep.c ==="; cc -c -O /usr/src/libc/gen/sleep.c
+echo "=== timezone.c ==="; cc -c -O /usr/src/libc/gen/timezone.c
+echo "=== ttyslot.c ==="; cc -c -O /usr/src/libc/gen/ttyslot.c
+echo "=== ttyname.c ==="; cc -c -O /usr/src/libc/gen/ttyname.c
+echo "=== abort.s ==="; cc -c /usr/src/libc/gen/abort.s
+echo "=== abs.c ==="; cc -c -O /usr/src/libc/gen/abs.c
+echo "=== atof.c ==="; cc -c -O /usr/src/libc/gen/atof.c
+echo "=== atoi.c ==="; cc -c -O /usr/src/libc/gen/atoi.c
+echo "=== atol.c ==="; cc -c -O /usr/src/libc/gen/atol.c
+echo "=== crypt.c ==="; cc -c -O /usr/src/libc/gen/crypt.c
+echo "=== ctime.c ==="; cc -c -O /usr/src/libc/gen/ctime.c
+echo "=== calloc.c ==="; cc -c -O /usr/src/libc/gen/calloc.c
+echo "=== malloc.c ==="; cc -c -O /usr/src/libc/gen/malloc.c
+echo "=== ecvt.c ==="; cc -c -O /usr/src/libc/gen/ecvt.c
+echo "=== errlst.c ==="; cc -c -O /usr/src/libc/gen/errlst.c
+echo "=== fakcu.s ==="; cc -c /usr/src/libc/gen/fakcu.s
+echo "=== fakfp.s ==="; cc -c /usr/src/libc/gen/fakfp.s
+echo "=== frexp11.s ==="; cc -c /usr/src/libc/gen/frexp11.s
+echo "=== isatty.c ==="; cc -c -O /usr/src/libc/gen/isatty.c
+echo "=== l3.c ==="; cc -c -O /usr/src/libc/gen/l3.c
+echo "=== ldexp11.s ==="; cc -c /usr/src/libc/gen/ldexp11.s
+echo "=== ldfps.s ==="; cc -c /usr/src/libc/gen/ldfps.s
+echo "=== mktemp.c ==="; cc -c -O /usr/src/libc/gen/mktemp.c
+echo "=== modf11.s ==="; cc -c /usr/src/libc/gen/modf11.s
+echo "=== mpx.c ==="; cc -c -O /usr/src/libc/gen/mpx.c
+echo "=== mon.c ==="; cc -c -O /usr/src/libc/gen/mon.c
+echo "=== nlist.c ==="; cc -c -O /usr/src/libc/gen/nlist.c
+echo "=== qsort.c ==="; cc -c -O /usr/src/libc/gen/qsort.c
+echo "=== rand.c ==="; cc -c -O /usr/src/libc/gen/rand.c
+echo "=== setjmp.s ==="; cc -c /usr/src/libc/gen/setjmp.s
+echo "=== stty.c ==="; cc -c -O /usr/src/libc/gen/stty.c
+echo "=== swab.c ==="; cc -c -O /usr/src/libc/gen/swab.c
+echo "=== tell.c ==="; cc -c -O /usr/src/libc/gen/tell.c
+echo "=== ctype_.c ==="; cc -c -O /usr/src/libc/gen/ctype_.c
+echo "=== index.c ==="; cc -c -O /usr/src/libc/gen/index.c
+echo "=== rindex.c ==="; cc -c -O /usr/src/libc/gen/rindex.c
+echo "=== strcat.c ==="; cc -c -O /usr/src/libc/gen/strcat.c
+echo "=== strncat.c ==="; cc -c -O /usr/src/libc/gen/strncat.c
+echo "=== strcmp.c ==="; cc -c -O /usr/src/libc/gen/strcmp.c
+echo "=== strncmp.c ==="; cc -c -O /usr/src/libc/gen/strncmp.c
+echo "=== strcpy.c ==="; cc -c -O /usr/src/libc/gen/strcpy.c
+echo "=== strncpy.c ==="; cc -c -O /usr/src/libc/gen/strncpy.c
+echo "=== strlen.c ==="; cc -c -O /usr/src/libc/gen/strlen.c
+echo "=== access.s ==="; cc -c /usr/src/libc/sys/access.s
+echo "=== acct.s ==="; cc -c /usr/src/libc/sys/acct.s
+echo "=== alarm.s ==="; cc -c /usr/src/libc/sys/alarm.s
+echo "=== chdir.s ==="; cc -c /usr/src/libc/sys/chdir.s
+echo "=== chroot.s ==="; cc -c /usr/src/libc/sys/chroot.s
+echo "=== chmod.s ==="; cc -c /usr/src/libc/sys/chmod.s
+echo "=== chown.s ==="; cc -c /usr/src/libc/sys/chown.s
+echo "=== close.s ==="; cc -c /usr/src/libc/sys/close.s
+echo "=== creat.s ==="; cc -c /usr/src/libc/sys/creat.s
+echo "=== dup.s ==="; cc -c /usr/src/libc/sys/dup.s
+echo "=== execl.s ==="; cc -c /usr/src/libc/sys/execl.s
+echo "=== execle.s ==="; cc -c /usr/src/libc/sys/execle.s
+echo "=== execv.s ==="; cc -c /usr/src/libc/sys/execv.s
+echo "=== execve.s ==="; cc -c /usr/src/libc/sys/execve.s
+echo "=== exit.s ==="; cc -c /usr/src/libc/sys/exit.s
+echo "=== fork.s ==="; cc -c /usr/src/libc/sys/fork.s
+echo "=== fstat.s ==="; cc -c /usr/src/libc/sys/fstat.s
+echo "=== getgid.s ==="; cc -c /usr/src/libc/sys/getgid.s
+echo "=== getpid.s ==="; cc -c /usr/src/libc/sys/getpid.s
+echo "=== getuid.s ==="; cc -c /usr/src/libc/sys/getuid.s
+echo "=== ioctl.s ==="; cc -c /usr/src/libc/sys/ioctl.s
+echo "=== kill.s ==="; cc -c /usr/src/libc/sys/kill.s
+echo "=== link.s ==="; cc -c /usr/src/libc/sys/link.s
+echo "=== lock.s ==="; cc -c /usr/src/libc/sys/lock.s
+echo "=== lseek.s ==="; cc -c /usr/src/libc/sys/lseek.s
+echo "=== mknod.s ==="; cc -c /usr/src/libc/sys/mknod.s
+echo "=== mount.s ==="; cc -c /usr/src/libc/sys/mount.s
+echo "=== mpxcall.s ==="; cc -c /usr/src/libc/sys/mpxcall.s
+echo "=== nice.s ==="; cc -c /usr/src/libc/sys/nice.s
+echo "=== open.s ==="; cc -c /usr/src/libc/sys/open.s
+echo "=== pause.s ==="; cc -c /usr/src/libc/sys/pause.s
+echo "=== phys.s ==="; cc -c /usr/src/libc/sys/phys.s
+echo "=== pipe.s ==="; cc -c /usr/src/libc/sys/pipe.s
+echo "=== profil.s ==="; cc -c /usr/src/libc/sys/profil.s
+echo "=== ptrace.s ==="; cc -c /usr/src/libc/sys/ptrace.s
+echo "=== read.s ==="; cc -c /usr/src/libc/sys/read.s
+echo "=== sbrk.s ==="; cc -c /usr/src/libc/sys/sbrk.s
+echo "=== setgid.s ==="; cc -c /usr/src/libc/sys/setgid.s
+echo "=== setuid.s ==="; cc -c /usr/src/libc/sys/setuid.s
+echo "=== signal.s ==="; cc -c /usr/src/libc/sys/signal.s
+echo "=== stat.s ==="; cc -c /usr/src/libc/sys/stat.s
+echo "=== stime.s ==="; cc -c /usr/src/libc/sys/stime.s
+echo "=== sync.s ==="; cc -c /usr/src/libc/sys/sync.s
+echo "=== time.s ==="; cc -c /usr/src/libc/sys/time.s
+echo "=== times.s ==="; cc -c /usr/src/libc/sys/times.s
+echo "=== umask.s ==="; cc -c /usr/src/libc/sys/umask.s
+echo "=== umount.s ==="; cc -c /usr/src/libc/sys/umount.s
+echo "=== unlink.s ==="; cc -c /usr/src/libc/sys/unlink.s
+echo "=== utime.s ==="; cc -c /usr/src/libc/sys/utime.s
+echo "=== wait.s ==="; cc -c /usr/src/libc/sys/wait.s
+echo "=== write.s ==="; cc -c /usr/src/libc/sys/write.s
+echo "=== aldiv.s ==="; cc -c /usr/src/libc/crt/aldiv.s
+echo "=== almul.s ==="; cc -c /usr/src/libc/crt/almul.s
+echo "=== alrem.s ==="; cc -c /usr/src/libc/crt/alrem.s
+echo "=== cerror.s ==="; cc -c /usr/src/libc/crt/cerror.s
+echo "=== ldiv.s ==="; cc -c /usr/src/libc/crt/ldiv.s
+echo "=== lmul.s ==="; cc -c /usr/src/libc/crt/lmul.s
+echo "=== lrem.s ==="; cc -c /usr/src/libc/crt/lrem.s
+echo "=== mcount.s ==="; cc -c /usr/src/libc/crt/mcount.s
+echo "=== csv.s ==="; cc -c /usr/src/libc/crt/csv.s
+
 ./mklib