Browse Source

Added basic support for AP register in cooperative mode

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6375 8c9fc860-2736-0410-a75d-ab315db34111
eth.negelef 10 years ago
parent
commit
6bdb2cc40f
1 changed files with 8 additions and 2 deletions
  1. 8 2
      source/FoxARMBackend.Mod

+ 8 - 2
source/FoxARMBackend.Mod

@@ -262,7 +262,7 @@ TYPE
 		hint: LONGINT;
 		useFPU: BOOLEAN;
 
-		PROCEDURE & InitPhysicalRegisters(supportFramePointer, useFPU: BOOLEAN);
+		PROCEDURE & InitPhysicalRegisters(supportFramePointer, useFPU, cooperative: BOOLEAN);
 		VAR
 			i: LONGINT;
 			unusable: Ticket;
@@ -286,6 +286,10 @@ TYPE
 			toVirtual[InstructionSet.CPSR] := unusable; (* current program state register *)
 			toVirtual[InstructionSet.SPSR] := unusable; (* saved program state register *)
 
+			IF cooperative THEN
+				toVirtual[InstructionSet.R11] := unusable; (* current activity register *)
+			END;
+
 			(* disable coprocessor registers *)
 			FOR i := InstructionSet.CR0 TO InstructionSet.CR15 DO toVirtual[i] := unusable END;
 
@@ -424,7 +428,7 @@ TYPE
 
 			IF Trace THEN IF backend.useFPU THEN D.String("use FPU"); D.Ln ELSE D.String("don't use FPU"); D.Ln END END;
 
-			NEW(physicalRegisters, TRUE, backend.useFPU);
+			NEW(physicalRegisters, TRUE, backend.useFPU, backend.cooperative);
 			InitTicketGenerator(diagnostics, backend.optimize, 2, physicalRegisters);
 			error := FALSE;
 
@@ -880,6 +884,8 @@ TYPE
 				result := InstructionSet.SP
 			ELSIF virtualRegisterNumber = IntermediateCode.LR THEN
 				result := InstructionSet.LR
+			ELSIF virtualRegisterNumber = IntermediateCode.AP THEN
+				result := InstructionSet.R11
 			ELSE
 				ticket := virtualRegisters.Mapped(virtualRegisterNumber, part);
 				IF ticket = NIL THEN