|
@@ -3362,8 +3362,8 @@ PROCEDURE ViewIndex (view, idx, lo: ARRAY OF CHAR;
|
|
|
|
|
|
|
|
PROCEDURE ViewToOpen1D (view: ARRAY OF CHAR; ft: INTEGER;
|
|
PROCEDURE ViewToOpen1D (view: ARRAY OF CHAR; ft: INTEGER;
|
|
|
VAR q, base, nbytes: QVal);
|
|
VAR q, base, nbytes: QVal);
|
|
|
- VAR count, elem, total, n, desc, p: QVal;
|
|
|
|
|
- cls: INTEGER;
|
|
|
|
|
|
|
+ VAR count, elem, total, n, desc, p, p2, eoff: QVal;
|
|
|
|
|
+ cls, extra: INTEGER;
|
|
|
BEGIN
|
|
BEGIN
|
|
|
ViewField(view, 0, count);
|
|
ViewField(view, 0, count);
|
|
|
ViewField(view, 8, elem);
|
|
ViewField(view, 8, elem);
|
|
@@ -3373,8 +3373,16 @@ PROCEDURE ViewToOpen1D (view: ARRAY OF CHAR; ft: INTEGER;
|
|
|
IF (cls = SymTab.ClByte) OR (cls = SymTab.ClSByte) THEN
|
|
IF (cls = SymTab.ClByte) OR (cls = SymTab.ClSByte) THEN
|
|
|
CopyOp(total, count)
|
|
CopyOp(total, count)
|
|
|
END;
|
|
END;
|
|
|
|
|
+ extra := 0;
|
|
|
|
|
+ IF cls = SymTab.ClChar THEN extra := 1
|
|
|
|
|
+ ELSIF cls = SymTab.ClUChar THEN extra := 4
|
|
|
|
|
+ END;
|
|
|
NewTemp(n);
|
|
NewTemp(n);
|
|
|
Op3L("add", n, total, "8");
|
|
Op3L("add", n, total, "8");
|
|
|
|
|
+ IF extra > 0 THEN
|
|
|
|
|
+ IntStr(VAL(INTEGER, extra), eoff);
|
|
|
|
|
+ NewTemp(p); Op3L("add", p, n, eoff); CopyOp(p, n)
|
|
|
|
|
+ END;
|
|
|
NewTemp(desc);
|
|
NewTemp(desc);
|
|
|
W(" "); W(desc); W(" =l call $malloc(l "); W(n); WL(")");
|
|
W(" "); W(desc); W(" =l call $malloc(l "); W(n); WL(")");
|
|
|
Revive;
|
|
Revive;
|
|
@@ -3386,6 +3394,13 @@ PROCEDURE ViewToOpen1D (view: ARRAY OF CHAR; ft: INTEGER;
|
|
|
Revive;
|
|
Revive;
|
|
|
W(" "); W(n); W(" =l call $memcpy(l ");
|
|
W(" "); W(n); W(" =l call $memcpy(l ");
|
|
|
W(p); W(", l "); W(base); W(", l "); W(total); WL(")");
|
|
W(p); W(", l "); W(base); W(", l "); W(total); WL(")");
|
|
|
|
|
+ IF extra > 0 THEN
|
|
|
|
|
+ NewTemp(p); Op3L("add", p, desc, "8");
|
|
|
|
|
+ NewTemp(p2); Op3L("add", p2, p, total);
|
|
|
|
|
+ Revive;
|
|
|
|
|
+ IF extra = 1 THEN W(" storeb 0, "); WL(p2)
|
|
|
|
|
+ ELSE W(" storew 0, "); WL(p2) END
|
|
|
|
|
+ END;
|
|
|
CopyOp(desc, q)
|
|
CopyOp(desc, q)
|
|
|
END ViewToOpen1D;
|
|
END ViewToOpen1D;
|
|
|
|
|
|
|
@@ -3405,6 +3420,39 @@ PROCEDURE ViewFree (desc: ARRAY OF CHAR);
|
|
|
W(" call $free(l "); W(desc); WL(")")
|
|
W(" call $free(l "); W(desc); WL(")")
|
|
|
END ViewFree;
|
|
END ViewFree;
|
|
|
|
|
|
|
|
|
|
+PROCEDURE ViewBase (view: ARRAY OF CHAR; VAR q: QVal);
|
|
|
|
|
+ BEGIN
|
|
|
|
|
+ ViewField(view, 24, q)
|
|
|
|
|
+ END ViewBase;
|
|
|
|
|
+
|
|
|
|
|
+PROCEDURE ViewSize (view: ARRAY OF CHAR; VAR q: QVal);
|
|
|
|
|
+ VAR cnt, esz, r: QVal;
|
|
|
|
|
+ BEGIN
|
|
|
|
|
+ ViewField(view, 0, cnt);
|
|
|
|
|
+ ViewField(view, 8, esz);
|
|
|
|
|
+ NewTemp(r);
|
|
|
|
|
+ Op3L("mul", r, cnt, esz);
|
|
|
|
|
+ CopyOp(r, q)
|
|
|
|
|
+ END ViewSize;
|
|
|
|
|
+
|
|
|
|
|
+PROCEDURE DescData (desc: ARRAY OF CHAR; VAR q: QVal);
|
|
|
|
|
+ BEGIN
|
|
|
|
|
+ NewTemp(q);
|
|
|
|
|
+ Op3L("add", q, desc, "8")
|
|
|
|
|
+ END DescData;
|
|
|
|
|
+
|
|
|
|
|
+PROCEDURE OpenSize (desc: ARRAY OF CHAR; ft: INTEGER; VAR q: QVal);
|
|
|
|
|
+ VAR cnt, esz, r: QVal;
|
|
|
|
|
+ BEGIN
|
|
|
|
|
+ NewTemp(q);
|
|
|
|
|
+ Revive;
|
|
|
|
|
+ W(" "); W(q); W(" =l loadl "); WL(desc);
|
|
|
|
|
+ IntStr(VAL(INTEGER, SymTab.ArrayLeafBytes(ft)), esz);
|
|
|
|
|
+ NewTemp(r);
|
|
|
|
|
+ Op3L("mul", r, q, esz);
|
|
|
|
|
+ CopyOp(r, q)
|
|
|
|
|
+ END OpenSize;
|
|
|
|
|
+
|
|
|
PROCEDURE ElemLoad (addr: ARRAY OF CHAR; t: 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
|
|
(* Loads one element of (element-)type t. Nested/pointer elements
|
|
|
are addresses (loadl). *)
|
|
are addresses (loadl). *)
|