瀏覽代碼

64 bit A2 patches (array base)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7433 8c9fc860-2736-0410-a75d-ab315db34111
felixf 7 年之前
父節點
當前提交
56535f46c0
共有 1 個文件被更改,包括 169 次插入169 次删除
  1. 169 169
      source/FoxArrayBase.Mod

+ 169 - 169
source/FoxArrayBase.Mod

@@ -88,8 +88,8 @@ CONST
 	SmallArrayMask = {SmallMatrixFlag,SmallVectorFlag,Size2Flag,Size3Flag,Size4Flag,Size5Flag,Size6Flag,Size7Flag,Size8Flag};
 	SmallArrayMask = {SmallMatrixFlag,SmallVectorFlag,Size2Flag,Size3Flag,Size4Flag,Size5Flag,Size6Flag,Size7Flag,Size8Flag};
 
 
 TYPE
 TYPE
-	FastMatMul* = PROCEDURE ( matrixA, matrixB, matrixC, IncA, StrideA, IncB, StrideB, IncC, StrideC, RowsA, ColsA, RowsB, ColsB: LONGINT ): BOOLEAN;
-	TransposeP* = PROCEDURE ( ladr, dadr, lstride, linc, dstride, dinc, rows, cols: LONGINT );
+	FastMatMul* = PROCEDURE ( matrixA, matrixB, matrixC: ADDRESS;  IncA, StrideA, IncB, StrideB, IncC, StrideC, RowsA, ColsA, RowsB, ColsB: SIZE ): BOOLEAN;
+	TransposeP* = PROCEDURE ( ladr, dadr: ADDRESS; lstride, linc, dstride, dinc, rows, cols:SIZE );
 
 
 	LenInc* = RECORD
 	LenInc* = RECORD
 		len*: SIZE;
 		len*: SIZE;
@@ -132,7 +132,7 @@ TYPE
 	
 	
 
 
 	(* used for optimizations of MatMul with small sizes (Alexey Morozov) *)
 	(* used for optimizations of MatMul with small sizes (Alexey Morozov) *)
-	SmallMatMul* = PROCEDURE(dadr, ladr, radr: LONGINT);
+	SmallMatMul* = PROCEDURE(dadr, ladr, radr: ADDRESS);
 	
 	
 	
 	
 
 
@@ -211,7 +211,7 @@ VAR
 	END PutInc;
 	END PutInc;
 
 
 	(* get length of dimension dim *)
 	(* get length of dimension dim *)
-	PROCEDURE GetLen(base: UnsafeArray; dim: SIZE): LONGINT;
+	PROCEDURE GetLen(base: UnsafeArray; dim: SIZE): SIZE;
 	BEGIN{UNCHECKED}
 	BEGIN{UNCHECKED}
 		RETURN base.lens[dim].len
 		RETURN base.lens[dim].len
 	END GetLen;
 	END GetLen;
@@ -257,7 +257,7 @@ VAR
 		SafePut(base.ptr,value);
 		SafePut(base.ptr,value);
 	END PutPtr;
 	END PutPtr;
 
 
-	PROCEDURE GetSize( base: UnsafeArray ): LONGINT;
+	PROCEDURE GetSize( base: UnsafeArray ): SIZE;
 	BEGIN
 	BEGIN
 		IF base = NIL THEN RETURN 0 ELSE RETURN base.elementSize END
 		IF base = NIL THEN RETURN 0 ELSE RETURN base.elementSize END
 	END GetSize;
 	END GetSize;
@@ -268,7 +268,7 @@ VAR
 	END PutSize;
 	END PutSize;
 
 
 	PROCEDURE GetDim( base: UnsafeArray ): SIZE;
 	PROCEDURE GetDim( base: UnsafeArray ): SIZE;
-	VAR dim: LONGINT;
+	VAR dim: SIZE;
 	BEGIN
 	BEGIN
 		IF base = 0 THEN RETURN 0 ELSE RETURN base.dim END;
 		IF base = 0 THEN RETURN 0 ELSE RETURN base.dim END;
 	END GetDim;
 	END GetDim;
@@ -290,10 +290,10 @@ VAR
 
 
 (* report geometry of array passed via address s *)
 (* report geometry of array passed via address s *)
 	PROCEDURE Report(CONST name: ARRAY OF CHAR;  s: ADDRESS );
 	PROCEDURE Report(CONST name: ARRAY OF CHAR;  s: ADDRESS );
-	VAR i: LONGINT;  dim: LONGINT;
+	VAR i: SIZE;  dim: SIZE;
 
 
 		PROCEDURE Set( s: SET );
 		PROCEDURE Set( s: SET );
-		VAR i: LONGINT;  first: BOOLEAN;
+		VAR i: SIZE;  first: BOOLEAN;
 		BEGIN
 		BEGIN
 			KernelLog.String( "{" );  first := TRUE;
 			KernelLog.String( "{" );  first := TRUE;
 			FOR i := 31 TO 0 BY -1 DO
 			FOR i := 31 TO 0 BY -1 DO
@@ -328,7 +328,7 @@ VAR
 		END;
 		END;
 	END Report;
 	END Report;
 
 
-	PROCEDURE GetArrayDesc( dim: LONGINT ): Tensor;
+	PROCEDURE GetArrayDesc( dim: SIZE ): Tensor;
 	VAR (* t: TensorType;  *) ptr: Tensor;
 	VAR (* t: TensorType;  *) ptr: Tensor;
 		p0: T0;
 		p0: T0;
 		p1: T1; p2: T2; p3: T3; p4: T4; p5: T5; p6: T6; p7: T7; p8: T8; 
 		p1: T1; p2: T2; p3: T3; p4: T4; p5: T5; p6: T6; p7: T7; p8: T8; 
@@ -368,7 +368,7 @@ VAR
 	END EnsureArrayDesc;
 	END EnsureArrayDesc;
 	
 	
 
 
-	PROCEDURE Halt( code: LONGINT;  left, right, dest: LONGINT );
+	PROCEDURE Halt( code: SIZE;  left, right, dest: ADDRESS );
 	VAR reason: ARRAY 64 OF CHAR;
 	VAR reason: ARRAY 64 OF CHAR;
 	BEGIN
 	BEGIN
 		IF left # 0 THEN Report( "Source operand ", left ) END;
 		IF left # 0 THEN Report( "Source operand ", left ) END;
@@ -390,7 +390,7 @@ VAR
 
 
  (* find the largest block with a regular pattern of the form offset+{i*li: 0<=i<len}. d is dimension applying to the resulting loop *)
  (* find the largest block with a regular pattern of the form offset+{i*li: 0<=i<len}. d is dimension applying to the resulting loop *)
 
 
-	PROCEDURE FindPattern1( left, dim: ADDRESS;  VAR d, len, linc: LONGINT );
+	PROCEDURE FindPattern1( left, dim: ADDRESS;  VAR d, len, linc: SIZE );
 	BEGIN
 	BEGIN
 		d := dim - 1;  len := GetLen( left, d );
 		d := dim - 1;  len := GetLen( left, d );
 		WHILE (len = 1) & (d > 0) DO DEC( d );  len := GetLen( left, d );
 		WHILE (len = 1) & (d > 0) DO DEC( d );  len := GetLen( left, d );
@@ -407,8 +407,8 @@ VAR
 	END FindPattern1;
 	END FindPattern1;
 
 
 (* find the largest block with a regular pattern of the form offset+{i*linc: 0<=i<len} for two arrays simultaneously. d is dimension applying to the resulting loop *)
 (* find the largest block with a regular pattern of the form offset+{i*linc: 0<=i<len} for two arrays simultaneously. d is dimension applying to the resulting loop *)
-	PROCEDURE FindPattern2( left, right: ADDRESS;  dim: LONGINT;
-												 VAR d, len, linc, ri: LONGINT );
+	PROCEDURE FindPattern2( left, right: ADDRESS;  dim: SIZE;
+												 VAR d, len, linc, ri: SIZE );
 	(* geometric precondition: lengths must coincide *)
 	(* geometric precondition: lengths must coincide *)
 	BEGIN
 	BEGIN
 		d := dim - 1;  len := GetLen( left, d );  ASSERT( len = GetLen( right, d ) );
 		d := dim - 1;  len := GetLen( left, d );  ASSERT( len = GetLen( right, d ) );
@@ -425,8 +425,8 @@ VAR
 	END FindPattern2;
 	END FindPattern2;
 
 
 (* find the largest block with a regular pattern of the form offset+{i*linc: 0<=i<len} for three arrays simultaneously. d is dimension applying to the resulting loop *)
 (* find the largest block with a regular pattern of the form offset+{i*linc: 0<=i<len} for three arrays simultaneously. d is dimension applying to the resulting loop *)
