Переглянути джерело

feat(express): verify proc2; DEF Head LONGINT variant (byte-neutral, proc28 re-scored)

Eric Streit 2 тижнів тому
батько
коміт
a9ac104a36
3 змінених файлів з 33 додано та 4 видалено
  1. 4 0
      SESSION.md
  2. 9 3
      src/compiler/EXPRESS.DEF
  3. 20 1
      src/compiler/EXPRESS.MOD

+ 4 - 0
SESSION.md

@@ -299,3 +299,7 @@ Next: GENZ80 media hunt; stage-2 pty-driven MCD diff per module.
   emits `not+jpfalse-back` (matches proc20's UNTIL NOT). d.typ-unwrap same
   5-push shape as CheckAndStore. ADR(d) on value param legal (alt for
   EmitAddress(ADR(d)) kept HeadPtr signature, no call-site churn).
+- Verified now 26: + proc2 PushOperand (60/60). Needed DEF Head variant arm
+  (value+extra overlay lv LONGINT for QueueLongConst dword-load; layout
+  unchanged, re-scored proc28 52/52 to prove byte-neutrality). ORD()+const
+  gives `add N` peephole; (A OR B) AND C parens reproduce orjp/andjp.

+ 9 - 3
src/compiler/EXPRESS.DEF

@@ -42,11 +42,17 @@ TYPE DescPtr = POINTER TO Desc;
        w6: CARDINAL;
      END;
      Head = RECORD (* 5-word descriptor head (MCD global word2 accesses
-       fields 0-4 only); typ: NodePtr so typ^.w0(T1)/w2(DescPtr) reach *)
+       fields 0-4 only); typ: NodePtr so typ^.w0(T1)/w2(DescPtr) reach;
+       value+extra overlay lv LONGINT (proc2 QueueLongConst dword-load) *)
        typ: NodePtr;
        mode: CARDINAL;
-       value: CharBufPtr;
-       extra: CARDINAL;
+       CASE : BOOLEAN OF
+       | TRUE:
+         value: CharBufPtr;
+         extra: CARDINAL;
+       | FALSE:
+         lv: LONGINT;
+       END;
        kind: CARDINAL;
      END;
 

+ 20 - 1
src/compiler/EXPRESS.MOD

@@ -98,8 +98,27 @@ PROCEDURE CheckAssignmentCompat(dst: ADDRESS); FORWARD;
 
 (* FIXME-NYC stubs (signatures per call sites; bodies TBD by MCD audit;
    these 6 may merge with PushExprDesc/PopExprDesc/etc. once mapping lands). *)
+(* proc2 @0172 — ~PushOperand: emit descriptor as code operand. *)
 PROCEDURE PushOperand(d: HeadPtr);
-BEGIN HALT; END PushOperand;
+BEGIN
+  IF d^.mode = 0 THEN
+    IF d^.typ^.w4 >= 7 THEN
+      IF RecordPtr(d^.typ) = Compiler.charArrayDesc THEN
+        CodeGen.QueueLongConst(0, d^.lv);
+      ELSE
+        CodeGen.QueueLongConst(ORD(RecordPtr(d^.typ) = Compiler.LongrealType) + 2, d^.lv);
+      END;
+    ELSE
+      CodeGen.QueueConst(CARDINAL(d^.value));
+    END;
+  ELSE
+    IF d^.typ^.w4 > 9 THEN NormalizeOperand(d);
+    ELSE
+      CodeGen.SetPendingOp((CARDINAL(d^.typ^.w3) DIV 2) - ORD(RecordPtr(d^.typ) = Compiler.LongrealType),
+        d^.kind, CARDINAL(d^.value), d^.extra);
+    END;
+  END;
+END PushOperand;
 PROCEDURE PopOperand(d: HeadPtr);
 BEGIN HALT; END PopOperand;
 (* proc25 @000c — option-12 guard. *)