|
@@ -145,10 +145,45 @@ PROCEDURE Proc6;
|
|
|
BEGIN
|
|
BEGIN
|
|
|
IF curDesc^.typ^.w4 = 1 THEN curDesc^.typ := NodePtr(curDesc^.typ^.w2) END;
|
|
IF curDesc^.typ^.w4 = 1 THEN curDesc^.typ := NodePtr(curDesc^.typ^.w2) END;
|
|
|
END Proc6;
|
|
END Proc6;
|
|
|
|
|
+(* proc10 @0127 — ~NormalizeOperand: fold descriptor to pending-op form. *)
|
|
|
PROCEDURE NormalizeOperand(d: HeadPtr);
|
|
PROCEDURE NormalizeOperand(d: HeadPtr);
|
|
|
-BEGIN HALT; END NormalizeOperand;
|
|
|
|
|
-PROCEDURE LoadIndirect(d: HeadPtr);
|
|
|
|
|
-BEGIN HALT; END LoadIndirect;
|
|
|
|
|
|
|
+VAR v, k: CARDINAL; (* local-2, local-3 *)
|
|
|
|
|
+BEGIN
|
|
|
|
|
+ v := CARDINAL(d^.value); k := d^.kind;
|
|
|
|
|
+ IF k = 5 THEN
|
|
|
|
|
+ LoadIndirect(d^);
|
|
|
|
|
+ CodeGen.EmitTypedOp(8, 0);
|
|
|
|
|
+ CodeGen.EmitTypedOp(6, 0);
|
|
|
|
|
+ ELSIF (Proc24(d^.typ) OR (d^.typ^.w4 > 9)) AND (k <> 2) THEN
|
|
|
|
|
+ CodeGen.SetPendingOp(1, k, v, d^.extra);
|
|
|
|
|
+ ELSE
|
|
|
|
|
+ IF k <= 1 THEN v := (CARDINAL(d^.typ^.w3) + 1) DIV 2 * 2 END;
|
|
|
|
|
+ CodeGen.SetPendingOp(8, k, v, d^.extra);
|
|
|
|
|
+ END;
|
|
|
|
|
+END NormalizeOperand;
|
|
|
|
|
+(* proc11 @00e1 — ~LoadIndirect: normalize scratch copy, emit address code.
|
|
|
|
|
+ d is a VALUE param (entry copies 10 bytes via reserve_string so field
|
|
|
|
|
+ writes don't touch the caller); callers pass free ^ derefs. *)
|
|
|
|
|
+PROCEDURE LoadIndirect(d: Head);
|
|
|
|
|
+VAR flag: BOOLEAN; (* local-2 *)
|
|
|
|
|
+BEGIN
|
|
|
|
|
+ IF LookupField(RecordPtr(d.typ)) THEN
|
|
|
|
|
+ flag := FALSE;
|
|
|
|
|
+ REPEAT
|
|
|
|
|
+ EmitAddress(ADR(d));
|
|
|
|
|
+ CodeGen.QueueConst(1);
|
|
|
|
|
+ CodeGen.EmitTypedOp(6, 0);
|
|
|
|
|
+ IF flag THEN CodeGen.EmitTypedOp(8, 0) END;
|
|
|
|
|
+ d.typ := NodePtr(d.typ^.w5);
|
|
|
|
|
+ DEC(d.extra, 2);
|
|
|
|
|
+ flag := TRUE;
|
|
|
|
|
+ UNTIL NOT LookupField(RecordPtr(d.typ));
|
|
|
|
|
+ CodeGen.QueueConst(CARDINAL(d.typ^.w3));
|
|
|
|
|
+ CodeGen.EmitTypedOp(8, 0);
|
|
|
|
|
+ ELSE
|
|
|
|
|
+ CodeGen.QueueConst(CARDINAL(d.typ^.w3));
|
|
|
|
|
+ END;
|
|
|
|
|
+END LoadIndirect;
|
|
|
PROCEDURE BoolCondHelper;
|
|
PROCEDURE BoolCondHelper;
|
|
|
BEGIN HALT; END BoolCondHelper;
|
|
BEGIN HALT; END BoolCondHelper;
|
|
|
PROCEDURE OpSetTest(allowed: BITSET; errCode: CARDINAL);
|
|
PROCEDURE OpSetTest(allowed: BITSET; errCode: CARDINAL);
|
|
@@ -444,7 +479,7 @@ BEGIN
|
|
|
IF LookupField(RecordPtr(t)) THEN
|
|
IF LookupField(RecordPtr(t)) THEN
|
|
|
flags := CARDINAL(t^.w5^.word3);
|
|
flags := CARDINAL(t^.w5^.word3);
|
|
|
IF LookupField(t^.w5) OR ODD(flags) THEN
|
|
IF LookupField(t^.w5) OR ODD(flags) THEN
|
|
|
- LoadIndirect(curDesc);
|
|
|
|
|
|
|
+ LoadIndirect(curDesc^);
|
|
|
CodeGen.QueueConst(1);
|
|
CodeGen.QueueConst(1);
|
|
|
CodeGen.EmitTypedOp(7, 0);
|
|
CodeGen.EmitTypedOp(7, 0);
|
|
|
CodeGen.QueueConst(2);
|
|
CodeGen.QueueConst(2);
|
|
@@ -878,7 +913,7 @@ BEGIN
|
|
|
ELSE (*{0b27} address-builtin path *)
|
|
ELSE (*{0b27} address-builtin path *)
|
|
|
save5 := CodeGen.emitEnabled; CodeGen.emitEnabled := 0; (*{0b27-0b2b}*)
|
|
save5 := CodeGen.emitEnabled; CodeGen.emitEnabled := 0; (*{0b27-0b2b}*)
|
|
|
ParseDesignatorTail; CodeGen.emitEnabled := 1; (*{0b2d-0b2f}*)
|
|
ParseDesignatorTail; CodeGen.emitEnabled := 1; (*{0b2d-0b2f}*)
|
|
|
- LoadIndirect(curDesc); (*FIXME-ARG*) (*{0b31} local proc11 *)
|
|
|
|
|
|
|
+ LoadIndirect(curDesc^); (*FIXME-ARG*) (*{0b31} local proc11 *)
|
|
|
END;
|
|
END;
|
|
|
| 103..105:
|
|
| 103..105:
|
|
|
Scanner.PushWith; Scanner.ExpectKd(3); (*{0b34-0b37}*)
|
|
Scanner.PushWith; Scanner.ExpectKd(3); (*{0b34-0b37}*)
|