-	PROCEDURE FindPattern3( left, right, dest: ADDRESS;  dim: LONGINT;
-												 VAR d, len, linc, ri, di: LONGINT );
+	PROCEDURE FindPattern3( left, right, dest: ADDRESS;  dim: SIZE;
+												 VAR d, len, linc, ri, di: SIZE );
 	(* geometric precondition: lengths must coincide *)
 	(* geometric precondition: lengths must coincide *)
 	BEGIN
 	BEGIN
 		d := dim - 1;  len := GetLen( left, d );
 		d := dim - 1;  len := GetLen( left, d );
@@ -446,8 +446,8 @@ VAR
 		END;
 		END;
 	END FindPattern3;
 	END FindPattern3;
 
 
-	PROCEDURE Reverse( src: ADDRESS;  dim: LONGINT );
-	VAR d, sl, sr: LONGINT;
+	PROCEDURE Reverse( src: ADDRESS;  dim: SIZE );
+	VAR d, sl, sr: SIZE;
 	BEGIN
 	BEGIN
 		d := 0;  sl := GetAdr( src );
 		d := 0;  sl := GetAdr( src );
 		WHILE (d < dim) DO
 		WHILE (d < dim) DO
@@ -459,7 +459,7 @@ VAR
 
 
 (* check if forward copy may be performed *)
 (* check if forward copy may be performed *)
 	PROCEDURE CopyUpCompatible( dest, src: ADDRESS;  VAR modes: SET );
 	PROCEDURE CopyUpCompatible( dest, src: ADDRESS;  VAR modes: SET );
-	VAR d, sl, sr, dl, dr: LONGINT;  dim: LONGINT;
+	VAR d, sl, sr, dl, dr: SIZE;  dim: SIZE;
 		(* precondition: len(src,i)=len(dest,i) *)
 		(* precondition: len(src,i)=len(dest,i) *)
 		(* for forward src -> dest copy compatibility src must not be overwritten before src is copied.
 		(* for forward src -> dest copy compatibility src must not be overwritten before src is copied.
 Sufficient (but not necessary) conditions:
 Sufficient (but not necessary) conditions:
@@ -491,18 +491,18 @@ Sufficient (but not necessary) conditions:
 	END CopyUpCompatible;
 	END CopyUpCompatible;
 
 
 	PROCEDURE AllocateTemp( VAR dest: ADDRESS;  src: ADDRESS;
 	PROCEDURE AllocateTemp( VAR dest: ADDRESS;  src: ADDRESS;
-												  Size: LONGINT ): ANY;
+												  Size: SIZE ): ANY;
 	(* allocate a temporary block containing both descriptor and data *)
 	(* allocate a temporary block containing both descriptor and data *)
-	VAR d, len, i: LONGINT;  p: ANY;  dim: LONGINT;
+	VAR d, len, i: SIZE;  p: ANY;  dim: SIZE;
 	BEGIN
 	BEGIN
 		HALT(100); 
 		HALT(100); 
 		(*
 		(*
 		IF statistics THEN INC( allocTemp ) END;
 		IF statistics THEN INC( allocTemp ) END;
 		d := 0;  len := Size;  dim := GetDim( src );
 		d := 0;  len := Size;  dim := GetDim( src );
 		WHILE (d < dim) DO len := len * GetLen( src, d );  INC( d );  END;
 		WHILE (d < dim) DO len := len * GetLen( src, d );  INC( d );  END;
-		INC( len, 2 * dim * SIZEOF( LONGINT ) + MathLenOffset );  SYSTEM.NEW( p, len );
-		dest := SYSTEM.VAL( LONGINT, p );
-		PutAdr( dest, dest + dim * 2 * SIZEOF( LONGINT ) + MathLenOffset );
+		INC( len, 2 * dim * SIZEOF( SIZE ) + MathLenOffset );  SYSTEM.NEW( p, len );
+		dest := SYSTEM.VAL( SIZE, p );
+		PutAdr( dest, dest + dim * 2 * SIZEOF( SIZE ) + MathLenOffset );
 		PutPtr( dest, dest );  PutDim( dest, dim );  len := Size;
 		PutPtr( dest, dest );  PutDim( dest, dim );  len := Size;
 		FOR i := 0 TO dim - 1 DO
 		FOR i := 0 TO dim - 1 DO
 			PutInc( dest, i, len );  PutLen( dest, i, GetLen( src, i ) );
 			PutInc( dest, i, len );  PutLen( dest, i, GetLen( src, i ) );
@@ -518,13 +518,13 @@ Sufficient (but not necessary) conditions:
 	(*** procedures to traverse arrays and apply operators *)
 	(*** procedures to traverse arrays and apply operators *)
 	
 	
 	(** apply unary operator to array:  array SHORTINT -> array SHORTINT *)
 	(** apply unary operator to array:  array SHORTINT -> array SHORTINT *)
-	PROCEDURE ApplyGenericUnaryAAOpS( d, l: ADDRESS;  elementSize: LONGINT; Loop: GenericUnaryAALoopS; op: PROCEDURE(x: SHORTINT): SHORTINT );
-		VAR loopd, looplen, loopli, loopdi: LONGINT;  p: ANY;  glen: LONGINT;
+	PROCEDURE ApplyGenericUnaryAAOpS( d, l: ADDRESS;  elementSize: SIZE; Loop: GenericUnaryAALoopS; op: PROCEDURE(x: SHORTINT): SHORTINT );
+		VAR loopd, looplen, loopli, loopdi: SIZE;  p: ANY;  glen: SIZE;
 			origdest: ADDRESS;  modes: SET;
 			origdest: ADDRESS;  modes: SET;
 			dest, left: ADDRESS;  dim: SIZE;
 			dest, left: ADDRESS;  dim: SIZE;
 			
 			
-		PROCEDURE Traverse( dim: LONGINT;  ladr, dadr: ADDRESS );
-		VAR len: LONGINT;  linc, dinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, dadr: ADDRESS );
+		VAR len: SIZE;  linc, dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
@@ -569,13 +569,13 @@ Sufficient (but not necessary) conditions:
 	END ApplyGenericUnaryAAOpS;
 	END ApplyGenericUnaryAAOpS;
 
 
 	(** apply unary operator to array:  array INTEGER -> array INTEGER *)
 	(** apply unary operator to array:  array INTEGER -> array INTEGER *)
-	PROCEDURE ApplyGenericUnaryAAOpI( d, l: ADDRESS;  elementSize: LONGINT; Loop: GenericUnaryAALoopI; op: PROCEDURE(x: INTEGER): INTEGER );
-		VAR loopd, looplen, loopli, loopdi: LONGINT;  p: ANY;  glen: LONGINT;
-			origdest: LONGINT;  modes: SET;
+	PROCEDURE ApplyGenericUnaryAAOpI( d, l: ADDRESS;  elementSize: SIZE; Loop: GenericUnaryAALoopI; op: PROCEDURE(x: INTEGER): INTEGER );
+		VAR loopd, looplen, loopli, loopdi: SIZE;  p: ANY;  glen: SIZE;
+			origdest: SIZE;  modes: SET;
 			dest, left: ADDRESS;  dim: SIZE;
 			dest, left: ADDRESS;  dim: SIZE;
 			
 			
-		PROCEDURE Traverse( dim: LONGINT;  ladr, dadr: ADDRESS );
-		VAR len: LONGINT;  linc, dinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, dadr: ADDRESS );
+		VAR len: SIZE;  linc, dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
@@ -619,14 +619,14 @@ Sufficient (but not necessary) conditions:
 		END;
 		END;
 	END ApplyGenericUnaryAAOpI;
 	END ApplyGenericUnaryAAOpI;
 
 
-	(** apply unary operator to array:  array LONGINT -> array LONGINT *)
-	PROCEDURE ApplyGenericUnaryAAOpL( d, l: ADDRESS;  elementSize: LONGINT; Loop: GenericUnaryAALoopL; op: PROCEDURE(x: LONGINT): LONGINT );
-		VAR loopd, looplen, loopli, loopdi: LONGINT;  p: ANY;  glen: LONGINT;
-			origdest: LONGINT;  modes: SET;
+	(** apply unary operator to array:  array SIZE -> array SIZE *)
+	PROCEDURE ApplyGenericUnaryAAOpL( d, l: ADDRESS;  elementSize: SIZE; Loop: GenericUnaryAALoopL; op: PROCEDURE(x: LONGINT): LONGINT );
+		VAR loopd, looplen, loopli, loopdi: SIZE;  p: ANY;  glen: SIZE;
+			origdest: SIZE;  modes: SET;
 			dest, left: ADDRESS;  dim: SIZE;
 			dest, left: ADDRESS;  dim: SIZE;
 			
 			
-		PROCEDURE Traverse( dim: LONGINT;  ladr, dadr: ADDRESS );
-		VAR len: LONGINT;  linc, dinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, dadr: ADDRESS );
+		VAR len: SIZE;  linc, dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
@@ -671,13 +671,13 @@ Sufficient (but not necessary) conditions:
 	END ApplyGenericUnaryAAOpL;
 	END ApplyGenericUnaryAAOpL;
 	
 	
 	(** apply unary operator to array:  array HUGEINT -> array HUGEINT *)
 	(** apply unary operator to array:  array HUGEINT -> array HUGEINT *)
-	PROCEDURE ApplyGenericUnaryAAOpH( d, l: ADDRESS;  elementSize: LONGINT; Loop: GenericUnaryAALoopH; op: PROCEDURE(x: HUGEINT): HUGEINT );
-	VAR loopd, looplen, loopli, loopdi: LONGINT;  p: ANY;  glen: LONGINT;
-		origdest: LONGINT;  modes: SET;
+	PROCEDURE ApplyGenericUnaryAAOpH( d, l: ADDRESS;  elementSize: SIZE; Loop: GenericUnaryAALoopH; op: PROCEDURE(x: HUGEINT): HUGEINT );
+	VAR loopd, looplen, loopli, loopdi: SIZE;  p: ANY;  glen: SIZE;
+		origdest: SIZE;  modes: SET;
 	VAR dest, left: ADDRESS;  dim: SIZE;
 	VAR dest, left: ADDRESS;  dim: SIZE;
 
 
-		PROCEDURE Traverse( dim: LONGINT;  ladr, dadr: ADDRESS );
-		VAR len: LONGINT;  linc, dinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, dadr: ADDRESS );
+		VAR len: SIZE;  linc, dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
@@ -725,13 +725,13 @@ Sufficient (but not necessary) conditions:
 	END ApplyGenericUnaryAAOpH;
 	END ApplyGenericUnaryAAOpH;
 
 
 	(** apply unary operator to array:  array REAL -> array REAL *)
 	(** apply unary operator to array:  array REAL -> array REAL *)
