2
0
Эх сурвалжийг харах

Corrected interrupt calling convention

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6983 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 жил өмнө
parent
commit
00ed9dce72

+ 3 - 1
source/FoxARMBackend.Mod

@@ -2008,7 +2008,9 @@ TYPE
 		(* exit <parSize>, <pcOffset> *)
 		PROCEDURE EmitExit(CONST irInstruction: IntermediateCode.Instruction);
 		BEGIN
-			Emit2(opLDR, opLR, InstructionSet.NewImmediateOffsetMemory(InstructionSet.SP, 4, {InstructionSet.Increment, InstructionSet.PostIndexed}));
+			IF (irInstruction.op2.intValue # SyntaxTree.InterruptCallingConvention) THEN
+				Emit2(opLDR, opLR, InstructionSet.NewImmediateOffsetMemory(InstructionSet.SP, 4, {InstructionSet.Increment, InstructionSet.PostIndexed}));
+			END;
 			IF (irInstruction.op1.intValue = 0) & (irInstruction.op2.intValue # SyntaxTree.InterruptCallingConvention) THEN
 				(* Emit2(opMOV, opPC, opLR) *)
 				Emit1(opBX, opLR) (* recommended for better interoperability between ARM and Thumb *)

+ 14 - 11
source/FoxIntermediateBackend.Mod

@@ -1514,10 +1514,12 @@ TYPE
 			SELF.section := section;
 			prevDump := dump;
 			dump := section.comments;
-			IF backend.hasLinkRegister THEN
-				Emit(Push(Basic.invalidPosition, lr));
+			IF callconv # SyntaxTree.InterruptCallingConvention THEN
+				IF backend.hasLinkRegister THEN
+					Emit(Push(Basic.invalidPosition, lr));
+				END;
+				Emit(Push(Basic.invalidPosition,fp));
 			END;
-			Emit(Push(Basic.invalidPosition,fp));
 			
 			IF backend.cooperative & (callconv = SyntaxTree.OberonCallingConvention) THEN
 				IF (procedure # NIL) & (HasPointers (procedure.procedureScope) OR HasVariableParameters (procedure.procedureScope) OR IsNested (procedure)) THEN
@@ -1549,7 +1551,7 @@ TYPE
 					Emit(Result(Basic.invalidPosition, sp));
 					nocall.Resolve(section.pc);
 				END;
-			ELSE
+			ELSIF callconv # SyntaxTree.InterruptCallingConvention THEN
 				IF procedure # NIL THEN
 					body := procedure.procedureScope.body;
 				ELSE
@@ -1599,14 +1601,15 @@ TYPE
 			ELSE 
 				body := NIL;
 			END;
-
-			IF backend.cooperative OR  backend.preciseGC & (body # NIL) & (body.code = NIL) THEN
-				IntermediateCode.InitImmediate(op2,addressType, ToMemoryUnits(system, system.addressSize));
-				Emit(Add(position, sp, fp, op2));
-			ELSE
-				Emit(Mov(position, sp, fp));
+			IF callconv # SyntaxTree.InterruptCallingConvention THEN
+				IF backend.cooperative OR  backend.preciseGC & (body # NIL) & (body.code = NIL) THEN
+					IntermediateCode.InitImmediate(op2,addressType, ToMemoryUnits(system, system.addressSize));
+					Emit(Add(position, sp, fp, op2));
+				ELSE
+					Emit(Mov(position, sp, fp));
+				END;
+				Emit(Pop(position, fp));
 			END;
-			Emit(Pop(position, fp));
 			SELF.section := prevSection;
 		END EmitLeave;