|
|
@@ -17,6 +17,7 @@ VAR
|
|
|
nR : CARDINAL; (* non-zero REAL consts flushed at BeginBody *)
|
|
|
rNames : ARRAY [0 .. 31] OF QVal;
|
|
|
rVals : ARRAY [0 .. 31] OF QVal;
|
|
|
+ rShort : ARRAY [0 .. 31] OF BOOLEAN;
|
|
|
nStr : CARDINAL; (* string-literal data counter *)
|
|
|
strNams : ARRAY [0 .. 4095] OF QVal;
|
|
|
strTexts : ARRAY [0 .. 4095] OF ARRAY [0 .. 255] OF CHAR;
|
|
|
@@ -650,6 +651,16 @@ PROCEDURE DataLine (name: ARRAY OF CHAR; isReal: BOOLEAN;
|
|
|
WL(" }")
|
|
|
END DataLine;
|
|
|
|
|
|
+PROCEDURE DataLineS (name: ARRAY OF CHAR; init: ARRAY OF CHAR);
|
|
|
+(* A 4-byte single-precision global. *)
|
|
|
+ BEGIN
|
|
|
+ IF NOT opened THEN RETURN END;
|
|
|
+ W("export data $"); W(name);
|
|
|
+ W(" = { s ");
|
|
|
+ W(init);
|
|
|
+ WL(" }")
|
|
|
+ END DataLineS;
|
|
|
+
|
|
|
PROCEDURE DataLineB (name: ARRAY OF CHAR; init: ARRAY OF CHAR);
|
|
|
(* A one-byte global (BYTE/SBYTE). *)
|
|
|
BEGIN
|
|
|
@@ -710,6 +721,7 @@ PROCEDURE DeclVar (name: ARRAY OF CHAR; t: INTEGER);
|
|
|
Cpy(g, curModName); App(g, "_"); App(g, name);
|
|
|
IF SymTab.IsBigSet(t) THEN DataLineL(g, "0")
|
|
|
ELSIF SymTab.ClassOf(t) = SymTab.ClReal THEN DataLine(g, TRUE, "0")
|
|
|
+ ELSIF SymTab.ClassOf(t) = SymTab.ClSReal THEN DataLineS(g, "0")
|
|
|
ELSIF SymTab.IsByteType(t) THEN DataLineB(g, "0")
|
|
|
ELSIF SymTab.IsWord16Type(t) THEN DataLineH(g, "0")
|
|
|
ELSIF SymTab.ClassOf(t) = SymTab.ClArray THEN DeclArr(g, t)
|
|
|
@@ -770,7 +782,14 @@ PROCEDURE DeclConst (name: ARRAY OF CHAR; val: ARRAY OF CHAR; t: INTEGER);
|
|
|
non-zero REALs flush at BeginBody. *)
|
|
|
DataLine(mang, TRUE, "0");
|
|
|
IF NOT IsZeroReal(val) AND (nR <= HIGH(rNames)) THEN
|
|
|
- Cpy(rNames[nR], mang); Cpy(rVals[nR], val); INC(nR)
|
|
|
+ Cpy(rNames[nR], mang); Cpy(rVals[nR], val);
|
|
|
+ rShort[nR] := FALSE; INC(nR)
|
|
|
+ END
|
|
|
+ ELSIF cls = SymTab.ClSReal THEN
|
|
|
+ DataLineS(mang, "0");
|
|
|
+ IF NOT IsZeroReal(val) AND (nR <= HIGH(rNames)) THEN
|
|
|
+ Cpy(rNames[nR], mang); Cpy(rVals[nR], val);
|
|
|
+ rShort[nR] := TRUE; INC(nR)
|
|
|
END
|
|
|
ELSE DataLine(mang, FALSE, val)
|
|
|
END
|
|
|
@@ -837,9 +856,15 @@ PROCEDURE BeginBody;
|
|
|
inBody := TRUE;
|
|
|
i := 0;
|
|
|
WHILE i < nR DO
|
|
|
- NewTemp(t);
|
|
|
- W(" "); W(t); W(" =d copy "); WL(rVals[i]);
|
|
|
- StoreVar(rNames[i], t, TRUE);
|
|
|
+ IF rShort[i] THEN
|
|
|
+ NewTemp(t);
|
|
|
+ W(" "); W(t); W(" =s truncd "); WL(rVals[i]);
|
|
|
+ W(" stores "); W(t); W(", $"); WL(rNames[i])
|
|
|
+ ELSE
|
|
|
+ NewTemp(t);
|
|
|
+ W(" "); W(t); W(" =d copy "); WL(rVals[i]);
|
|
|
+ StoreVar(rNames[i], t, TRUE)
|
|
|
+ END;
|
|
|
INC(i)
|
|
|
END;
|
|
|
i := 0;
|
|
|
@@ -1083,6 +1108,7 @@ PROCEDURE ResClass (t: INTEGER): CHAR;
|
|
|
BEGIN
|
|
|
cls := SymTab.ClassOf(t);
|
|
|
IF cls = SymTab.ClReal THEN RETURN "d" END;
|
|
|
+ IF cls = SymTab.ClSReal THEN RETURN "s" END;
|
|
|
IF (cls = SymTab.ClArray) OR (cls = SymTab.ClSet)
|
|
|
OR (cls = SymTab.ClRecord) OR (cls = SymTab.ClClass)
|
|
|
OR (cls = SymTab.ClPtr) OR (cls = SymTab.ClLong)
|
|
|
@@ -1183,11 +1209,15 @@ PROCEDURE AllocLocal (t: INTEGER; VAR slot: QVal);
|
|
|
ELSIF cls = SymTab.ClReal THEN
|
|
|
W(" =l alloc8 8"); WL("");
|
|
|
W(" stored d_0.0, "); WL(slot)
|
|
|
+ ELSIF cls = SymTab.ClSReal THEN
|
|
|
+ W(" =l alloc4 4"); WL("");
|
|
|
+ W(" stores s_0.0, "); WL(slot)
|
|
|
ELSIF (cls = SymTab.ClPtr) OR (cls = SymTab.ClLong)
|
|
|
OR (cls = SymTab.ClProc) THEN
|
|
|
W(" =l alloc8 8"); WL("");
|
|
|
W(" storel 0, "); WL(slot)
|
|
|
- ELSIF (cls = SymTab.ClByte) OR (cls = SymTab.ClSByte) THEN
|
|
|
+ ELSIF (cls = SymTab.ClByte) OR (cls = SymTab.ClSByte)
|
|
|
+ OR (cls = SymTab.ClCBool) THEN
|
|
|
W(" =l alloc4 4"); WL("");
|
|
|
W(" storeb 0, "); WL(slot)
|
|
|
ELSIF (cls = SymTab.ClWord16) OR (cls = SymTab.ClSWord16) THEN
|
|
|
@@ -1333,11 +1363,15 @@ PROCEDURE EndFuncHeader;
|
|
|
ELSIF cls = SymTab.ClReal THEN
|
|
|
Revive;
|
|
|
W(" stored "); W(parTmp[i]); W(", "); WL(slot)
|
|
|
+ ELSIF cls = SymTab.ClSReal THEN
|
|
|
+ Revive;
|
|
|
+ W(" stores "); W(parTmp[i]); W(", "); WL(slot)
|
|
|
ELSIF (cls = SymTab.ClPtr) OR (cls = SymTab.ClProc)
|
|
|
OR (cls = SymTab.ClLong) THEN
|
|
|
Revive;
|
|
|
W(" storel "); W(parTmp[i]); W(", "); WL(slot)
|
|
|
- ELSIF (cls = SymTab.ClByte) OR (cls = SymTab.ClSByte) THEN
|
|
|
+ ELSIF (cls = SymTab.ClByte) OR (cls = SymTab.ClSByte)
|
|
|
+ OR (cls = SymTab.ClCBool) THEN
|
|
|
Revive;
|
|
|
W(" storeb "); W(parTmp[i]); W(", "); WL(slot)
|
|
|
ELSIF (cls = SymTab.ClWord16) OR (cls = SymTab.ClSWord16) THEN
|
|
|
@@ -1377,6 +1411,7 @@ PROCEDURE EndFunc (resT: INTEGER);
|
|
|
language functionException instead of silently returning 0. *)
|
|
|
TrapCode(4)
|
|
|
ELSIF rc = "d" THEN WL(" ret d_0.0")
|
|
|
+ ELSIF rc = "s" THEN WL(" ret s_0.0")
|
|
|
ELSIF rc = "l" THEN WL(" ret 0")
|
|
|
ELSE WL(" ret 0")
|
|
|
END;
|
|
|
@@ -1663,11 +1698,22 @@ PROCEDURE NewTemp (VAR t: QVal);
|
|
|
PROCEDURE LocLoadFlat (idx: INTEGER; long: BOOLEAN; VAR q: QVal);
|
|
|
(* Loads a same-scope entry: slots/data by class (or long for
|
|
|
pointers), addr entries via ElemLoad. *)
|
|
|
+ VAR raw: QVal;
|
|
|
BEGIN
|
|
|
IF locTag[idx] = 2 THEN
|
|
|
ElemLoad(locRep[idx], locTyp[idx], q);
|
|
|
RETURN
|
|
|
END;
|
|
|
+ IF (NOT long) AND (locCls[idx] = "s") THEN
|
|
|
+ NewTemp(raw);
|
|
|
+ Revive;
|
|
|
+ W(" "); W(raw); W(" =s loads ");
|
|
|
+ IF locTag[idx] = 1 THEN W("$") END;
|
|
|
+ WL(locRep[idx]);
|
|
|
+ NewTemp(q);
|
|
|
+ W(" "); W(q); W(" =d exts "); WL(raw);
|
|
|
+ RETURN
|
|
|
+ END;
|
|
|
NewTemp(q);
|
|
|
Revive;
|
|
|
W(" "); W(q);
|
|
|
@@ -1690,11 +1736,21 @@ PROCEDURE LocLoadFlat (idx: INTEGER; long: BOOLEAN; VAR q: QVal);
|
|
|
PROCEDURE LocStoreFlat (idx: INTEGER; q: ARRAY OF CHAR; long: BOOLEAN);
|
|
|
(* Stores a same-scope entry: slots/data by class (or long), addr
|
|
|
via ElemStore. Data stores are grammar-unreachable (consts). *)
|
|
|
+ VAR tmp: QVal;
|
|
|
BEGIN
|
|
|
IF locTag[idx] = 2 THEN
|
|
|
ElemStore(locRep[idx], q, locTyp[idx]);
|
|
|
RETURN
|
|
|
END;
|
|
|
+ IF (NOT long) AND (locCls[idx] = "s") THEN
|
|
|
+ NewTemp(tmp);
|
|
|
+ Revive;
|
|
|
+ W(" "); W(tmp); W(" =s truncd "); WL(q);
|
|
|
+ W(" stores "); W(tmp); W(", ");
|
|
|
+ IF locTag[idx] = 1 THEN W("$") END;
|
|
|
+ WL(locRep[idx]);
|
|
|
+ RETURN
|
|
|
+ END;
|
|
|
Revive;
|
|
|
IF long THEN W(" storel ")
|
|
|
ELSIF locCls[idx] = "d" THEN W(" stored ")
|
|
|
@@ -1715,6 +1771,14 @@ PROCEDURE UpLoad (flat: INTEGER; levels: CARDINAL; long: BOOLEAN;
|
|
|
rel : CARDINAL;
|
|
|
BEGIN
|
|
|
IF locTag[flat] = 1 THEN
|
|
|
+ IF (NOT long) AND (locCls[flat] = "s") THEN
|
|
|
+ NewTemp(a);
|
|
|
+ Revive;
|
|
|
+ W(" "); W(a); W(" =s loads $"); WL(locRep[flat]);
|
|
|
+ NewTemp(q);
|
|
|
+ W(" "); W(q); W(" =d exts "); WL(a);
|
|
|
+ RETURN
|
|
|
+ END;
|
|
|
NewTemp(q);
|
|
|
Revive;
|
|
|
W(" "); W(q);
|
|
|
@@ -1744,6 +1808,13 @@ PROCEDURE UpStore (flat: INTEGER; levels: CARDINAL; q: ARRAY OF CHAR;
|
|
|
rel : CARDINAL;
|
|
|
BEGIN
|
|
|
IF locTag[flat] = 1 THEN
|
|
|
+ IF (NOT long) AND (locCls[flat] = "s") THEN
|
|
|
+ NewTemp(a);
|
|
|
+ Revive;
|
|
|
+ W(" "); W(a); W(" =s truncd "); WL(q);
|
|
|
+ W(" stores "); W(a); W(", $"); WL(locRep[flat]);
|
|
|
+ RETURN
|
|
|
+ END;
|
|
|
Revive;
|
|
|
IF long THEN W(" storel ")
|
|
|
ELSIF locCls[flat] = "d" THEN W(" stored ")
|
|
|
@@ -1803,6 +1874,10 @@ PROCEDURE LoadDesignator (name: ARRAY OF CHAR; t: INTEGER; k: INTEGER;
|
|
|
OR (cls = SymTab.ClChar) OR (cls = SymTab.ClEnum)
|
|
|
OR (cls = SymTab.ClReal) THEN
|
|
|
LoadVar(name, cls = SymTab.ClReal, q); RETURN TRUE
|
|
|
+ ELSIF cls = SymTab.ClSReal THEN
|
|
|
+ LoadShortReal(name, q); RETURN TRUE
|
|
|
+ ELSIF cls = SymTab.ClCBool THEN
|
|
|
+ LoadShortVar(name, FALSE, 1, q); RETURN TRUE
|
|
|
ELSIF (cls = SymTab.ClPtr) OR (cls = SymTab.ClProc) THEN
|
|
|
LoadPtr(name, q); RETURN TRUE
|
|
|
ELSIF (cls = SymTab.ClArray) OR (cls = SymTab.ClSet)
|
|
|
@@ -1984,6 +2059,43 @@ PROCEDURE StorePtr (name: ARRAY OF CHAR; q: ARRAY OF CHAR);
|
|
|
W(" storel "); W(q); W(", "); WL(ref)
|
|
|
END StorePtr;
|
|
|
|
|
|
+PROCEDURE LoadShortReal (name: ARRAY OF CHAR; VAR q: QVal);
|
|
|
+ VAR idx : INTEGER;
|
|
|
+ levels : CARDINAL;
|
|
|
+ ref, raw : QVal;
|
|
|
+ BEGIN
|
|
|
+ IF LocFindUp(name, levels, idx) THEN
|
|
|
+ IF levels = 0 THEN LocLoadFlat(idx, FALSE, q)
|
|
|
+ ELSE UpLoad(idx, levels, FALSE, q)
|
|
|
+ END;
|
|
|
+ RETURN
|
|
|
+ END;
|
|
|
+ NewTemp(raw);
|
|
|
+ Revive;
|
|
|
+ SymRef(name, ref);
|
|
|
+ W(" "); W(raw); W(" =s loads "); WL(ref);
|
|
|
+ NewTemp(q);
|
|
|
+ W(" "); W(q); W(" =d exts "); WL(raw)
|
|
|
+ END LoadShortReal;
|
|
|
+
|
|
|
+PROCEDURE StoreShortReal (name: ARRAY OF CHAR; q: ARRAY OF CHAR);
|
|
|
+ VAR idx : INTEGER;
|
|
|
+ levels : CARDINAL;
|
|
|
+ ref, raw : QVal;
|
|
|
+ BEGIN
|
|
|
+ IF LocFindUp(name, levels, idx) THEN
|
|
|
+ IF levels = 0 THEN LocStoreFlat(idx, q, FALSE)
|
|
|
+ ELSE UpStore(idx, levels, q, FALSE)
|
|
|
+ END;
|
|
|
+ RETURN
|
|
|
+ END;
|
|
|
+ NewTemp(raw);
|
|
|
+ Revive;
|
|
|
+ SymRef(name, ref);
|
|
|
+ W(" "); W(raw); W(" =s truncd "); WL(q);
|
|
|
+ W(" stores "); W(raw); W(", "); WL(ref)
|
|
|
+ END StoreShortReal;
|
|
|
+
|
|
|
PROCEDURE Op3 (mn: ARRAY OF CHAR; res, l, r: ARRAY OF CHAR;
|
|
|
isReal: BOOLEAN);
|
|
|
BEGIN
|
|
|
@@ -2028,6 +2140,29 @@ PROCEDURE ConvIR (a: ARRAY OF CHAR; VAR q: QVal);
|
|
|
W(" "); W(q); W(" =d swtof "); WL(a)
|
|
|
END ConvIR;
|
|
|
|
|
|
+PROCEDURE ConvSR (a: ARRAY OF CHAR; VAR q: QVal);
|
|
|
+(* REAL (double expression value) -> SHORTREAL storage/ABI (s). *)
|
|
|
+ BEGIN
|
|
|
+ NewTemp(q);
|
|
|
+ Revive;
|
|
|
+ W(" "); W(q); W(" =s truncd "); WL(a)
|
|
|
+ END ConvSR;
|
|
|
+
|
|
|
+PROCEDURE ConvRS (a: ARRAY OF CHAR; VAR q: QVal);
|
|
|
+(* SHORTREAL (s) -> REAL (double expression value) (exts). *)
|
|
|
+ BEGIN
|
|
|
+ NewTemp(q);
|
|
|
+ Revive;
|
|
|
+ W(" "); W(q); W(" =d exts "); WL(a)
|
|
|
+ END ConvRS;
|
|
|
+
|
|
|
+PROCEDURE MaskCBool (a: ARRAY OF CHAR; VAR q: QVal);
|
|
|
+ BEGIN
|
|
|
+ NewTemp(q);
|
|
|
+ Revive;
|
|
|
+ W(" "); W(q); W(" =w and "); W(a); WL(", 1")
|
|
|
+ END MaskCBool;
|
|
|
+
|
|
|
PROCEDURE NarrowLong (a: ARRAY OF CHAR; VAR q: QVal);
|
|
|
(* LONGINT (l) -> INTEGER (w): keep the low 32 bits. *)
|
|
|
BEGIN
|
|
|
@@ -2236,9 +2371,10 @@ PROCEDURE ElemSize (t: SymTab.TypeIndex): CARDINAL;
|
|
|
et := SymTab.ArrayElem(t);
|
|
|
cls := SymTab.ClassOf(et);
|
|
|
IF (cls = SymTab.ClChar) OR (cls = SymTab.ClByte)
|
|
|
- OR (cls = SymTab.ClSByte) THEN RETURN 1
|
|
|
+ OR (cls = SymTab.ClSByte) OR (cls = SymTab.ClCBool) THEN RETURN 1
|
|
|
ELSIF (cls = SymTab.ClWord16) OR (cls = SymTab.ClSWord16) THEN RETURN 2
|
|
|
ELSIF cls = SymTab.ClReal THEN RETURN 8
|
|
|
+ ELSIF cls = SymTab.ClSReal THEN RETURN 4
|
|
|
ELSIF (cls = SymTab.ClArray) OR (cls = SymTab.ClPtr)
|
|
|
OR (cls = SymTab.ClLong) THEN RETURN 8
|
|
|
ELSIF (cls = SymTab.ClRecord) OR (cls = SymTab.ClClass)
|
|
|
@@ -2372,8 +2508,10 @@ PROCEDURE ArrBodyItems (prefix: ARRAY OF CHAR; t: INTEGER);
|
|
|
ft := SymTab.FieldType(rt, fn);
|
|
|
cls := SymTab.ClassOf(ft);
|
|
|
IF cls = SymTab.ClReal THEN Sep; W("d 0")
|
|
|
+ ELSIF cls = SymTab.ClSReal THEN Sep; W("s 0")
|
|
|
ELSIF (cls = SymTab.ClChar) OR (cls = SymTab.ClByte)
|
|
|
- OR (cls = SymTab.ClSByte) THEN Sep; W("b 0")
|
|
|
+ OR (cls = SymTab.ClSByte) OR (cls = SymTab.ClCBool) THEN
|
|
|
+ Sep; W("b 0")
|
|
|
ELSIF (cls = SymTab.ClWord16) OR (cls = SymTab.ClSWord16) THEN
|
|
|
Sep; W("h 0")
|
|
|
ELSIF cls = SymTab.ClArray THEN
|
|
|
@@ -2438,10 +2576,12 @@ PROCEDURE ArrBodyItems (prefix: ARRAY OF CHAR; t: INTEGER);
|
|
|
IntStr(VAL(INTEGER, (n + 1) * 4), bv);
|
|
|
W(bv)
|
|
|
ELSE
|
|
|
- IF (ecls = SymTab.ClByte) OR (ecls = SymTab.ClSByte) THEN esz := 1
|
|
|
+ IF (ecls = SymTab.ClByte) OR (ecls = SymTab.ClSByte)
|
|
|
+ OR (ecls = SymTab.ClCBool) THEN esz := 1
|
|
|
ELSIF (ecls = SymTab.ClWord16) OR (ecls = SymTab.ClSWord16) THEN esz := 2
|
|
|
ELSIF (ecls = SymTab.ClReal) OR (ecls = SymTab.ClPtr)
|
|
|
OR (ecls = SymTab.ClProc) OR (ecls = SymTab.ClLong) THEN esz := 8
|
|
|
+ ELSIF ecls = SymTab.ClSReal THEN esz := 4
|
|
|
ELSIF (ecls = SymTab.ClRecord) OR (ecls = SymTab.ClClass)
|
|
|
OR (ecls = SymTab.ClSet) THEN
|
|
|
(* inline footprint, not a fixed 4 (same fix as ElemSize) *)
|
|
|
@@ -2597,8 +2737,10 @@ PROCEDURE RecItems (t: SymTab.TypeIndex; prefix: ARRAY OF CHAR;
|
|
|
ft := SymTab.FieldType(t, fn);
|
|
|
cls := SymTab.ClassOf(ft);
|
|
|
IF cls = SymTab.ClReal THEN Sep; W("d 0")
|
|
|
+ ELSIF cls = SymTab.ClSReal THEN Sep; W("s 0")
|
|
|
ELSIF (cls = SymTab.ClChar) OR (cls = SymTab.ClByte)
|
|
|
- OR (cls = SymTab.ClSByte) THEN Sep; W("b 0")
|
|
|
+ OR (cls = SymTab.ClSByte) OR (cls = SymTab.ClCBool) THEN
|
|
|
+ Sep; W("b 0")
|
|
|
ELSIF (cls = SymTab.ClWord16) OR (cls = SymTab.ClSWord16) THEN
|
|
|
Sep; W("h 0")
|
|
|
ELSIF cls = SymTab.ClArray THEN
|
|
|
@@ -3663,7 +3805,8 @@ PROCEDURE ViewToOpen1D (view: ARRAY OF CHAR; ft: INTEGER;
|
|
|
NewTemp(total);
|
|
|
Op3L("mul", total, count, elem);
|
|
|
cls := SymTab.ClassOf(SymTab.ArrayElem(ft));
|
|
|
- IF (cls = SymTab.ClByte) OR (cls = SymTab.ClSByte) THEN
|
|
|
+ IF (cls = SymTab.ClByte) OR (cls = SymTab.ClSByte)
|
|
|
+ OR (cls = SymTab.ClCBool) THEN
|
|
|
CopyOp(total, count)
|
|
|
END;
|
|
|
extra := 0;
|
|
|
@@ -3749,9 +3892,17 @@ PROCEDURE OpenSize (desc: ARRAY OF CHAR; ft: INTEGER; VAR q: QVal);
|
|
|
PROCEDURE ElemLoad (addr: ARRAY OF CHAR; t: INTEGER; VAR q: QVal);
|
|
|
(* Loads one element of (element-)type t. Nested/pointer elements
|
|
|
are addresses (loadl). *)
|
|
|
- VAR cls: INTEGER;
|
|
|
+ VAR cls: INTEGER; raw: QVal;
|
|
|
BEGIN
|
|
|
cls := SymTab.ClassOf(t);
|
|
|
+ IF cls = SymTab.ClSReal THEN
|
|
|
+ NewTemp(raw);
|
|
|
+ Revive;
|
|
|
+ W(" "); W(raw); W(" =s loads "); WL(addr);
|
|
|
+ NewTemp(q);
|
|
|
+ W(" "); W(q); W(" =d exts "); WL(raw);
|
|
|
+ RETURN
|
|
|
+ END;
|
|
|
NewTemp(q);
|
|
|
Revive;
|
|
|
W(" "); W(q);
|
|
|
@@ -3768,7 +3919,7 @@ PROCEDURE ElemLoad (addr: ARRAY OF CHAR; t: INTEGER; VAR q: QVal);
|
|
|
W(" =w loaduh ")
|
|
|
ELSE W(" =w loadw ")
|
|
|
END
|
|
|
- ELSIF cls = SymTab.ClByte THEN W(" =w loadub ")
|
|
|
+ ELSIF (cls = SymTab.ClByte) OR (cls = SymTab.ClCBool) THEN W(" =w loadub ")
|
|
|
ELSIF cls = SymTab.ClSByte THEN W(" =w loadsb ")
|
|
|
ELSIF cls = SymTab.ClWord16 THEN W(" =w loaduh ")
|
|
|
ELSIF cls = SymTab.ClSWord16 THEN W(" =w loadsh ")
|
|
|
@@ -3778,9 +3929,16 @@ PROCEDURE ElemLoad (addr: ARRAY OF CHAR; t: INTEGER; VAR q: QVal);
|
|
|
END ElemLoad;
|
|
|
|
|
|
PROCEDURE ElemStore (addr, v: ARRAY OF CHAR; t: INTEGER);
|
|
|
- VAR cls: INTEGER;
|
|
|
+ VAR cls: INTEGER; raw: QVal;
|
|
|
BEGIN
|
|
|
cls := SymTab.ClassOf(t);
|
|
|
+ IF cls = SymTab.ClSReal THEN
|
|
|
+ NewTemp(raw);
|
|
|
+ Revive;
|
|
|
+ W(" "); W(raw); W(" =s truncd "); WL(v);
|
|
|
+ W(" stores "); W(raw); W(", "); WL(addr);
|
|
|
+ RETURN
|
|
|
+ END;
|
|
|
Revive;
|
|
|
IF cls = SymTab.ClReal THEN W(" stored ")
|
|
|
ELSIF (cls = SymTab.ClArray) OR (cls = SymTab.ClPtr)
|
|
|
@@ -3795,7 +3953,8 @@ PROCEDURE ElemStore (addr, v: ARRAY OF CHAR; t: INTEGER);
|
|
|
W(" storeh ")
|
|
|
ELSE W(" storew ")
|
|
|
END
|
|
|
- ELSIF (cls = SymTab.ClByte) OR (cls = SymTab.ClSByte) THEN W(" storeb ")
|
|
|
+ ELSIF (cls = SymTab.ClByte) OR (cls = SymTab.ClSByte)
|
|
|
+ OR (cls = SymTab.ClCBool) THEN W(" storeb ")
|
|
|
ELSIF (cls = SymTab.ClWord16) OR (cls = SymTab.ClSWord16) THEN W(" storeh ")
|
|
|
ELSE W(" storew ")
|
|
|
END;
|
|
|
@@ -4281,12 +4440,14 @@ PROCEDURE CtorItem (VAR buf: ARRAY OF CHAR; v: ARRAY OF CHAR;
|
|
|
BEGIN
|
|
|
App(buf, ", ");
|
|
|
IF (cls = SymTab.ClChar) OR (cls = SymTab.ClByte)
|
|
|
- OR (cls = SymTab.ClSByte) THEN
|
|
|
+ OR (cls = SymTab.ClSByte) OR (cls = SymTab.ClCBool) THEN
|
|
|
App(buf, "b ")
|
|
|
ELSIF (cls = SymTab.ClWord16) OR (cls = SymTab.ClSWord16) THEN
|
|
|
App(buf, "h ")
|
|
|
ELSIF cls = SymTab.ClReal THEN
|
|
|
App(buf, "d ")
|
|
|
+ ELSIF cls = SymTab.ClSReal THEN
|
|
|
+ App(buf, "s ")
|
|
|
ELSIF (cls = SymTab.ClPtr) OR (cls = SymTab.ClProc)
|
|
|
OR (cls = SymTab.ClLong) OR (cls = SymTab.ClArray) THEN
|
|
|
App(buf, "l ")
|
|
|
@@ -4301,8 +4462,11 @@ PROCEDURE RecItem (VAR s: ARRAY OF CHAR; VAR first: BOOLEAN;
|
|
|
(* Record field item with a leading separator when not first. *)
|
|
|
BEGIN
|
|
|
IF first THEN first := FALSE ELSE App(s, ", ") END;
|
|
|
- IF cls = SymTab.ClChar THEN App(s, "b ")
|
|
|
+ IF (cls = SymTab.ClChar) OR (cls = SymTab.ClByte)
|
|
|
+ OR (cls = SymTab.ClSByte) OR (cls = SymTab.ClCBool) THEN
|
|
|
+ App(s, "b ")
|
|
|
ELSIF cls = SymTab.ClReal THEN App(s, "d ")
|
|
|
+ ELSIF cls = SymTab.ClSReal THEN App(s, "s ")
|
|
|
ELSIF (cls = SymTab.ClPtr) OR (cls = SymTab.ClProc)
|
|
|
OR (cls = SymTab.ClLong) OR (cls = SymTab.ClArray) THEN
|
|
|
App(s, "l ")
|
|
|
@@ -4335,6 +4499,8 @@ PROCEDURE ArrZeroBody (VAR s: ARRAY OF CHAR; t: INTEGER);
|
|
|
IF (ecls = SymTab.ClReal) OR (ecls = SymTab.ClPtr)
|
|
|
OR (ecls = SymTab.ClProc) OR (ecls = SymTab.ClArray)
|
|
|
OR (ecls = SymTab.ClLong) THEN esz := 8
|
|
|
+ ELSIF (ecls = SymTab.ClByte) OR (ecls = SymTab.ClSByte)
|
|
|
+ OR (ecls = SymTab.ClCBool) THEN esz := 1
|
|
|
ELSE esz := 4
|
|
|
END;
|
|
|
IF n > 0 THEN
|
|
|
@@ -4372,7 +4538,9 @@ PROCEDURE RecItemDefaults (VAR s: ARRAY OF CHAR; VAR first: BOOLEAN;
|
|
|
cls := SymTab.ClassOf(ft);
|
|
|
IF first THEN first := FALSE ELSE App(s, ", ") END;
|
|
|
IF cls = SymTab.ClReal THEN App(s, "d 0")
|
|
|
- ELSIF cls = SymTab.ClChar THEN App(s, "b 0")
|
|
|
+ ELSIF cls = SymTab.ClSReal THEN App(s, "s 0")
|
|
|
+ ELSIF (cls = SymTab.ClChar) OR (cls = SymTab.ClByte)
|
|
|
+ OR (cls = SymTab.ClSByte) OR (cls = SymTab.ClCBool) THEN App(s, "b 0")
|
|
|
ELSIF cls = SymTab.ClArray THEN ArrZeroBody(s, ft)
|
|
|
ELSIF cls = SymTab.ClSet THEN
|
|
|
w := VAL(INTEGER, SymTab.SetWords(ft));
|
|
|
@@ -4718,7 +4886,9 @@ PROCEDURE CtorRecStatic (VAR s: ARRAY OF CHAR; lvl: CARDINAL;
|
|
|
ELSE
|
|
|
IF first THEN first := FALSE ELSE App(s, ", ") END;
|
|
|
IF cls = SymTab.ClReal THEN App(s, "d 0")
|
|
|
- ELSIF cls = SymTab.ClChar THEN App(s, "b 0")
|
|
|
+ ELSIF cls = SymTab.ClSReal THEN App(s, "s 0")
|
|
|
+ ELSIF (cls = SymTab.ClChar) OR (cls = SymTab.ClByte)
|
|
|
+ OR (cls = SymTab.ClSByte) OR (cls = SymTab.ClCBool) THEN App(s, "b 0")
|
|
|
ELSIF cls = SymTab.ClArray THEN
|
|
|
IF SymTab.IsMultiArray(ft) THEN
|
|
|
AppZeroItem(s, SymTab.ArrayPayloadSize(ft))
|
|
|
@@ -4865,10 +5035,11 @@ PROCEDURE CtorEnd (VAR q: QVal);
|
|
|
ELSIF (SymTab.ClassOf(ft) = SymTab.ClArray)
|
|
|
AND SymTab.IsMultiArray(ft) THEN
|
|
|
ClearMultiField(a, ft)
|
|
|
- ELSIF (SymTab.ClassOf(ft) = SymTab.ClReal)
|
|
|
+ ELSIF SymTab.IsRealType(ft)
|
|
|
OR (SymTab.ClassOf(ft) = SymTab.ClChar)
|
|
|
OR (SymTab.ClassOf(ft) = SymTab.ClInt)
|
|
|
OR (SymTab.ClassOf(ft) = SymTab.ClBool)
|
|
|
+ OR (SymTab.ClassOf(ft) = SymTab.ClCBool)
|
|
|
OR (SymTab.ClassOf(ft) = SymTab.ClEnum)
|
|
|
OR (SymTab.ClassOf(ft) = SymTab.ClLong)
|
|
|
OR (SymTab.ClassOf(ft) = SymTab.ClPtr)
|