-	PROCEDURE ApplyGenericUnaryAAOpR( d, l: ADDRESS;  elementSize: LONGINT; Loop: GenericUnaryAALoopR; op: PROCEDURE(x: REAL): REAL );
-		VAR loopd, looplen, loopli, loopdi: LONGINT;  p: ANY;  glen: LONGINT;
-			origdest: LONGINT;  modes: SET;
+	PROCEDURE ApplyGenericUnaryAAOpR( d, l: ADDRESS;  elementSize: SIZE; Loop: GenericUnaryAALoopR; op: PROCEDURE(x: REAL): REAL );
+		VAR loopd, looplen, loopli, loopdi: SIZE;  p: ANY;  glen: SIZE;
+			origdest: SIZE;  modes: SET;
 			dest, left: ADDRESS;  dim: SIZE;
 			dest, left: ADDRESS;  dim: SIZE;
 			
 			
-		PROCEDURE Traverse( dim: LONGINT;  ladr, dadr: ADDRESS );
-		VAR len: LONGINT;  linc, dinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, dadr: ADDRESS );
+		VAR len: SIZE;  linc, dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
@@ -776,13 +776,13 @@ Sufficient (but not necessary) conditions:
 	END ApplyGenericUnaryAAOpR;
 	END ApplyGenericUnaryAAOpR;
 	
 	
 	(** apply unary operator to array:  array LONGREAL -> array LONGREAL *)
 	(** apply unary operator to array:  array LONGREAL -> array LONGREAL *)
-	PROCEDURE ApplyGenericUnaryAAOpX( d, l: ADDRESS;  elementSize: LONGINT; Loop: GenericUnaryAALoopX; op: PROCEDURE(x: LONGREAL): LONGREAL );
-	VAR loopd, looplen, loopli, loopdi: LONGINT;  p: ANY;  glen: LONGINT;
-		origdest: LONGINT;  modes: SET;
+	PROCEDURE ApplyGenericUnaryAAOpX( d, l: ADDRESS;  elementSize: SIZE; Loop: GenericUnaryAALoopX; op: PROCEDURE(x: LONGREAL): LONGREAL );
+	VAR loopd, looplen, loopli, loopdi: SIZE;  p: ANY;  glen: SIZE;
+		origdest: SIZE;  modes: SET;
 			dest, left: ADDRESS;  dim: SIZE;
 			dest, left: ADDRESS;  dim: SIZE;
 
 
-		PROCEDURE Traverse( dim: LONGINT;  ladr, dadr: ADDRESS );
-		VAR len: LONGINT;  linc, dinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, dadr: ADDRESS );
+		VAR len: SIZE;  linc, dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
@@ -830,13 +830,13 @@ Sufficient (but not necessary) conditions:
 	END ApplyGenericUnaryAAOpX;
 	END ApplyGenericUnaryAAOpX;
 	
 	
 	(** apply unary operator to array:  array COMPLEX -> array COMPLEX *)
 	(** apply unary operator to array:  array COMPLEX -> array COMPLEX *)
-	PROCEDURE ApplyGenericUnaryAAOpZ( d, l: ADDRESS;  elementSize: LONGINT; Loop: GenericUnaryAALoopZ; op: PROCEDURE(x: COMPLEX): COMPLEX );
-	VAR loopd, looplen, loopli, loopdi: LONGINT;  p: ANY;  glen: LONGINT;
-		origdest: LONGINT;  modes: SET;
+	PROCEDURE ApplyGenericUnaryAAOpZ( d, l: ADDRESS;  elementSize: SIZE; Loop: GenericUnaryAALoopZ; op: PROCEDURE(x: COMPLEX): COMPLEX );
+	VAR loopd, looplen, loopli, loopdi: SIZE;  p: ANY;  glen: SIZE;
+		origdest: SIZE;  modes: SET;
 			dest, left: ADDRESS;  dim: SIZE;
 			dest, left: ADDRESS;  dim: SIZE;
 
 
-		PROCEDURE Traverse( dim: LONGINT;  ladr, dadr: ADDRESS );
-		VAR len: LONGINT;  linc, dinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, dadr: ADDRESS );
+		VAR len: SIZE;  linc, dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
@@ -884,13 +884,13 @@ Sufficient (but not necessary) conditions:
 	END ApplyGenericUnaryAAOpZ;
 	END ApplyGenericUnaryAAOpZ;
 	
 	
 	(** apply unary operator to array:  array LONGCOMPLEX -> array LONGCOMPLEX *)
 	(** apply unary operator to array:  array LONGCOMPLEX -> array LONGCOMPLEX *)
-	PROCEDURE ApplyGenericUnaryAAOpLZ( d, l: ADDRESS;  elementSize: LONGINT; Loop: GenericUnaryAALoopLZ; op: PROCEDURE(x: LONGCOMPLEX): LONGCOMPLEX );
-	VAR loopd, looplen, loopli, loopdi: LONGINT;  p: ANY;  glen: LONGINT;
-		origdest: LONGINT;  modes: SET;
+	PROCEDURE ApplyGenericUnaryAAOpLZ( d, l: ADDRESS;  elementSize: SIZE; Loop: GenericUnaryAALoopLZ; op: PROCEDURE(x: LONGCOMPLEX): LONGCOMPLEX );
+	VAR loopd, looplen, loopli, loopdi: SIZE;  p: ANY;  glen: SIZE;
+		origdest: SIZE;  modes: SET;
 			dest, left: ADDRESS;  dim: SIZE;
 			dest, left: ADDRESS;  dim: SIZE;
 
 
-		PROCEDURE Traverse( dim: LONGINT;  ladr, dadr: ADDRESS );
-		VAR len: LONGINT;  linc, dinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, dadr: ADDRESS );
+		VAR len: SIZE;  linc, dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
 				Loop( ladr, dadr, loopli, loopdi, looplen, op );
@@ -938,14 +938,14 @@ Sufficient (but not necessary) conditions:
 	END ApplyGenericUnaryAAOpLZ;
 	END ApplyGenericUnaryAAOpLZ;
 
 
 (** apply unary operator to array:  array -> array *)
 (** apply unary operator to array:  array -> array *)
-	PROCEDURE ApplyUnaryAAOp( d, l: ADDRESS;  elementSize: LONGINT;
+	PROCEDURE ApplyUnaryAAOp( d, l: ADDRESS;  elementSize: SIZE;
 														Loop: UnaryAALoop );
 														Loop: UnaryAALoop );
-	VAR loopd, looplen, loopli, loopdi: LONGINT;  p: ANY;  glen: LONGINT;
-		origdest: LONGINT;  modes: SET;
+	VAR loopd, looplen, loopli, loopdi: SIZE;  p: ANY;  glen: SIZE;
+		origdest: SIZE;  modes: SET;
 			dest, left: ADDRESS;  dim: SIZE;
 			dest, left: ADDRESS;  dim: SIZE;
 
 
-		PROCEDURE Traverse( dim: LONGINT;  ladr, dadr: ADDRESS );
-		VAR len: LONGINT;  linc, dinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, dadr: ADDRESS );
+		VAR len: SIZE;  linc, dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, dadr, loopli, loopdi, looplen );
 				Loop( ladr, dadr, loopli, loopdi, looplen );
@@ -996,11 +996,11 @@ Sufficient (but not necessary) conditions:
 
 
 (** apply unary operator to array:  array -> scalar *)
 (** apply unary operator to array:  array -> scalar *)
 	PROCEDURE ApplyUnaryASOp( dest, l: ADDRESS;  Loop: UnaryASLoop );
 	PROCEDURE ApplyUnaryASOp( dest, l: ADDRESS;  Loop: UnaryASLoop );
