Browse Source

More patches with regards to link register used in RPI coop

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6526 8c9fc860-2736-0410-a75d-ab315db34111
felixf 9 years ago
parent
commit
723ad5af1e
2 changed files with 30 additions and 1 deletions
  1. 1 0
      source/FoxARMBackend.Mod
  2. 29 1
      source/FoxIntermediateBackend.Mod

+ 1 - 0
source/FoxARMBackend.Mod

@@ -1654,6 +1654,7 @@ TYPE
 				ASSERT((virtualRegisters.Mapped(irDestinationOperand.register, part) # NIL)
 						OR (irDestinationOperand.register = IntermediateCode.SP)
 						OR (irDestinationOperand.register = IntermediateCode.FP)
+						OR (irDestinationOperand.register = IntermediateCode.LR)
 						OR (irDestinationOperand.register = IntermediateCode.AP));
 				mappedArmRegister := InstructionSet.NewRegister(PhysicalRegisterNumber(irDestinationOperand.register, part), None, None, 0);
 				MovIfDifferent(mappedArmRegister, register)

+ 29 - 1
source/FoxIntermediateBackend.Mod

@@ -2255,6 +2255,9 @@ TYPE
 			Basic.ToSegmentedName(name, pooledName);
 			section := IntermediateCode.NewSection(module.allSections, Sections.CodeSection, pooledName,NIL,TRUE);
 			IF dump # NIL THEN dump := section.comments END;
+			IF backend.hasLinkRegister THEN
+				Emit(Push(-1, lr));
+			END;
 
 			variable := mod.moduleScope.firstVariable;
 			WHILE variable # NIL DO
@@ -2267,6 +2270,9 @@ TYPE
 				variable := variable.nextVariable;
 			END;
 
+			IF backend.hasLinkRegister THEN
+				Emit(Pop(-1, lr));
+			END;
 			Basic.ToSegmentedName ("Modules.Module.@Trace",pooledName);
 			IntermediateCode.InitAddress(op, addressType, pooledName , 0, 0);
 			Emit(Br(position,op));
@@ -2345,6 +2351,9 @@ TYPE
 			context := SwitchContext(IntermediateCode.NewSection(module.allSections, Sections.CodeSection, name,NIL,TRUE));
 
 			IF dump # NIL THEN dump := section.comments END;
+			IF backend.hasLinkRegister THEN
+				Emit(Push(-1, lr));
+			END;
 
 			
 			variable := recordType.recordScope.firstVariable;
@@ -2367,6 +2376,9 @@ TYPE
 			
 			recordBase := recordType.GetBaseRecord();
 			IF (recordBase # NIL) & recordBase.NeedsTrace() THEN
+				IF backend.hasLinkRegister THEN
+					Emit(Pop(-1, lr));
+				END;				
 				GetRecordTypeName (recordBase,name);
 				Basic.SuffixSegmentedName (name, Basic.MakeString ("@Assign"));
 				IntermediateCode.InitAddress(op, addressType, name , 0, 0);
@@ -2469,6 +2481,10 @@ TYPE
 			context := SwitchContext(IntermediateCode.NewSection(module.allSections, Sections.CodeSection, name,NIL,TRUE));
 			IF dump # NIL THEN dump := section.comments END;
 
+			IF backend.hasLinkRegister THEN
+				Emit(Push(-1, lr));
+			END;
+
 			variable := recordType.recordScope.firstVariable;
 			WHILE variable # NIL DO
 				IF variable.NeedsTrace() THEN
@@ -2489,6 +2505,9 @@ TYPE
 				recordBase := recordBase.GetBaseRecord();
 			END;			
 			IF recordBase # NIL THEN
+				IF backend.hasLinkRegister THEN
+					Emit(Pop(-1, lr));
+				END;	
 				GetRecordTypeName (recordBase,name);
 				IF HasExplicitTraceMethod (recordBase) THEN
 					Basic.SuffixSegmentedName (name, Basic.MakeString ("Trace"));
@@ -2500,6 +2519,9 @@ TYPE
 			ELSIF (recordType.pointerType # NIL) & recordType.pointerType.isPlain THEN
 				Emit(Exit(position,0,0));
 			ELSE
+				IF backend.hasLinkRegister THEN
+					Emit(Pop(-1, lr));
+				END;
 				IF recordType.isObject THEN
 					Basic.ToSegmentedName ("BaseTypes.Object",name);
 				ELSE								
@@ -2578,10 +2600,13 @@ TYPE
 
 			IF dump # NIL THEN dump := section.comments END;
 
+			IF backend.hasLinkRegister THEN
+				Emit(Push(-1, lr));
+			END;
+
 			variable := recordType.recordScope.firstVariable;
 			WHILE variable # NIL DO
 				IF variable.NeedsTrace() THEN
-
 					dst := NewRegisterOperand (addressType);
 					Emit (Mov(position, dst, parameter1));
 					IntermediateCode.AddOffset(dst,ToMemoryUnits(system,variable.offsetInBits));
@@ -2596,6 +2621,9 @@ TYPE
 			
 			recordBase := recordType.GetBaseRecord();
 			IF (recordBase # NIL) & recordBase.NeedsTrace() THEN
+				IF backend.hasLinkRegister THEN
+					Emit(Pop(-1, lr));
+				END;
 				GetRecordTypeName (recordBase,name);
 				Basic.SuffixSegmentedName (name, Basic.MakeString ("@Reset"));
 				IntermediateCode.InitAddress(op, addressType, name , 0, 0);