Bläddra i källkod

lower L7: decouple Term from the emitter

Same treatment as SimExpr: drop DelayBegin/DelayEnd, the AND
short-circuit labels/stores, the set-intersection SetBinOp, and the
long/real mul/div/rem NewTemp/Op3*.  Runtime results become the
non-constant sentinel "@"; Fold2 and all checks stay.

Suite 204/204; FIXPOINT OK (3,410,233 bytes).
Eric Streit 3 dagar sedan
förälder
incheckning
5fb26e7955
2 ändrade filer med 850 tillägg och 948 borttagningar
  1. 15 64
      compiler/src/M2.atg
  2. 835 884
      compiler/src/M2.lst

+ 15 - 64
compiler/src/M2.atg

@@ -2771,10 +2771,8 @@ PRODUCTIONS
                                              lNext, lFalse, lDone, qr, qs: QbeGen.QVal;
                                               astA, astB: AST.Node;
                                               astOp: INTEGER; .)
-    = Fact<t, q> (. astA := astCur; .) { MulOp<op>            (. IF op = SymTab.OpAnd THEN
-                                             QbeGen.DelayBegin END; .)
-        Fact<t2, q2> (. astB := astCur; IF op = SymTab.OpAnd THEN
-                                              QbeGen.DelayEnd END; .)
+    = Fact<t, q> (. astA := astCur; .) { MulOp<op>
+        Fact<t2, q2> (. astB := astCur; .)
       (. astOp := AST.OpMul;
          IF op = SymTab.OpSlash THEN astOp := AST.OpDiv
          ELSIF op = SymTab.OpDiv THEN astOp := AST.OpDiv
@@ -2787,39 +2785,19 @@ PRODUCTIONS
            IF SymTab.BoolCheck(t) AND SymTab.BoolCheck(t2) THEN
              t := SymTab.BoolType()
            ELSE SemError(212); t := SymTab.InvalidType END;
-           IF t # SymTab.InvalidType THEN
-             QbeGen.Slot4(qs);
-             QbeGen.NewLabel(lNext);
-             QbeGen.NewLabel(lFalse);
-             QbeGen.NewLabel(lDone);
-             QbeGen.Jnz(q, lNext, lFalse);
-             QbeGen.EmitLabel(lNext);
-             QbeGen.DelayFlush;
-             QbeGen.StoreW(qs, q2);
-             QbeGen.Jmp(lDone);
-             QbeGen.EmitLabel(lFalse);
-             QbeGen.StoreW(qs, "0");
-             QbeGen.Jmp(lDone);
-             QbeGen.EmitLabel(lDone);
-             QbeGen.LoadW(qs, qr);
-             QbeGen.CopyOp(qr, q)
-           ELSE QbeGen.DelayFlush; QbeGen.CopyOp("0", q)
-           END
+            IF t # SymTab.InvalidType THEN QbeGen.CopyOp("@", q)
+            ELSE QbeGen.CopyOp("0", q)
+            END
          ELSIF (t # SymTab.InvalidType) AND (t2 # SymTab.InvalidType)
  AND (SymTab.ClassOf(t) = SymTab.ClSet)
  AND (SymTab.ClassOf(t2) = SymTab.ClSet) THEN
-           lw := SymTab.SetWords(t); rw := SymTab.SetWords(t2);
-           mw := lw;
-           IF rw > mw THEN mw := rw END;
-           IF op = SymTab.OpTimes THEN
-             QbeGen.SetBinOp(1, q, q2, lw, rw, qt)
-           ELSE
-             QbeGen.SetBinOp(3, q, q2, lw, rw, qt)
-           END;
-           t := SymTab.NewSet(
-                  SymTab.NewSubR(0,
-                    VAL(INTEGER, mw) * 32 - 1));
-           QbeGen.CopyOp(qt, q)
+            lw := SymTab.SetWords(t); rw := SymTab.SetWords(t2);
+            mw := lw;
+            IF rw > mw THEN mw := rw END;
+            t := SymTab.NewSet(
+                   SymTab.NewSubR(0,
+                     VAL(INTEGER, mw) * 32 - 1));
+            QbeGen.CopyOp("@", q)
          ELSE
            IF SymTab.ArithCheck(t, t2,
                 (op = SymTab.OpDiv) OR (op = SymTab.OpMod),
@@ -2841,36 +2819,9 @@ PRODUCTIONS
                END
              END;
              IF folded THEN QbeGen.CopyOp(qf, q)
-             ELSE
-             IF isL THEN
-               IF SymTab.IsIntFamily(lt) THEN
-                 QbeGen.WidenLong(q, wq); QbeGen.CopyOp(wq, q)
-               END;
-               IF SymTab.IsIntFamily(rt) THEN
-                 QbeGen.WidenLong(q2, wq); QbeGen.CopyOp(wq, q2)
-               END;
-               QbeGen.NewTemp(qt);
-               IF op = SymTab.OpTimes THEN
-                 QbeGen.Op3L("mul", qt, q, q2)
-               ELSIF (op = SymTab.OpDiv)
-                  OR (op = SymTab.OpSlash) THEN
-                 QbeGen.Op3L("div", qt, q, q2)
-               ELSE
-                 QbeGen.Op3L("rem", qt, q, q2)
-               END
-             ELSE
-               QbeGen.NewTemp(qt);
-               IF op = SymTab.OpTimes THEN
-                 QbeGen.Op3("mul", qt, q, q2, isR)
-               ELSIF (op = SymTab.OpDiv)
-                  OR (op = SymTab.OpSlash) THEN
-                 QbeGen.Op3("div", qt, q, q2, isR)
-               ELSE
-                 QbeGen.Op3("rem", qt, q, q2, isR)
-               END
-             END;
-             QbeGen.CopyOp(qt, q)
-             END
+              ELSE
+              QbeGen.CopyOp("@", q)
+              END
            ELSE QbeGen.CopyOp("0", q)
            END
          END; .) } .

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 835 - 884
compiler/src/M2.lst


Vissa filer visades inte eftersom för många filer har ändrats