-	VAR loopd, looplen, loopli: LONGINT;  glen: LONGINT;
-	VAR left, dim: LONGINT;
+	VAR loopd, looplen, loopli: SIZE;  glen: SIZE;
+	VAR left: ADDRESS; dim: SIZE;
 
 
-		PROCEDURE Traverse( dim: LONGINT;  ladr: ADDRESS );
-		VAR len: LONGINT;  linc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr: ADDRESS );
+		VAR len: SIZE;  linc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, dest, loopli, looplen );
 				Loop( ladr, dest, loopli, looplen );
@@ -1028,11 +1028,11 @@ Sufficient (but not necessary) conditions:
 
 
 (** apply unary operator to array:  scalar -> array *)
 (** apply unary operator to array:  scalar -> array *)
 	PROCEDURE ApplyUnarySAOp( d, right: ADDRESS;  Loop: UnarySALoop );
 	PROCEDURE ApplyUnarySAOp( d, right: ADDRESS;  Loop: UnarySALoop );
-	VAR loopd, looplen, loopdi: LONGINT;  glen: LONGINT;
-	VAR dest, dim: LONGINT;
+	VAR loopd, looplen, loopdi: SIZE;  glen: SIZE;
+	VAR dest: ADDRESS; dim: SIZE;
 
 
-		PROCEDURE Traverse( dim: LONGINT;  dadr: ADDRESS );
-		VAR len: LONGINT;  dinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  dadr: ADDRESS );
+		VAR len: SIZE;  dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( right, dadr, loopdi, looplen );
 				Loop( right, dadr, loopdi, looplen );
@@ -1061,13 +1061,13 @@ Sufficient (but not necessary) conditions:
 (** apply binary operator : array x array -> array *)
 (** apply binary operator : array x array -> array *)
 
 
 
 
-	PROCEDURE ApplyBinaryAAAOp( d, l, r: ADDRESS;  elementSize: LONGINT;
+	PROCEDURE ApplyBinaryAAAOp( d, l, r: ADDRESS;  elementSize: SIZE;
 														    Loop: BinaryAAALoop );
 														    Loop: BinaryAAALoop );
-	VAR loopd, looplen, loopli, loopri, loopdi: LONGINT;  p: ANY;  glen: LONGINT;
-		origdest: LONGINT;  modes: SET;  left, right, dest: ADDRESS;  dim: LONGINT;
+	VAR loopd, looplen, loopli, loopri, loopdi: SIZE;  p: ANY;  glen: SIZE;
+		origdest: SIZE;  modes: SET;  left, right, dest: ADDRESS;  dim: SIZE;
 
 
-		PROCEDURE Traverse( dim: LONGINT;  ladr, radr, dadr: ADDRESS );
-		VAR len: LONGINT;  linc, rinc, dinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, radr, dadr: ADDRESS );
+		VAR len: SIZE;  linc, rinc, dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, radr, dadr, loopli, loopri, loopdi, looplen );
 				Loop( ladr, radr, dadr, loopli, loopri, loopdi, looplen );
@@ -1122,13 +1122,13 @@ Sufficient (but not necessary) conditions:
 (** apply binary operator: array x scalar -> array *)
 (** apply binary operator: array x scalar -> array *)
 
 
 	PROCEDURE ApplyBinaryASAOp( d, l, right: ADDRESS;
 	PROCEDURE ApplyBinaryASAOp( d, l, right: ADDRESS;
-														   elementSize: LONGINT;
+														   elementSize: SIZE;
 														   Loop: BinaryASALoop );
 														   Loop: BinaryASALoop );
-	VAR loopd, looplen, loopli, loopdi: LONGINT;  p: ANY;  glen: LONGINT;
-		origdest: LONGINT;  modes: SET;  dest, left: ADDRESS; dim: SIZE;
+	VAR loopd, looplen, loopli, loopdi: SIZE;  p: ANY;  glen: SIZE;
+		origdest: SIZE;  modes: SET;  dest, left: ADDRESS; dim: SIZE;
 
 
-		PROCEDURE Traverse( dim: LONGINT;  ladr, dadr: ADDRESS );
-		VAR len: LONGINT;  linc, dinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, dadr: ADDRESS );
+		VAR len: SIZE;  linc, dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, right, dadr, loopli, loopdi, looplen );
 				Loop( ladr, right, dadr, loopli, loopdi, looplen );
@@ -1183,11 +1183,11 @@ Sufficient (but not necessary) conditions:
 (** apply binary operator: array x array -> scalar *)
 (** apply binary operator: array x array -> scalar *)
 
 
 	PROCEDURE ApplyBinaryAASOp( dest, l, r: ADDRESS;  Loop: BinaryAASLoop );
 	PROCEDURE ApplyBinaryAASOp( dest, l, r: ADDRESS;  Loop: BinaryAASLoop );
-	VAR loopd, looplen, loopli, loopri: LONGINT;  glen: LONGINT;
-		left, right, dim: LONGINT;
+	VAR loopd, looplen, loopli, loopri: SIZE;  glen: SIZE;
+		left, right: ADDRESS; dim: SIZE;
 
 
-		PROCEDURE Traverse( dim: LONGINT;  ladr, radr: ADDRESS );
-		VAR len: LONGINT;  linc, rinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, radr: ADDRESS );
+		VAR len: SIZE;  linc, rinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, radr, dest, loopli, loopri, looplen );
 				Loop( ladr, radr, dest, loopli, loopri, looplen );
@@ -1227,10 +1227,10 @@ Sufficient (but not necessary) conditions:
 
 
 	PROCEDURE ApplyBinaryAABOp( l, r: ADDRESS;
 	PROCEDURE ApplyBinaryAABOp( l, r: ADDRESS;
 														    Loop: BinaryAABLoop; geometryMismatchDefault: BOOLEAN ): BOOLEAN;
 														    Loop: BinaryAABLoop; geometryMismatchDefault: BOOLEAN ): BOOLEAN;
-	VAR loopd, looplen, loopli, loopri: LONGINT;  left, right, dim: LONGINT;
+	VAR loopd, looplen, loopli, loopri: SIZE;  left, right: ADDRESS; dim: SIZE;
 
 
-		PROCEDURE Traverse( dim: LONGINT;  ladr, radr: ADDRESS ): BOOLEAN;
-		VAR len: LONGINT;  linc, rinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, radr: ADDRESS ): BOOLEAN;
+		VAR len: SIZE;  linc, rinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN RETURN Loop( ladr, radr, loopli, loopri, looplen );
 			IF dim = loopd THEN RETURN Loop( ladr, radr, loopli, loopri, looplen );
 			ELSE
 			ELSE
@@ -1262,10 +1262,10 @@ Sufficient (but not necessary) conditions:
 
 
 	PROCEDURE ApplyBinaryASBOp( l, right: ADDRESS;
 	PROCEDURE ApplyBinaryASBOp( l, right: ADDRESS;
 														   Loop: BinaryASBLoop ): BOOLEAN;
 														   Loop: BinaryASBLoop ): BOOLEAN;
-	VAR loopd, looplen, loopli: LONGINT;  left, dim: LONGINT;
+	VAR loopd, looplen, loopli: SIZE;  left: ADDRESS; dim: SIZE;
 
 
-		PROCEDURE Traverse( dim: LONGINT;  ladr: ADDRESS ): BOOLEAN;
-		VAR len: LONGINT;  linc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr: ADDRESS ): BOOLEAN;
+		VAR len: SIZE;  linc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN RETURN Loop( ladr, right, loopli, looplen );
 			IF dim = loopd THEN RETURN Loop( ladr, right, loopli, looplen );
 			ELSE
 			ELSE
@@ -1362,7 +1362,7 @@ Sufficient (but not necessary) conditions:
 		end:
 		end:
 	END Copy8;
 	END Copy8;
 
 
-	PROCEDURE -MoveB*( srcadr, destadr, len: LONGINT );
+	PROCEDURE -MoveB*( srcadr, destadr, len: SIZE );
 	(** Correct move if overlap, might be important for some array operations,
 	(** Correct move if overlap, might be important for some array operations,
 		do not use SYSTEM.MOVE.  *)
 		do not use SYSTEM.MOVE.  *)
 	CODE {SYSTEM.i386}
 	CODE {SYSTEM.i386}
@@ -1398,8 +1398,8 @@ Sufficient (but not necessary) conditions:
 	END MoveB;
 	END MoveB;
 
 
 	PROCEDURE CopyContent( dest, src: ADDRESS; elementSize: SIZE );   (**! optimize *)
 	PROCEDURE CopyContent( dest, src: ADDRESS; elementSize: SIZE );   (**! optimize *)
