BSD 4_4 release
[unix-history] / usr / src / old / pcc / ccom.tahoe / local2.c
index 1d92e2a..158d04e 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)local2.c   1.29 (Berkeley) %G%";
+static char sccsid[] = "@(#)local2.c   1.32 (Berkeley) 2/29/88";
 #endif
 
 # include "pass2.h"
 #endif
 
 # include "pass2.h"
@@ -338,11 +338,16 @@ zzzcode( p, c ) register NODE *p; {
                }
 
        case 'D':       /* INCR and DECR */
                }
 
        case 'D':       /* INCR and DECR */
-               zzzcode(p->in.left, 'U');
+               if (p->in.left->in.type == FLOAT)
+                       expand(p, INAREG, "movl\tAL,A1");
+               else if (p->in.left->in.type == DOUBLE)
+                       expand(p, INAREG, "ldd\tAL\n\tstd\tA1");
+               else
+                       zzzcode(p->in.left, 'U');
                putstr("\n      ");
 
        case 'E':       /* INCR and DECR, FOREFF */
                putstr("\n      ");
 
        case 'E':       /* INCR and DECR, FOREFF */
-               if (p->in.right->tn.lval == 1)
+               if (p->in.right->in.op == ICON && p->in.right->tn.lval == 1)
                        {
                        putstr(p->in.op == INCR ? "inc" : "dec");
                        prtype(p->in.left);
                        {
                        putstr(p->in.op == INCR ? "inc" : "dec");
                        prtype(p->in.left);
@@ -350,6 +355,15 @@ zzzcode( p, c ) register NODE *p; {
                        adrput(p->in.left);
                        return;
                        }
                        adrput(p->in.left);
                        return;
                        }
+               else if (p->in.left->in.type == FLOAT || p->in.left->in.type == DOUBLE) {
+                       if (c == 'E' || p->in.left->in.type == FLOAT)
+                               expand(p, INAREG, "ldZL\tAL\n\t");
+                       if (p->in.op == INCR)
+                               expand(p, INAREG, "addZL\tAR\n\tstZL\tAL");
+                       else /* DECR */
+                               expand(p, INAREG, "subZL\tAR\n\tstZL\tAL");
+                       return;
+                       }
                putstr(p->in.op == INCR ? "add" : "sub");
                prtype(p->in.left);
                putstr("2       ");
                putstr(p->in.op == INCR ? "add" : "sub");
                prtype(p->in.left);
                putstr("2       ");
@@ -832,8 +846,7 @@ sconv(p, forcc)
                        adrput(dst);
                        putstr("\n\tmovab\t4(sp),sp");
                        if (forcc) {
                        adrput(dst);
                        putstr("\n\tmovab\t4(sp),sp");
                        if (forcc) {
-                               /* inverted test */
-                               putstr("\n\tcmpl\t$0,");
+                               putstr("\n\ttstl\t");
                                adrput(dst);
                        }
                        return;
                                adrput(dst);
                        }
                        return;
@@ -874,8 +887,7 @@ sconv(p, forcc)
                        adrput(dst);
                        putstr("\n\tmovab\t4(sp),sp");
                        if (forcc) {
                        adrput(dst);
                        putstr("\n\tmovab\t4(sp),sp");
                        if (forcc) {
-                               /* inverted test */
-                               putstr("\n\tcmpl\t$0,");
+                               putstr("\n\ttstl\t");
                                adrput(dst);
                        }
                        return;
                                adrput(dst);
                        }
                        return;