convert pi for loop construct to look like pc for loop
authorKirk McKusick <mckusic@ucbvax.Berkeley.EDU>
Sat, 17 Jan 1981 10:02:41 +0000 (02:02 -0800)
committerKirk McKusick <mckusic@ucbvax.Berkeley.EDU>
Sat, 17 Jan 1981 10:02:41 +0000 (02:02 -0800)
SCCS-vsn: usr.bin/pascal/src/put.c 1.7
SCCS-vsn: usr.bin/pascal/src/stat.c 1.2
SCCS-vsn: usr.bin/pascal/src/pimakefile 1.15

usr/src/usr.bin/pascal/src/pimakefile
usr/src/usr.bin/pascal/src/put.c
usr/src/usr.bin/pascal/src/stat.c

index 3c22b75..6f0532c 100644 (file)
@@ -1,4 +1,4 @@
-SCCSID = "@(#)pimakefile 1.14 %G%"
+SCCSID = "@(#)pimakefile 1.15 %G%"
 WHOAMI = pi
 INSTALLNAME = ${DESTDIR}/usr/ucb/pi
 VERSION = 2.0
 WHOAMI = pi
 INSTALLNAME = ${DESTDIR}/usr/ucb/pi
 VERSION = 2.0
@@ -20,8 +20,8 @@ ERRORSTRINGS = pi2.0strings
 
 SRCS = ato.c \
        call.c case.c clas.c const.c conv.c cset.c \
 
 SRCS = ato.c \
        call.c case.c clas.c const.c conv.c cset.c \
-       error.c fdec.c flvalue.c func.c gen.c hash.c \
-       lab.c lookup.c lval.c stklval.c \
+       error.c fdec.c flvalue.c forop.c func.c gen.c \
+       hash.c lab.c lookup.c lval.c stklval.c \
        main.c nl.c proc.c put.c \
        rec.c rval.c stkrval.c\
        stat.c string.c subr.c \
        main.c nl.c proc.c put.c \
        rec.c rval.c stkrval.c\
        stat.c string.c subr.c \
@@ -38,8 +38,8 @@ OTHERS = pas.y opc.c version.c gram pic.c
 
 OBJS = ato.o \
        call.o case.o clas.o const.o conv.o cset.o \
 
 OBJS = ato.o \
        call.o case.o clas.o const.o conv.o cset.o \
-       error.o fdec.o flvalue.o func.o gen.o hash.o \
-       lab.o lookup.o lval.o stklval.o \
+       error.o fdec.o flvalue.o forop.o func.o gen.o \
+       hash.o lab.o lookup.o lval.o stklval.o \
        main.o nl.o proc.o put.o \
        rec.o rval.o stkrval.o\
        stat.o string.o subr.o \
        main.o nl.o proc.o put.o \
        rec.o rval.o stkrval.o\
        stat.o string.o subr.o \
@@ -181,6 +181,13 @@ flvalue.o: opcode.h
 flvalue.o: objfmt.h
 flvalue.o: pc.h
 flvalue.o: pcops.h
 flvalue.o: objfmt.h
 flvalue.o: pc.h
 flvalue.o: pcops.h
+forop.o: whoami.h
+forop.o: 0.h
+forop.o: opcode.h
+forop.o: tree.h
+forop.o: opcode.h
+forop.o: pc.h
+forop.o: pcops.h
 flvalue.o: whoami.h
 flvalue.o: 0.h
 flvalue.o: tree.h
 flvalue.o: whoami.h
 flvalue.o: 0.h
 flvalue.o: tree.h
@@ -280,9 +287,9 @@ type.o: objfmt.h
 var.o: whoami.h
 var.o: 0.h
 var.o: align.h
 var.o: whoami.h
 var.o: 0.h
 var.o: align.h
+var.o: iorec.h
 var.o: pc.h
 var.o: pcops.h
 var.o: pc.h
 var.o: pcops.h
-var.o: iorec.h
 y.tab.o: whoami.h
 y.tab.o: 0.h
 y.tab.o: yy.h
 y.tab.o: whoami.h
 y.tab.o: 0.h
 y.tab.o: yy.h
index 14d19cf..ee8b171 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[] = "@(#)put.c 1.6 %G%";
+static char sccsid[] = "@(#)put.c 1.7 %G%";
 
 #include "whoami.h"
 #include "opcode.h"
 
 #include "whoami.h"
 #include "opcode.h"
@@ -152,14 +152,15 @@ put(a)
 /*****
                        codeline = 0;
 *****/
 /*****
                        codeline = 0;
 *****/
+                       /* relative addressing */
+                       p[1] -= ( unsigned ) lc + sizeof(short);
+                       break;
                case O_FOR1U:
                case O_FOR2U:
                case O_FOR1U:
                case O_FOR2U:
-               case O_FOR4U:
                case O_FOR1D:
                case O_FOR2D:
                case O_FOR1D:
                case O_FOR2D:
-               case O_FOR4D:
                        /* relative addressing */
                        /* relative addressing */
-                       p[1] -= ( unsigned ) lc + 2;
+                       p[3] -= ( unsigned ) lc + 3 * sizeof(short);
                        break;
                case O_CONG:
                        i = p[1];
                        break;
                case O_CONG:
                        i = p[1];
@@ -258,6 +259,12 @@ around:
                                break;
                        }
                        goto longgen;
                                break;
                        }
                        goto longgen;
+               case O_FOR4U:
+               case O_FOR4D:
+                       /* relative addressing */
+                       p[3] -= ( unsigned ) lc +
+                               (sizeof(short) + 2 * sizeof(long));
+                       goto longgen;
                case O_TRA4:
                case O_CALL:
                case O_FSAV:
                case O_TRA4:
                case O_CALL:
                case O_FSAV:
