Przeglądaj źródła

LenType = LONGINT ---> SIZE, added some operators for SIZE

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7781 8c9fc860-2736-0410-a75d-ab315db34111
felixf 7 lat temu
rodzic
commit
64f6784733
1 zmienionych plików z 88 dodań i 3 usunięć
  1. 88 3
      source/FoxArrayBase.Mod

+ 88 - 3
source/FoxArrayBase.Mod

@@ -25,7 +25,7 @@ TYPE
 	BinaryAABLoop = PROCEDURE ( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
 	BinaryASBLoop = PROCEDURE ( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
 	
-	LenType = LONGINT; (* should be SIZE but for legacy reasons we have to use this *)
+	LenType = SIZE; (* should be SIZE but for legacy reasons we have to use this *)
 	
 CONST
 	debug = FALSE;   (* warning: debug=true -> a lot of output is generated -> traps are not displayed in Oberon (Kernel overflow) *)
@@ -2393,6 +2393,40 @@ Sufficient (but not necessary) conditions:
 		RETURN RESULT
 	END "+";
 
+(** HUGEINT *)
+	PROCEDURE AddAHAHLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
+	VAR lval, rval: HUGEINT;
+	BEGIN
+		WHILE (len > 0) DO
+			SYSTEM.GET( ladr, lval );  SYSTEM.GET( radr, rval );  SYSTEM.PUT( dadr, lval + rval );
+			INC( ladr, linc );  INC( radr, rinc );  INC( dadr, dinc );  DEC( len );
+		END;
+	END AddAHAHLoop;
+
+	OPERATOR "+"*(CONST left,right: ARRAY [?] OF HUGEINT): ARRAY [?] OF HUGEINT;
+	BEGIN
+		ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
+										  SIZEOF( HUGEINT ), AddAHAHLoop);
+		RETURN RESULT
+	END "+";
+
+(** SIZE *)
+	PROCEDURE AddAYAYLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
+	VAR lval, rval: SIZE;
+	BEGIN
+		WHILE (len > 0) DO
+			SYSTEM.GET( ladr, lval );  SYSTEM.GET( radr, rval );  SYSTEM.PUT( dadr, lval + rval );
+			INC( ladr, linc );  INC( radr, rinc );  INC( dadr, dinc );  DEC( len );
+		END;
+	END AddAYAYLoop;
+
+	OPERATOR "+"*(CONST left,right: ARRAY [?] OF SIZE): ARRAY [?] OF SIZE;
+	BEGIN
+		ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
+										  SIZEOF( SIZE ), AddAYAYLoop);
+		RETURN RESULT
+	END "+";
+
 
 (** LONGCOMPLEX *)
 	PROCEDURE AddALZALZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
@@ -2566,6 +2600,56 @@ Sufficient (but not necessary) conditions:
 										  AddAZSZLoop );
 		RETURN RESULT
 	END "+";
+	
+(** HUGEINT *)
+	PROCEDURE AddAHSHLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
+	VAR lval, rval: HUGEINT;
+	BEGIN
+		SYSTEM.GET( radr, rval );
+		WHILE (len > 0) DO
+			SYSTEM.GET( ladr, lval );  SYSTEM.PUT( dadr, lval + rval );  INC( ladr, linc );
+			INC( dadr, dinc );  DEC( len );
+		END;
+	END AddAHSHLoop;
+
+	OPERATOR "+"*(CONST left: ARRAY [ ? ] OF HUGEINT; right: HUGEINT ): ARRAY [ ? ] OF HUGEINT;
+	BEGIN
+		ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( HUGEINT ),
+										  AddAZSZLoop );
+		RETURN RESULT
+	END "+";
+
+	OPERATOR "+"*(left: HUGEINT; CONST right: ARRAY [ ? ] OF HUGEINT): ARRAY [ ? ] OF HUGEINT;
+	BEGIN
+		ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( HUGEINT ),
+										  AddAZSZLoop );
+		RETURN RESULT
+	END "+";
+
+(** SIZE  *)
+	PROCEDURE AddAYSYLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
+	VAR lval, rval: SIZE;
+	BEGIN
+		SYSTEM.GET( radr, rval );
+		WHILE (len > 0) DO
+			SYSTEM.GET( ladr, lval );  SYSTEM.PUT( dadr, lval + rval );  INC( ladr, linc );
+			INC( dadr, dinc );  DEC( len );
+		END;
+	END AddAYSYLoop;
+
+	OPERATOR "+"*(CONST left: ARRAY [ ? ] OF SIZE; right: SIZE ): ARRAY [ ? ] OF SIZE;
+	BEGIN
+		ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( SIZE ),
+										  AddAYSYLoop );
+		RETURN RESULT
+	END "+";
+
+	OPERATOR "+"*(left: SIZE; CONST right: ARRAY [ ? ] OF SIZE): ARRAY [ ? ] OF SIZE;
+	BEGIN
+		ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( SIZE ),
+										  AddAYSYLoop );
+		RETURN RESULT
+	END "+";
 
 (** LONGCOMPLEX *)
 	PROCEDURE AddALZSLZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
@@ -10054,12 +10138,13 @@ TYPE
 				*)
 				PutInc( dest, i, size );  PutLen( dest, i, len );  size := size * len;
 			END;
-			IF tag = 0 THEN
+			IF tag = 0 THEN			
 				SYSTEM.NEW( data, size  + ArrayAlignment);   (* Zero(data,size*Size); *)
 				PutAdr( dest, Align(data) );
 			ELSE
 				Heaps.NewArr(data, tag, size DIV Size,1,FALSE);
-				PutAdr( dest, data+ ArrDataArrayOffset );
+				PutAdr( dest, data+ ArrDataArrayOffset );			
+
 			END;
 			PutPtr( dest, data );  PutSize( dest, Size );
 		END NewData;