Selaa lähdekoodia

feat(express): proc50 near-exact (factor dispatcher, 3 documented deltas)

Eric Streit 2 viikkoa sitten
vanhempi
commit
4634aad937
2 muutettua tiedostoa jossa 98 lisäystä ja 0 poistoa
  1. 8 0
      SESSION.md
  2. 90 0
      src/compiler/EXPRESS.MOD

+ 8 - 0
SESSION.md

@@ -336,3 +336,11 @@ Next: GENZ80 media hunt; stage-2 pty-driven MCD diff per module.
   (not folded); T1 param for link2; BITSET accumulators with CARDINAL()
   wraps; value-record buf (no mystery); proper-proc leave unaffected by
   nesting (leave 1 top-level too).
+- proc50 near-exact (178/181 ops identical): FIXME-NOT (unchecked boolean-NOT,
+  emulated), FIXME-DWORD (transfer-deref ban, two singles), 92-arm layout
+  (retail lays last labeled arm before switch WITH break; Borland splits it
+  after WITHOUT — toolchain codegen delta). jump_stack=bare RETURN proven
+  (59 in file, 1 push total); nested-proper leave long-form (84 NN);
+  T1 param; CopyStr fits DEF as-is; LONGINT(REAL) free; BITSET{0..8} folds.
+- Phantom-dump lesson: always re-grep ground truth; never trust a single
+  scripted dump without byte-spot-checks.

+ 90 - 0
src/compiler/EXPRESS.MOD

@@ -110,6 +110,9 @@ PROCEDURE ParseTypeCast(kind: CARDINAL); FORWARD;
 PROCEDURE ParseFuncCall(idx: CARDINAL): ADDRESS; FORWARD;
 PROCEDURE Proc43(code: BOOLEAN); FORWARD;
 PROCEDURE Proc44(p1: WalkPtr); FORWARD;
+PROCEDURE Proc50; FORWARD;
+PROCEDURE Proc18; FORWARD;
+PROCEDURE Proc19; FORWARD;
 PROCEDURE ExpandStdProc45(std: CARDINAL); FORWARD; (* FIXME: 0-arg call site *)
 PROCEDURE ExpandStdProc46; FORWARD;
 PROCEDURE MatchOpClass(allowed: BITSET; errCode: CARDINAL); FORWARD;
@@ -321,6 +324,93 @@ END Proc31;
 (* proc51 @0ecc — set-constructor collector (NESTED in proc50: move in
    nesting pass). buf is a Head VALUE local (auto reserve-10; addresses are
    addresses, so no-^ reads match HeadPtr shapes exactly). *)
+(* proc50 @0f72 — factor dispatcher (NESTED in proc49: ec-calls + self-ee;
+   move in nesting pass). jump_stacks are bare RETURNs (single push_code_addr
+   in all of EXPRESS is proc15's). leave 0 long-form (nested).
+   FIXME-NOT (R1 value-flip: Borland unchecked NOT) emulated by =0-normalize;
+   FIXME-DWORD (91-arm double copy) by two singles. *)
+PROCEDURE Proc50;
+VAR t2: NodePtr; (* local-2 *)
+BEGIN
+  IF Scanner.curSym = 66 THEN
+    Scanner.GetSym;
+    Proc50();
+    ConstToCard(Compiler.BooleanType, 66);
+    IF curDesc^.mode = 0 THEN
+      CodeGen.DiscardPending;
+      curDesc^.value := ADDRESS(ORD(CARDINAL(curDesc^.value) = 0)); (* FIXME-NOT *)
+      PushOperand(curDesc);
+    ELSE CodeGen.EmitStandardOp(3);
+    END;
+  ELSIF (Scanner.curSym - 43) IN BITSET{0,2} THEN
+    IF Scanner.AcceptSy(43) THEN
+      BoolCondHelper;
+      Scanner.ExpectSy(5);
+    ELSE
+      Scanner.GetSym;
+      Proc51(SymTab.T1(Compiler.BitsetType));
+    END;
+  ELSE
+    Scanner.PushWith;
+    t2 := NodePtr(Scanner.litType);
+    curDesc^.typ := t2;
+    IF Scanner.isLit THEN
+      curDesc^.mode := 0;
+      IF RecordPtr(t2) = Compiler.charArrayDesc THEN
+        Scanner.CopyStr(curDesc^.value, Scanner.tokBuf);
+        curDesc^.extra := 0;
+      ELSIF t2^.w4 IN BITSET{7,8} THEN
+        IF CARDINAL(t2^.w3) = 8 THEN
+          Proc47(Scanner.lrealVal);
+        ELSE
+          curDesc^.lv := LONGINT(Scanner.realVal);
+        END;
+      ELSE
+        curDesc^.value := ADDRESS(Scanner.cardVal);
+      END;
+      PushOperand(curDesc);
+      Scanner.GetSym;
+    ELSE
+      CASE Scanner.identKd OF
+        91: curDesc^.mode := 0;
+            curDesc^.value := ADDRESS(CARDINAL(Scanner.curNode^.word5)); (* FIXME-DWORD *)
+            curDesc^.extra := CARDINAL(Scanner.curNode^.high);
+            PushOperand(curDesc);
+            Scanner.GetSym;
+      | 93: Scanner.GetSym;
+            Scanner.TestSet(BITSET{3,5});
+            IF Scanner.AcceptSy(45) THEN
+              MatchOpClass(BITSET{4}, 45);
+              Proc51(SymTab.T1(t2));
+            ELSE
+              MatchOpClass(BITSET{0,1,2,3,4,5,6,7,8}, 43);
+              Scanner.GetSym;
+              BoolCondHelper;
+              MatchOpClass(BITSET{0,1,2,3,4,5,6,7,8}, 0);
+              CentralError((CARDINAL(t2^.w3) + 1) DIV 2
+                           = (CARDINAL(curDesc^.typ^.w3) + 1) DIV 2, 66);
+              curDesc^.typ := t2;
+              curDesc^.mode := 2;
+              Scanner.ExpectSy(5);
+            END;
+      | 94: ParseDesignatorTail;
+            IF Scanner.curSym = 43 THEN
+              Scanner.GetSym;
+              MatchOpClass(BITSET{9}, 43);
+              CentralError(CARDINAL(t2^.w2) <> 0, 60);
+              Proc19;
+            ELSE
+              PushOperand(curDesc);
+            END;
+      | 95: CentralError(CARDINAL(NodePtr(t2)) <> 0, 60);
+            Proc18;
+      | 90: Errors.ReportErrorWithText(0, Scanner.tokBuf);
+      | 92: Errors.ReportError(22);
+      END;
+      CheckAndStore(curDesc);
+    END;
+  END;
+END Proc50;
 PROCEDURE Proc51(p1: SymTab.T1);
 VAR count: BITSET; (* word-2 *) latch: BOOLEAN; (* word-3 *)
     flag: BOOLEAN; (* word-4 *) buf: Head; (* word-5, 10 bytes *)