-	VAR loopd, looplen, loopli, loopdi: LONGINT;  p: ANY;  glen: LONGINT;
-		origdest: ADDRESS;  modes: SET;  dim: LONGINT;
+	VAR loopd, looplen, loopli, loopdi: SIZE;  p: ANY;  glen: SIZE;
+		origdest: ADDRESS;  modes: SET;  dim: SIZE;
 
 
 		PROCEDURE Loop( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
 		PROCEDURE Loop( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
 		BEGIN
 		BEGIN
@@ -1449,8 +1449,8 @@ Sufficient (but not necessary) conditions:
 			END;
 			END;
 		END Loop;
 		END Loop;
 
 
-		PROCEDURE Traverse( dim: LONGINT;  ladr, dadr: ADDRESS );
-		VAR len: LONGINT;  linc, dinc: LONGINT;
+		PROCEDURE Traverse( dim: SIZE;  ladr, dadr: ADDRESS );
+		VAR len: SIZE;  linc, dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF dim = loopd THEN
 			IF dim = loopd THEN
 				Loop( ladr, dadr, loopli, loopdi, looplen );
 				Loop( ladr, dadr, loopli, loopdi, looplen );
@@ -1492,12 +1492,12 @@ Sufficient (but not necessary) conditions:
 		END;
 		END;
 	END CopyContent;
 	END CopyContent;
 
 
-	PROCEDURE AllocateSame( VAR dest: ADDRESS;  src: ADDRESS; elementsize: LONGINT ): ANY;
-	VAR ptr, data: ANY;  Size: LONGINT;
+	PROCEDURE AllocateSame( VAR dest: ADDRESS;  src: ADDRESS; elementsize: SIZE ): ANY;
+	VAR ptr, data: ANY;  Size: SIZE;
 		(* allocate a structure in dest compatible with src, if necessary. returns if allocation has taken place *)
 		(* allocate a structure in dest compatible with src, if necessary. returns if allocation has taken place *)
 
 
 		PROCEDURE NewData;
 		PROCEDURE NewData;
-		VAR dim, len, size: LONGINT;
+		VAR dim, len, size: SIZE;
 		BEGIN
 		BEGIN
 			dim := GetDim( src );  size := elementsize;
 			dim := GetDim( src );  size := elementsize;
 			PutDim( dest, dim );
 			PutDim( dest, dim );
@@ -1556,7 +1556,7 @@ Sufficient (but not necessary) conditions:
 	END TempDescCopy;
 	END TempDescCopy;
 
 
 	(* used when arrays are passed by value *)
 	(* used when arrays are passed by value *)
-	PROCEDURE CopyArraySelf*( dest, src: ADDRESS;  elementsize: LONGINT );
+	PROCEDURE CopyArraySelf*( dest, src: ADDRESS;  elementsize: SIZE );
 	VAR p: ANY;
 	VAR p: ANY;
 	BEGIN
 	BEGIN
 		ASSERT( src = dest );  
 		ASSERT( src = dest );  
@@ -1565,7 +1565,7 @@ Sufficient (but not necessary) conditions:
 	END CopyArraySelf;
 	END CopyArraySelf;
 
 
 	PROCEDURE CopyArray*( dest: ADDRESS;  src: ADDRESS; elementsize: SIZE );
 	PROCEDURE CopyArray*( dest: ADDRESS;  src: ADDRESS; elementsize: SIZE );
-	VAR p: ANY; srcdim, destdim: LONGINT;
+	VAR p: ANY; srcdim, destdim: SIZE;
 	BEGIN
 	BEGIN
 		ASSERT( dest # 0 );   (* impossible unless compiler error *)
 		ASSERT( dest # 0 );   (* impossible unless compiler error *)
 		IF GetDim( src ) # GetDim( dest ) THEN  (* not allowed but possible (tensor) *)
 		IF GetDim( src ) # GetDim( dest ) THEN  (* not allowed but possible (tensor) *)
@@ -1665,8 +1665,8 @@ Sufficient (but not necessary) conditions:
 	PROCEDURE ZeroCopy*(CONST src: ARRAY [?]; VAR dest: ARRAY [?]);
 	PROCEDURE ZeroCopy*(CONST src: ARRAY [?]; VAR dest: ARRAY [?]);
 	VAR p: ANY; s,d: ADDRESS;
 	VAR p: ANY; s,d: ADDRESS;
 	BEGIN
 	BEGIN
-		s := SYSTEM.VAL(LONGINT,src); 
-		d := SYSTEM.VAL(LONGINT,dest);
+		s := SYSTEM.VAL(ADDRESS,src); 
+		d := SYSTEM.VAL(ADDRESS,dest);
 		p := ShallowCopy(d,s);
 		p := ShallowCopy(d,s);
 		SYSTEM.PUT(ADDRESSOF(dest),d);
 		SYSTEM.PUT(ADDRESSOF(dest),d);
 		IF p = d THEN
 		IF p = d THEN
@@ -1681,7 +1681,7 @@ Sufficient (but not necessary) conditions:
 	END "ALIAS";
 	END "ALIAS";
 
 
 	PROCEDURE SameShape( l, r: ADDRESS ): BOOLEAN;
 	PROCEDURE SameShape( l, r: ADDRESS ): BOOLEAN;
-	VAR dim: LONGINT;
+	VAR dim: SIZE;
 	BEGIN
 	BEGIN
 		dim := GetDim( l );
 		dim := GetDim( l );
 		IF dim # GetDim( r ) THEN RETURN FALSE END;
 		IF dim # GetDim( r ) THEN RETURN FALSE END;
@@ -7649,10 +7649,10 @@ TYPE
 
 
 	(*** LEN: array -> array **)
 	(*** LEN: array -> array **)
 
 
-	OPERATOR "LEN"*(CONST left: ARRAY [?]): ARRAY [*] OF LONGINT;
-	VAR src,dim,i: LONGINT;
+	OPERATOR "LEN"*(CONST left: ARRAY [?]): ARRAY [*] OF SIZE;
+	VAR src: ADDRESS; dim,i: SIZE;
 	BEGIN
 	BEGIN
-		src := SYSTEM.VAL(LONGINT,left);
+		src := SYSTEM.VAL(ADDRESS,left);
 		dim := GetDim( src );
 		dim := GetDim( src );
 		IF (DIM(RESULT)#1) OR (LEN(RESULT,0) # dim) THEN NEW(RESULT,dim) END;
 		IF (DIM(RESULT)#1) OR (LEN(RESULT,0) # dim) THEN NEW(RESULT,dim) END;
 		FOR i := 0 TO dim-1 DO RESULT[i] := GetLen(src,i) END;
 		FOR i := 0 TO dim-1 DO RESULT[i] := GetLen(src,i) END;
@@ -8027,7 +8027,7 @@ TYPE
 (*** matrix multipliation ********************************************************************)
 (*** matrix multipliation ********************************************************************)
 
 
 	PROCEDURE AllocateMatrix( dest: ADDRESS;
 	PROCEDURE AllocateMatrix( dest: ADDRESS;
-													rows, cols, elementsize: LONGINT ): ANY;
+													rows, cols, elementsize: SIZE ): ANY;
 	VAR p: ANY;
 	VAR p: ANY;
 	BEGIN
 	BEGIN
 		(*
 		(*
@@ -8039,7 +8039,7 @@ TYPE
 		PutPtr( dest, p);  RETURN p;
 		PutPtr( dest, p);  RETURN p;
 	END AllocateMatrix;
 	END AllocateMatrix;
 
 
-	PROCEDURE AllocateVector( dest: ADDRESS;  l0, elementsize: LONGINT ): ANY;
+	PROCEDURE AllocateVector( dest: ADDRESS;  l0, elementsize: SIZE ): ANY;
 	VAR p: ANY;
 	VAR p: ANY;
 	BEGIN
 	BEGIN
 		SYSTEM.NEW( p, l0 * elementsize  + ArrayAlignment);  PutLen( dest, 0, l0 );
 		SYSTEM.NEW( p, l0 * elementsize  + ArrayAlignment);  PutLen( dest, 0, l0 );
@@ -8047,10 +8047,10 @@ TYPE
 		PutPtr( dest, p );  RETURN p;
 		PutPtr( dest, p );  RETURN p;
 	END AllocateVector;
 	END AllocateVector;
 
 
-	PROCEDURE ApplyMatMulLoop( dest, left, right: ADDRESS;  Size: LONGINT;
+	PROCEDURE ApplyMatMulLoop( dest, left, right: ADDRESS;  Size: SIZE;
 														 loop: BinaryAASLoop;
 														 loop: BinaryAASLoop;
 	fast: FastMatMul );   (* Size= element-size *)
 	fast: FastMatMul );   (* Size= element-size *)
-	VAR ladr, radr, dadr, dadri, radri, rowsL, colsL, rowsR, colsR, incL, incR, incD, strideR, strideL, strideD, colsRi: LONGINT;
+	VAR ladr, radr, dadr: ADDRESS; dadri, radri, rowsL, colsL, rowsR, colsR, incL, incR, incD, strideR, strideL, strideD, colsRi: SIZE;
 		p: ANY;  overlap: BOOLEAN;  destOld, destNew: ADDRESS;
 		p: ANY;  overlap: BOOLEAN;  destOld, destNew: ADDRESS;
 	BEGIN
 	BEGIN
 	(*
 	(*
@@ -8129,9 +8129,9 @@ TYPE
 	END ApplyMatMulLoop;
 	END ApplyMatMulLoop;
 
 
 	PROCEDURE ApplyMatVecMulLoop( dest, left, right: ADDRESS;
 	PROCEDURE ApplyMatVecMulLoop( dest, left, right: ADDRESS;
-															   Size: LONGINT;  loop: BinaryAASLoop;
+															   Size: SIZE;  loop: BinaryAASLoop;
 															   fast: FastMatMul );   (* Size= element-size *)
 															   fast: FastMatMul );   (* Size= element-size *)
-	VAR ladr, radr, dadr, li1, li0, ri0, di0, l1, l2: LONGINT;  p: ANY;
+	VAR ladr, radr, dadr: ADDRESS; li1, li0, ri0, di0, l1, l2: SIZE;  p: ANY;
 		overlap: BOOLEAN;  destOld, destNew: ADDRESS;
 		overlap: BOOLEAN;  destOld, destNew: ADDRESS;
 
 
 	BEGIN
 	BEGIN
@@ -8196,9 +8196,9 @@ TYPE
 	END ApplyMatVecMulLoop;
 	END ApplyMatVecMulLoop;
 
 
 	PROCEDURE ApplyVecMatMulLoop( dest, left, right: ADDRESS;
 	PROCEDURE ApplyVecMatMulLoop( dest, left, right: ADDRESS;
-															   Size: LONGINT;  loop: BinaryAASLoop;
+															   Size: SIZE;  loop: BinaryAASLoop;
 															   fast: FastMatMul );   (* Size= element-size *)
 															   fast: FastMatMul );   (* Size= element-size *)
-	VAR ladr, radr, dadr, li0, ri1, ri0, di0, l0, l2: LONGINT;  p: ANY;
+	VAR ladr, radr, dadr: ADDRESS;  li0, ri1, ri0, di0, l0, l2: SIZE;  p: ANY;
 		overlap: BOOLEAN;  destOld, destNew: ADDRESS;
 		overlap: BOOLEAN;  destOld, destNew: ADDRESS;
 
 
 	BEGIN
 	BEGIN
@@ -8386,7 +8386,7 @@ TYPE
 		use of CONST for left, right makes execution slower, it seems that a new descriptor is created in this case
 		use of CONST for left, right makes execution slower, it seems that a new descriptor is created in this case
 	*)
 	*)
 	OPERATOR "*"*(CONST left, right: ARRAY [ * , * ] OF REAL ): ARRAY [ * , * ] OF REAL;
 	OPERATOR "*"*(CONST left, right: ARRAY [ * , * ] OF REAL ): ARRAY [ * , * ] OF REAL;
-	VAR flags: SET; dadr, ladr, radr: LONGINT;
+	VAR flags: SET; dadr, ladr, radr: ADDRESS;
 	BEGIN
 	BEGIN
 
 
 		dadr := GetAdr(ADDRESSOF(RESULT));
 		dadr := GetAdr(ADDRESSOF(RESULT));
@@ -8485,7 +8485,7 @@ TYPE
 	*)
 	*)
 	OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF REAL; CONST right: ARRAY [ * ] OF REAL ): ARRAY [ * ] OF REAL;
 	OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF REAL; CONST right: ARRAY [ * ] OF REAL ): ARRAY [ * ] OF REAL;
 	VAR
 	VAR
-		flags: SET; dadr, ladr, radr: LONGINT;
+		flags: SET; dadr, ladr, radr: ADDRESS;
 		v0, v1, v2: REAL;
 		v0, v1, v2: REAL;
 	BEGIN
 	BEGIN
 
 
@@ -8580,7 +8580,7 @@ TYPE
 	*)
 	*)
 	OPERATOR "*"*( CONST left, right: ARRAY [ * , * ] OF LONGREAL): ARRAY [ * , * ] OF LONGREAL;
 	OPERATOR "*"*( CONST left, right: ARRAY [ * , * ] OF LONGREAL): ARRAY [ * , * ] OF LONGREAL;
 	VAR
 	VAR
-		flags: SET; dadr, ladr, radr: LONGINT;
+		flags: SET; dadr, ladr, radr: ADDRESS;
 	BEGIN
 	BEGIN
 
 
 		dadr := GetAdr(ADDRESSOF(RESULT));
 		dadr := GetAdr(ADDRESSOF(RESULT));
@@ -8679,7 +8679,7 @@ TYPE
 	OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF LONGREAL;
 	OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF LONGREAL;
 												CONST right: ARRAY [ * ] OF LONGREAL  ): ARRAY [ * ] OF LONGREAL;
 												CONST right: ARRAY [ * ] OF LONGREAL  ): ARRAY [ * ] OF LONGREAL;
 	VAR
 	VAR