@@ -311,7 +318,7 @@ around:
                        long    *lp = &p[1];
 
                        n = (n << 1) - 1;
                        long    *lp = &p[1];
 
                        n = (n << 1) - 1;
-                       if ( op == O_LRV )
+                       if ( op == O_LRV || op == O_FOR4U || op == O_FOR4D)
                                n--;
 #ifdef DEBUG
                        if (opt('k'))
                                n--;
 #ifdef DEBUG
                        if (opt('k'))
index fd4678f..59bebde 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[] = "@(#)stat.c 1.1 %G%";
+static char sccsid[] = "@(#)stat.c 1.2 %G%";
 
 #include "whoami.h"
 #include "0.h"
 
 #include "whoami.h"
 #include "0.h"
@@ -98,12 +98,7 @@ top:
                                        break;
                                case T_FORU:
                                case T_FORD:
                                        break;
                                case T_FORU:
                                case T_FORD:
-#                                      ifdef OBJ
-                                           forop(s);
-#                                      endif OBJ
-#                                      ifdef PC
-                                           pcforop( s );
-#                                      endif PC
+                                       forop(s);
                                        noreach = 0;
                                        break;
                                case T_BLOCK:
                                        noreach = 0;
                                        break;
                                case T_BLOCK:
@@ -444,124 +439,6 @@ asgnop1(r, p)
        return (p);     /* Used by for statement */
 }
 
        return (p);     /* Used by for statement */
 }
 
-#ifdef OBJ
-/*
- * for var := expr [down]to expr do stat
- */
-forop(r)
-       int *r;
-{
-       register struct nl *t1, *t2;
-       int l1, l2, l3;
-       long soffset;
-       register op;
-       struct nl *p;
-       int *rr, goc, i;
-
-       p = NIL;
-       goc = gocnt;
-       if (r == NIL)
-               goto aloha;
-       putline();
-       /*
-        * Start with assignment
-        * of initial value to for variable
-        */
-       t1 = asgnop1(r[2], NIL);
-       if (t1 == NIL) {
-               rvalue(r[3], NIL , RREQ );
-               statement(r[4]);
-               goto aloha;
-       }
-       rr = r[2];              /* Assignment */
-       rr = rr[2];             /* Lhs variable */
-       if (rr[3] != NIL) {
-               error("For variable must be unqualified");
-               rvalue(r[3], NIL , RREQ );
-               statement(r[4]);
-               goto aloha;
-       }
-       p = lookup(rr[2]);
-       p->value[NL_FORV] = 1;
-       if (isnta(t1, "bcis")) {
-               error("For variables cannot be %ss", nameof(t1));
-               statement(r[4]);
-               goto aloha;
-       }
-       /*
-        * Allocate automatic
-        * space for limit variable
-        */
-       sizes[cbn].om_off -= 4;
-       if (sizes[cbn].om_off < sizes[cbn].om_max)
-               sizes[cbn].om_max = sizes[cbn].om_off;
-       i = sizes[cbn].om_off;
-       /*
-        * Initialize the limit variable
-        */
-       put2(O_LV | cbn<<8+INDX, i);
-       t2 = rvalue(r[3], NIL , RREQ );
-       if (incompat(t2, t1, r[3])) {
-               cerror("Limit type clashed with index type in 'for' statement");
-               statement(r[4]);
-               goto aloha;
-       }
-       put1(width(t2) <= 2 ? O_AS24 : O_AS4);
-       /*
-        * See if we can skip the loop altogether
-        */
-       rr = r[2];
-       if (rr != NIL)
-               rvalue(rr[2], NIL , RREQ );
-       put2(O_RV4 | cbn<<8+INDX, i);
-       gen(NIL, r[0] == T_FORU ? T_LE : T_GE, width(t1), 4);
-       /*
-        * L1 will be patched to skip the body of the loop.
-        * L2 marks the top of the loop when we go around.
-        */
-       put2(O_IF, (l1 = getlab()));
-       putlab(l2 = getlab());
-       putcnt();
-       statement(r[4]);
-       /*
-        * now we see if we get to go again
-        */
-       if (opt('t') == 0) {
-               /*
-                * Easy if we dont have to test
-                */
-               put2(O_RV4 | cbn<<8+INDX, i);
-               if (rr != NIL)
-                       lvalue(rr[2], MOD , RREQ );
-               put2((r[0] == T_FORU ? O_FOR1U : O_FOR1D) + (width(t1) >> 1), l2);
-       } else {
-               line = r[1];
-               putline();
-               if (rr != NIL)
-                       rvalue(rr[2], NIL , RREQ );
-               put2(O_RV4 | cbn << 8+INDX, i);
-               gen(NIL, (r[0] == T_FORU ? T_LT : T_GT), width(t1), 4);
-               l3 = put2(O_IF, getlab());
-               lvalue((int *) rr[2], MOD , RREQ );
-               rvalue(rr[2], NIL , RREQ );
-               put2(O_CON2, 1);
-               t2 = gen(NIL, r[0] == T_FORU ? T_ADD: T_SUB, width(t1), 2);
-               rangechk(t1, t2);       /* The point of all this */
-               gen(O_AS2, O_AS2, width(t1), width(t2));
-               put2(O_TRA, l2);
-               patch(l3);
-       }
-       sizes[cbn].om_off += 4;
-       patch(l1);
-aloha:
-       noreach = 0;
-       if (p != NIL)
-               p->value[NL_FORV] = 0;
-       if (goc != gocnt)
-               putcnt();
-}
-#endif OBJ
-
 /*
  * if expr then stat [ else stat ]
  */
 /*
  * if expr then stat [ else stat ]
  */