|
@@ -110,6 +110,9 @@ PROCEDURE ParseTypeCast(kind: CARDINAL); FORWARD;
|
|
|
PROCEDURE ParseFuncCall(idx: CARDINAL): ADDRESS; FORWARD;
|
|
PROCEDURE ParseFuncCall(idx: CARDINAL): ADDRESS; FORWARD;
|
|
|
PROCEDURE Proc43(code: BOOLEAN); FORWARD;
|
|
PROCEDURE Proc43(code: BOOLEAN); FORWARD;
|
|
|
PROCEDURE Proc44(p1: WalkPtr); 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 ExpandStdProc45(std: CARDINAL); FORWARD; (* FIXME: 0-arg call site *)
|
|
|
PROCEDURE ExpandStdProc46; FORWARD;
|
|
PROCEDURE ExpandStdProc46; FORWARD;
|
|
|
PROCEDURE MatchOpClass(allowed: BITSET; errCode: CARDINAL); FORWARD;
|
|
PROCEDURE MatchOpClass(allowed: BITSET; errCode: CARDINAL); FORWARD;
|
|
@@ -321,6 +324,93 @@ END Proc31;
|
|
|
(* proc51 @0ecc — set-constructor collector (NESTED in proc50: move in
|
|
(* proc51 @0ecc — set-constructor collector (NESTED in proc50: move in
|
|
|
nesting pass). buf is a Head VALUE local (auto reserve-10; addresses are
|
|
nesting pass). buf is a Head VALUE local (auto reserve-10; addresses are
|
|
|
addresses, so no-^ reads match HeadPtr shapes exactly). *)
|
|
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);
|
|
PROCEDURE Proc51(p1: SymTab.T1);
|
|
|
VAR count: BITSET; (* word-2 *) latch: BOOLEAN; (* word-3 *)
|
|
VAR count: BITSET; (* word-2 *) latch: BOOLEAN; (* word-3 *)
|
|
|
flag: BOOLEAN; (* word-4 *) buf: Head; (* word-5, 10 bytes *)
|
|
flag: BOOLEAN; (* word-4 *) buf: Head; (* word-5, 10 bytes *)
|