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

Added support for restoring registers without popping them

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8275 8c9fc860-2736-0410-a75d-ab315db34111
negelef пре 7 година
родитељ
комит
5d11bdf0a5
1 измењених фајлова са 21 додато и 14 уклоњено
  1. 21 14
      source/FoxIntermediateBackend.Mod

+ 21 - 14
source/FoxIntermediateBackend.Mod

@@ -1585,10 +1585,13 @@ TYPE
 		END Emit;
 		
 		PROCEDURE EmitTrap (position: Position; trapNo: LONGINT);
+		VAR saved: RegisterEntry;
 		BEGIN
 			IF backend.cooperative THEN
+				ReleaseUsedRegisters(saved);
 				Emit(Push(position,IntermediateCode.Immediate(sizeType,trapNo)));
 				CallThis(position,"Runtime","Trap",1); 
+				RestoreRegisterUse(saved);
 			ELSE
 				Emit(Trap(position,trapNo));
 			END;
@@ -2021,26 +2024,30 @@ TYPE
 				type := entry.type;
 				class := entry.registerClass;
 				IntermediateCode.InitRegister(op,type,class,entry.register);
-				(*
-				new := registerUsageCount.Next(type,class);
-				registerUsageCount.Remap(entry.register,new);
-				IF TraceRegisterUsageCount & (dump# NIL) THEN
-					dump.String("remap register "); dump.Int(entry.register,1);
-					dump.String("to "); dump.Int(new,1);
-					dump.String("with count "); dump.Int(registerUsageCount.Use(new),1); dump.Ln; dump.Update;
-				END;
-				entry.register := new;
-				*)
-				
 				Emit(Pop(position,op));
 				AddRegisterEntry(usedRegisters,entry.register,entry.registerClass, entry.type);
 				entry := prev;
 			END;
-			(*
-			usedRegisters := saved;
-			*)
 		END RestoreRegisters;
 
+		(* re-enter registers from array saved into array markedRegisters (recursion possible) *)
+		PROCEDURE RestoreRegisterUse(CONST saved: RegisterEntry);
+		VAR op: IntermediateCode.Operand; entry,prev: RegisterEntry; type: IntermediateCode.Type; class: IntermediateCode.RegisterClass;
+		BEGIN
+			entry := saved;
+			WHILE (entry # NIL) DO prev := entry; entry := entry.next END;
+			entry := prev;
+			WHILE entry # NIL DO
+				prev := entry.prev;
+				type := entry.type;
+				class := entry.registerClass;
+				IntermediateCode.InitRegister(op,type,class,entry.register);
+				Emit(Mov(position,op,op));
+				AddRegisterEntry(usedRegisters,entry.register,entry.registerClass, entry.type);
+				entry := prev;
+			END;
+		END RestoreRegisterUse;
+
 		PROCEDURE CheckRegistersFree;
 		VAR r: RegisterEntry; warning: ARRAY 128 OF CHAR; i: LONGINT;
 		BEGIN