Преглед изворни кода

Patched a problem with overlapping copies

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8129 8c9fc860-2736-0410-a75d-ab315db34111
felixf пре 7 година
родитељ
комит
8ebedc9ebf
1 измењених фајлова са 4 додато и 63 уклоњено
  1. 4 63
      source/FoxArrayBase.Mod

+ 4 - 63
source/FoxArrayBase.Mod

@@ -1299,48 +1299,15 @@ Sufficient (but not necessary) conditions:
 
 	PROCEDURE (*-*)MoveB*( srcadr, destadr, len: SIZE );
 	BEGIN
-		IF (srcadr >= destadr) OR (srcadr+len >= destadr) THEN
+		IF (len > 0)  THEN
 			SYSTEM.MOVE(srcadr, destadr, len);
 		ELSE
-			INC(srcadr,len-1); INC(destadr,len-1);
+			len := -len;
 			WHILE len > 0 DO
 				SYSTEM.PUT8(destadr, SYSTEM.GET8(srcadr));
 				DEC(srcadr); DEC(destadr); DEC(len);
 			END;
 		END;
-	(**
-	(** Correct move if overlap, might be important for some array operations,
-		do not use SYSTEM.MOVE.  *)
-	CODE {SYSTEM.i386}
-		MOV	ECX, [ESP]	;  len
-		MOV	EDI, [ESP+4]	;  destadr
-		MOV	ESI, [ESP+8]	;  srcadr
-		CMP	ESI, EDI
-		JAE	moveup	;  src adr greater then dest adr, no problem with moving up
-		MOV	EAX, ESI
-		ADD	EAX, ECX
-		CMP	EAX, EDI
-		JBE	moveup	;  no overlap, no problem, move up
-		MOV	ESI, EAX
-		ADD	EDI, ECX
-		DEC	ESI
-		DEC	EDI
-		STD	;  move down since overlap occured
-		REP
-		MOVSB
-		JMP	done
-		moveup:
-		CLD
-		MOV	BL, CL
-		SHR	ECX, 2
-		AND	BL, 00000003H	;  rest to move after 4 byte move
-		REP
-		MOVSD	;  move 4 bytes each step
-		MOV	CL, BL
-		REP
-		MOVSB	;  move rest in one byte steps
-		done:
-		ADD	ESP, 12	;  adjust stack pointer(inline procedure!)*)
 	END MoveB;
 
 	PROCEDURE CopyContent( dest, src: ADDRESS; elementSize: SIZE );   (**! optimize *)
@@ -1351,42 +1318,16 @@ Sufficient (but not necessary) conditions:
 		BEGIN
 			IF (dinc = elementSize) & (linc = elementSize) THEN
 				MoveB( ladr, dadr, len * elementSize );
-				(*
-				SYSTEM.MOVE( ladr, dadr, elementSize * len );
-				*)
 			ELSIF (dinc = -elementSize) & (linc = -elementSize) THEN
-				len := len * elementSize;
-				MoveB( ladr - len + elementSize, dadr - len + elementSize, len );
+				MoveB( ladr, dadr, - len * elementSize );
 			ELSIF elementSize = 1 THEN
 				Copy1( ladr, dadr, linc, dinc, len );
-				(*
-						WHILE (len > 0) DO
-					SYSTEM.PUT8( dadr, SYSTEM.GET8( ladr ) );  DEC( len );  INC( ladr, linc );  INC( dadr, dinc );
-				END;
-				*)
 			ELSIF elementSize = 2 THEN
 				Copy2( ladr, dadr, linc, dinc, len );
-				(*
-				WHILE (len > 0) DO
-					SYSTEM.PUT16( dadr, SYSTEM.GET16( ladr ) );  DEC( len );  INC( ladr, linc );  INC( dadr, dinc );
-				END;
-				*)
 			ELSIF elementSize = 4 THEN
 				Copy4( ladr, dadr, linc, dinc, len );
-				(*
-				WHILE (len > 0) DO
-					SYSTEM.PUT32( dadr, SYSTEM.GET32( ladr ) );  DEC( len );  INC( ladr, linc );  INC( dadr, dinc );
-				END;
-				*)
 			ELSIF elementSize = 8 THEN
 				Copy8( ladr, dadr, linc, dinc, len );
-				(*
-				WHILE (len > 0) DO
-					SYSTEM.PUT32( dadr, SYSTEM.GET32( ladr ) );
-					SYSTEM.PUT32( dadr + 4, SYSTEM.GET32( ladr + 4 ) );  DEC( len );  INC( ladr, linc );
-					INC( dadr, dinc );
-				END;
-				*)
 			ELSE  (* SYSTEM.MOVE is expensive ! *)
 				WHILE (len > 0) DO
 					SYSTEM.MOVE( ladr, dadr, elementSize );  DEC( len );  INC( ladr, linc );
@@ -1430,6 +1371,7 @@ Sufficient (but not necessary) conditions:
 
 		(* check pattern: longest piece that can be done with a loop *)
 		FindPattern2( src, dest, dim, loopd, looplen, loopli, loopdi );
+		
 		Traverse( 0, GetAdr( src ), GetAdr( dest ) );
 
 		IF up IN modes THEN  (* nothing to be done *)
@@ -1495,7 +1437,6 @@ Sufficient (but not necessary) conditions:
 			IF (TensorFlag IN GetFlags( dest )) THEN (* old heap pointer overwritten *)
 				oldDest := dest;
 				Heaps.Assign(dest, src);
-				(*TRACE(Heaps.RefCount(oldDest)); *)
 				
 			ELSE
 				(*