-		flags: SET; dadr, ladr, radr: LONGINT;
+		flags: SET; dadr, ladr, radr: ADDRESS;
 		v0, v1, v2: LONGREAL;
 		v0, v1, v2: LONGREAL;
 	BEGIN
 	BEGIN
 
 
@@ -9205,7 +9205,7 @@ TYPE
 
 
 
 
 	PROCEDURE Overlap( src1, src2: ADDRESS ): BOOLEAN;
 	PROCEDURE Overlap( src1, src2: ADDRESS ): BOOLEAN;
-	VAR from1, from2, to1, to2: ADDRESS;  dim: LONGINT;
+	VAR from1, from2, to1, to2: ADDRESS;  dim: SIZE;
 	BEGIN
 	BEGIN
 		from1 := GetAdr( src1 );  from2 := GetAdr( src2 );  to1 := from1;  to2 := from2;
 		from1 := GetAdr( src1 );  from2 := GetAdr( src2 );  to1 := from1;  to2 := from2;
 		dim := GetDim( src1 ) - 1;
 		dim := GetDim( src1 ) - 1;
@@ -9241,11 +9241,11 @@ TYPE
 	*)
 	*)
 
 
 	PROCEDURE AllocateTransposed( VAR dest: ADDRESS;  src: ADDRESS; elementsize: SIZE ): ANY;
 	PROCEDURE AllocateTransposed( VAR dest: ADDRESS;  src: ADDRESS; elementsize: SIZE ): ANY;
-	VAR ptr, data: ANY;  Size: LONGINT;
+	VAR ptr, data: ANY;  Size: SIZE;
 		(* allocate a structure in dest compatible with src, if necessary. returns if allocation has taken place *)
 		(* allocate a structure in dest compatible with src, if necessary. returns if allocation has taken place *)
 
 
-		PROCEDURE TransposedShape( l, r: LONGINT ): BOOLEAN;
-		VAR dim,max: LONGINT;
+		PROCEDURE TransposedShape( l, r: ADDRESS ): BOOLEAN;
+		VAR dim,max: SIZE;
 		BEGIN
 		BEGIN
 			dim := GetDim( l );
 			dim := GetDim( l );
 			IF dim # GetDim( r ) THEN RETURN FALSE END;
 			IF dim # GetDim( r ) THEN RETURN FALSE END;
@@ -9258,7 +9258,7 @@ TYPE
 		END TransposedShape;
 		END TransposedShape;
 
 
 		PROCEDURE NewData;
 		PROCEDURE NewData;
-		VAR max,dim, len, size: LONGINT;
+		VAR max,dim, len, size: SIZE;
 		BEGIN
 		BEGIN
 			dim := GetDim( src );  size := elementsize;
 			dim := GetDim( src );  size := elementsize;
 			PutDim( dest, dim );
 			PutDim( dest, dim );
@@ -9312,7 +9312,7 @@ TYPE
 	PROCEDURE Transpose*( dest, left: ADDRESS;  Size: SIZE );
 	PROCEDURE Transpose*( dest, left: ADDRESS;  Size: SIZE );
 	VAR len0, len1, linc0, linc1, dinc0, dinc1: SIZE; ladr, dadr: ADDRESS;  p: ANY;
 	VAR len0, len1, linc0, linc1, dinc0, dinc1: SIZE; ladr, dadr: ADDRESS;  p: ANY;
 
 
-		PROCEDURE CopyLoop( src, dest, srcinc, destinc, len: LONGINT );
+		PROCEDURE CopyLoop( src, dest: ADDRESS; srcinc, destinc, len: SIZE );
 		BEGIN
 		BEGIN
 			WHILE (len > 0) DO
 			WHILE (len > 0) DO
 				SYSTEM.MOVE( src, dest, Size );  INC( src, srcinc );  INC( dest, destinc );
 				SYSTEM.MOVE( src, dest, Size );  INC( src, srcinc );  INC( dest, destinc );
@@ -9386,8 +9386,8 @@ TYPE
 		RETURN RESULT
 		RETURN RESULT
 	END "`";
 	END "`";
 
 
-	PROCEDURE CheckTensorGeometry( left, right, dest: ADDRESS; ldim, rdim: LONGINT ): BOOLEAN;
-	VAR i: LONGINT;
+	PROCEDURE CheckTensorGeometry( left, right, dest: ADDRESS; ldim, rdim: SIZE ): BOOLEAN;
+	VAR i: SIZE;
 	BEGIN
 	BEGIN
 		FOR i := 0 TO rdim - 1 DO
 		FOR i := 0 TO rdim - 1 DO
 			IF GetLen( right, i ) # GetLen( dest, i ) THEN RETURN FALSE END;
 			IF GetLen( right, i ) # GetLen( dest, i ) THEN RETURN FALSE END;
@@ -9410,10 +9410,10 @@ TYPE
 *)
 *)
 
 
 
 
-	PROCEDURE DoReshape*( VAR dest: ADDRESS;  src: LONGINT; CONST shape: ARRAY [ * ] OF LONGINT );
-	VAR i, Size: LONGINT;  ptr, data: ANY;  new: ADDRESS;
+	PROCEDURE DoReshape*( VAR dest: ADDRESS;  src: ADDRESS; CONST shape: ARRAY [ * ] OF LONGINT );
+	VAR i, Size: SIZE;  ptr, data: ANY;  new: ADDRESS;
 
 
-		oldSize, newSize: LONGINT;  oldDim, newDim: LONGINT;
+		oldSize, newSize: SIZE;  oldDim, newDim: SIZE;
 
 
 		squeezingReshape: BOOLEAN;
 		squeezingReshape: BOOLEAN;
 
 
@@ -9434,7 +9434,7 @@ TYPE
 		*)
 		*)
 		PROCEDURE SqueezingReshape(): BOOLEAN;
 		PROCEDURE SqueezingReshape(): BOOLEAN;
 		VAR
 		VAR
-			i, j, n: LONGINT;
+			i, j, n: SIZE;
 		BEGIN
 		BEGIN
 			IF oldDim > newDim THEN
 			IF oldDim > newDim THEN
 				i := 0; j := 0;
 				i := 0; j := 0;
@@ -9456,7 +9456,7 @@ TYPE
 		(*returns TRUE if the target is already allocated coninuous memory of correct length*)
 		(*returns TRUE if the target is already allocated coninuous memory of correct length*)
 		PROCEDURE TargetContinuous(): BOOLEAN;
 		PROCEDURE TargetContinuous(): BOOLEAN;
 		VAR
 		VAR
-			i, n: LONGINT;
+			i, n: SIZE;
 			continue: BOOLEAN;
 			continue: BOOLEAN;
 		BEGIN
 		BEGIN
 			i := GetDim(dest)-1; n := GetIncr(dest,i);
 			i := GetDim(dest)-1; n := GetIncr(dest,i);
@@ -9477,7 +9477,7 @@ TYPE
 		(* returns TRUE if reshape preserves contiguity pattern and thus is valid even for subranged arrays *)
 		(* returns TRUE if reshape preserves contiguity pattern and thus is valid even for subranged arrays *)
 		PROCEDURE PreservesContiguity(): BOOLEAN;
 		PROCEDURE PreservesContiguity(): BOOLEAN;
 		VAR
 		VAR
-			i, n: LONGINT;
+			i, n: SIZE;
 			continue: BOOLEAN;
 			continue: BOOLEAN;
 		BEGIN
 		BEGIN
 			i := oldDim-1; n := GetIncr(src,i);
 			i := oldDim-1; n := GetIncr(src,i);
@@ -9497,7 +9497,7 @@ TYPE
 
 
 		(* Added by Alexey *)
 		(* Added by Alexey *)
 		PROCEDURE NewDescriptorForSameData;
 		PROCEDURE NewDescriptorForSameData;
-		VAR len, size, i, j: LONGINT;
+		VAR len, size, i, j: SIZE;
 		BEGIN
 		BEGIN
 			CheckAlloc();
 			CheckAlloc();
 			ptr := GetArrayDesc( newDim );  new := ptr;
 			ptr := GetArrayDesc( newDim );  new := ptr;
@@ -9529,7 +9529,7 @@ TYPE
 		END NewDescriptorForSameData;
 		END NewDescriptorForSameData;
 
 
 		PROCEDURE NewData;
 		PROCEDURE NewData;
-		VAR len, size, i: LONGINT;
+		VAR len, size, i: SIZE;
 		BEGIN
 		BEGIN
 			size := Size;
 			size := Size;
 			FOR i := newDim - 1 TO 0 BY -1 DO
 			FOR i := newDim - 1 TO 0 BY -1 DO
@@ -9543,10 +9543,10 @@ TYPE
 		END NewData;
 		END NewData;
 
 
 		PROCEDURE CopyData;
 		PROCEDURE CopyData;
-		VAR d, s, dadr: LONGINT;
+		VAR d, s: SIZE; dadr: ADDRESS;
 
 
-			PROCEDURE Loop( dim: LONGINT;  sadr: LONGINT );
-			VAR inc, len, i: LONGINT;
+			PROCEDURE Loop( dim: SIZE;  sadr: ADDRESS );
+			VAR inc, len, i: SIZE;
 			BEGIN
 			BEGIN
 				IF dim = d THEN
 				IF dim = d THEN
 					inc := GetIncr( src, dim );  len := GetLen( src, dim );
 					inc := GetIncr( src, dim );  len := GetLen( src, dim );
@@ -9571,10 +9571,10 @@ TYPE
 		END CopyData;
 		END CopyData;
 
 
 		PROCEDURE CopyDataBack;
 		PROCEDURE CopyDataBack;
-		VAR d, s: LONGINT;  sadr: LONGINT;
+		VAR d, s: SIZE;  sadr: ADDRESS;
 
 
-			PROCEDURE Loop( dim: LONGINT;  dadr: LONGINT );
-			VAR inc, len, i: LONGINT;
+			PROCEDURE Loop( dim: SIZE;  dadr: ADDRESS );
+			VAR inc, len, i: SIZE;
 			BEGIN
 			BEGIN
 				IF dim = d THEN
 				IF dim = d THEN
 					inc := GetIncr( dest, dim );  len := GetLen( dest, dim );
 					inc := GetIncr( dest, dim );  len := GetLen( dest, dim );
@@ -9606,7 +9606,7 @@ TYPE
 		END CopyDescriptor;
 		END CopyDescriptor;
 
 
 		PROCEDURE ShapeDiffers( ): BOOLEAN;
 		PROCEDURE ShapeDiffers( ): BOOLEAN;
-		VAR i: LONGINT;
+		VAR i: SIZE;
 		BEGIN
 		BEGIN
 			ASSERT(GetDim(dest) = newDim);
 			ASSERT(GetDim(dest) = newDim);
 			FOR i := 0 TO newDim - 1 DO
 			FOR i := 0 TO newDim - 1 DO
@@ -9689,7 +9689,7 @@ TYPE
 
 
 	(* this is memory safe: the allocation result is written to a pointer in the call chain *)
 	(* this is memory safe: the allocation result is written to a pointer in the call chain *)
 	PROCEDURE AllocateTensorA*( CONST a: ARRAY OF SIZE;  elementSize: SIZE; tag: ADDRESS; VAR dest: UnsafeArray );
 	PROCEDURE AllocateTensorA*( CONST a: ARRAY OF SIZE;  elementSize: SIZE; tag: ADDRESS; VAR dest: UnsafeArray );
-	VAR descr, data: ANY;  same: BOOLEAN;  i: LONGINT;  dim: LONGINT;
+	VAR descr, data: ANY;  same: BOOLEAN;  i: SIZE;  dim: SIZE;
 
 
 		PROCEDURE NewData;
 		PROCEDURE NewData;
 		VAR len, size, i: SIZE;
 		VAR len, size, i: SIZE;
@@ -9747,11 +9747,11 @@ TYPE
 		IF dest.ptr # NIL THEN Heaps.SetPC(dest.ptr) END;
 		IF dest.ptr # NIL THEN Heaps.SetPC(dest.ptr) END;
 	END AllocateArrayA;
 	END AllocateArrayA;
 
 
-	PROCEDURE AllocateTensorX*( VAR destA: ARRAY [?]; CONST a: ARRAY [ * ] OF LONGINT;  Size: SIZE; tag: ADDRESS );
-	VAR descr, data: ANY;  same: BOOLEAN;  i: LONGINT;  dim: SIZE; dest: ADDRESS;
+	PROCEDURE AllocateTensorX*( VAR destA: ARRAY [?]; CONST a: ARRAY [ * ] OF SIZE;  Size: SIZE; tag: ADDRESS );
+	VAR descr, data: ANY;  same: BOOLEAN;  i: SIZE;  dim: SIZE; dest: ADDRESS;
 
 
 		PROCEDURE NewData;
 		PROCEDURE NewData;
-		VAR len, size: SIZE; i: LONGINT;
+		VAR len, size: SIZE; i: SIZE;
 		BEGIN
 		BEGIN
 			size := Size;
 			size := Size;
 			FOR i := dim - 1 TO 0 BY -1 DO
 			FOR i := dim - 1 TO 0 BY -1 DO
@@ -9806,7 +9806,7 @@ TYPE
 	END AllocateTensorX;
 	END AllocateTensorX;
 
 
 	PROCEDURE LenA*( VAR dest: ARRAY [ * ] OF SIZE;  src: ADDRESS );
 	PROCEDURE LenA*( VAR dest: ARRAY [ * ] OF SIZE;  src: ADDRESS );
-	VAR dim, i: LONGINT;
+	VAR dim, i: SIZE;
 	BEGIN
 	BEGIN
 		dim := GetDim( src );
 		dim := GetDim( src );
 		IF LEN( dest, 0 ) # dim THEN NEW( dest, dim );  END;
 		IF LEN( dest, 0 ) # dim THEN NEW( dest, dim );  END;
@@ -9814,7 +9814,7 @@ TYPE
 	END LenA;
 	END LenA;
 
 
 	PROCEDURE IncrA*( VAR dest: ARRAY [ * ] OF SIZE;  src: ADDRESS );
 	PROCEDURE IncrA*( VAR dest: ARRAY [ * ] OF SIZE;  src: ADDRESS );
-	VAR dim, len: SIZE; i: LONGINT;
+	VAR dim, len: SIZE; i: SIZE;
 	BEGIN
 	BEGIN
 		dim := GetDim( src );  len := LEN( dest, 0 );
 		dim := GetDim( src );  len := LEN( dest, 0 );
 		IF len # dim THEN NEW( dest, dim );  END;
 		IF len # dim THEN NEW( dest, dim );  END;
@@ -9898,7 +9898,7 @@ TYPE
 	PROCEDURE FindPatternTensor( left, right: ADDRESS;
 	PROCEDURE FindPatternTensor( left, right: ADDRESS;
 														 VAR rdim, len, linc, ri: SIZE );
 														 VAR rdim, len, linc, ri: SIZE );
 	(* geometric precondition: lengths must coincide *)
 	(* geometric precondition: lengths must coincide *)
-	VAR ldim: LONGINT;
+	VAR ldim: SIZE;
 	BEGIN
 	BEGIN
 		ldim := GetDim( left ) - 1;  rdim := GetDim( right ) - 1;
 		ldim := GetDim( left ) - 1;  rdim := GetDim( right ) - 1;
 		len := GetLen( left, ldim );  ASSERT( len = GetLen( right, rdim ) );
 		len := GetLen( left, ldim );  ASSERT( len = GetLen( right, rdim ) );
@@ -9921,13 +9921,13 @@ TYPE
 		END;
 		END;
 	END FindPatternTensor;
 	END FindPatternTensor;
 
 
-	PROCEDURE ApplyTensorAAAOp( d, l, r: ADDRESS;  elementSize: LONGINT;
+	PROCEDURE ApplyTensorAAAOp( d, l, r: ADDRESS;  elementSize: SIZE;
 														    Loop: BinaryASALoop );
 														    Loop: BinaryASALoop );
-	VAR loopd, looplen, loopri, loopdi, lDim, rDim: LONGINT;  p: ANY;
-		origdest: LONGINT;  left, right, dest: ADDRESS;
+	VAR loopd, looplen, loopri, loopdi, lDim, rDim: SIZE;  p: ANY;
+		origdest: ADDRESS;  left, right, dest: ADDRESS;
 
 
-		PROCEDURE Traverse( ladr, radr, dadr: ADDRESS;  ldim, rdim: LONGINT );
-		VAR len: LONGINT;  linc, rinc, dinc: LONGINT;
+		PROCEDURE Traverse( ladr, radr, dadr: ADDRESS;  ldim, rdim: SIZE );
+		VAR len: SIZE;  linc, rinc, dinc: SIZE;
 		BEGIN
 		BEGIN
 			IF (ldim < lDim) THEN
 			IF (ldim < lDim) THEN
 				len := GetLen( left, ldim );  linc := GetIncr( left, ldim );
 				len := GetLen( left, ldim );  linc := GetIncr( left, ldim );
@@ -10047,8 +10047,8 @@ TYPE
 	END InitOptimization;
 	END InitOptimization;
 
 
 	(* functionality used for index designators of including a questiomark such as A[x,*,?,*,x] *)
 	(* functionality used for index designators of including a questiomark such as A[x,*,?,*,x] *)
-	PROCEDURE CopyDescriptor*(VAR destPtr: ANY; src: LONGINT; prefixIndices, prefixRanges, suffixIndices, suffixRanges: LONGINT);
-	VAR size: SIZE; srcDim, destDim,i,len,incr: LONGINT; dest: ADDRESS;
+	PROCEDURE CopyDescriptor*(VAR destPtr: ANY; src: ADDRESS; prefixIndices, prefixRanges, suffixIndices, suffixRanges: SIZE);
+	VAR size: SIZE; srcDim, destDim,i,len,incr: SIZE; dest: ADDRESS;
 	BEGIN
 	BEGIN
 		IF src = 0 THEN
 		IF src = 0 THEN
 			HALT(100);
 			HALT(100);
@@ -10104,7 +10104,7 @@ TYPE
 		- makes it possible to convert the result of an integer-valued procedure F() into a range
 		- makes it possible to convert the result of an integer-valued procedure F() into a range
 		without executing the procedure twice as it would happen in "(F() .. F() BY 1)"
 		without executing the procedure twice as it would happen in "(F() .. F() BY 1)"
 	**)
 	**)
-	PROCEDURE RangeFromInteger*(CONST integer: LONGINT): RANGE;
+	PROCEDURE RangeFromInteger*(CONST integer: SIZE): RANGE;
 	BEGIN RETURN (integer .. integer BY 1)
 	BEGIN RETURN (integer .. integer BY 1)
 	END RangeFromInteger;
 	END RangeFromInteger;
 
 
@@ -10122,15 +10122,15 @@ TYPE
 	**)
 	**)
 	PROCEDURE ExpandDimensions*(CONST sourceArray: ARRAY [?]; CONST keptDimensions: ARRAY [*] OF BOOLEAN): ARRAY [?];
 	PROCEDURE ExpandDimensions*(CONST sourceArray: ARRAY [?]; CONST keptDimensions: ARRAY [*] OF BOOLEAN): ARRAY [?];
 	VAR
 	VAR
-		targetDimensionality, sourceIndex, targetIndex: LONGINT;
-		sourceADDRESS, targetADDRESS: LONGINT;
+		targetDimensionality, sourceIndex, targetIndex: SIZE;
+		sourceADDRESS, targetADDRESS: ADDRESS;
 		targetArrayDescriptor: ANY;
 		targetArrayDescriptor: ANY;
 	BEGIN
 	BEGIN
-		sourceADDRESS := SYSTEM.VAL(LONGINT, sourceArray);
+		sourceADDRESS := SYSTEM.VAL(ADDRESS, sourceArray);
 		targetDimensionality := LEN(keptDimensions, 0);
 		targetDimensionality := LEN(keptDimensions, 0);
 		targetArrayDescriptor := GetArrayDesc(targetDimensionality); (* create a new array descriptor *)
 		targetArrayDescriptor := GetArrayDesc(targetDimensionality); (* create a new array descriptor *)
 		SYSTEM.PUT(ADDRESSOF(RESULT), targetArrayDescriptor);
 		SYSTEM.PUT(ADDRESSOF(RESULT), targetArrayDescriptor);
-		targetADDRESS := SYSTEM.VAL(LONGINT, RESULT);
+		targetADDRESS := SYSTEM.VAL(ADDRESS, RESULT);
 
 
 		PutAdr(targetADDRESS, GetAdr(sourceADDRESS));
 		PutAdr(targetADDRESS, GetAdr(sourceADDRESS));
 		PutPtr(targetADDRESS, GetPtr(sourceADDRESS));
 		PutPtr(targetADDRESS, GetPtr(sourceADDRESS));
@@ -10160,9 +10160,9 @@ TYPE
 	(* index ranges *)
 	(* index ranges *)
 
 
 	(* the length of a range, i.e. the number of indices that it stands for *)
 	(* the length of a range, i.e. the number of indices that it stands for *)
-	OPERATOR "LEN"*(CONST range: RANGE): LONGINT;
+	OPERATOR "LEN"*(CONST range: RANGE): SIZE;
 	VAR
 	VAR
-		temp, result: LONGINT;
+		temp, result: SIZE;
 	BEGIN
 	BEGIN
 		IF (LAST(range) < FIRST(range)) OR (FIRST(range) < 0) OR (STEP(range) < 1) THEN
 		IF (LAST(range) < FIRST(range)) OR (FIRST(range) < 0) OR (STEP(range) < 1) THEN
 			(* invalid range *)
 			(* invalid range *)
@@ -10238,4 +10238,4 @@ END FoxArrayBase.
 
 
 Compiler.Compile FoxArrayBase.Mod ~
 Compiler.Compile FoxArrayBase.Mod ~
 
 
-SystemTools.ListModules 
+SystemTools.ListModules