Browse Source

cleanup and documentation

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7788 8c9fc860-2736-0410-a75d-ab315db34111
felixf 7 years ago
parent
commit
872ae13a67
1 changed files with 7 additions and 11 deletions
  1. 7 11
      source/FoxIntermediateBackend.Mod

+ 7 - 11
source/FoxIntermediateBackend.Mod

@@ -5754,30 +5754,26 @@ TYPE
 			IF alignment > 1 THEN
 			IF alignment > 1 THEN
 				IntermediateCode.InitRegister(reg,addressType,IntermediateCode.GeneralPurposeRegister,AcquireRegister(addressType,IntermediateCode.GeneralPurposeRegister));
 				IntermediateCode.InitRegister(reg,addressType,IntermediateCode.GeneralPurposeRegister,AcquireRegister(addressType,IntermediateCode.GeneralPurposeRegister));
 				Emit(Mov(position,reg, sp));
 				Emit(Mov(position,reg, sp));
-				gap := ParametersSize(system, procedureType, FALSE); 
+				gap := ParametersSize(system, procedureType, FALSE); (* account for all parameters being pushed *)
 				IF (procedureType.callingConvention = SyntaxTree.WinAPICallingConvention) & (system.addressSize =64) THEN
 				IF (procedureType.callingConvention = SyntaxTree.WinAPICallingConvention) & (system.addressSize =64) THEN
-					IF gap < 4*ToMemoryUnits(system,system.addressSize) THEN 
-						gap := 4*ToMemoryUnits(system,system.addressSize); (* at least four registers get pushed*)
+					IF gap < 4*ToMemoryUnits(system,system.addressSize) THEN (* in WINAPI 64bit there is at least space for four registers on the stack *)
+						gap := 4*ToMemoryUnits(system,system.addressSize); 
 					END;
 					END;
 				ELSIF (SysvABI(procedureType.callingConvention) ) & (system.addressSize =64) THEN
 				ELSIF (SysvABI(procedureType.callingConvention) ) & (system.addressSize =64) THEN
-					gap := gap - 6*ToMemoryUnits(system,system.addressSize); 
+					gap := gap - 6*ToMemoryUnits(system,system.addressSize); (* the first 6 parameters are passed via registers in SysVABI *)
 					IF gap < 0 THEN 
 					IF gap < 0 THEN 
 						gap := 0
 						gap := 0
-					ELSE
 					END; 
 					END; 
-					gap := gap - ToMemoryUnits(system,system.offsetFirstParameter); (* alignment before the call *)
+				ELSE
+					gap := gap + ToMemoryUnits(system,system.offsetFirstParameter)	(* Oberon CC: alignment at the BP in the stack frame *)
 				END;
 				END;
-				gap := gap + ToMemoryUnits(system,system.offsetFirstParameter) + ToMemoryUnits(system,system.addressSize);
+				gap := gap + ToMemoryUnits(system,system.addressSize); (* account for the additionally pushed stack pointer in any case *)
 
 
 				Emit(Sub(position,sp, sp, IntermediateCode.Immediate(addressType,gap)));
 				Emit(Sub(position,sp, sp, IntermediateCode.Immediate(addressType,gap)));
 				IntermediateCode.InitImmediate(mask,addressType,-alignment);
 				IntermediateCode.InitImmediate(mask,addressType,-alignment);
 				Emit(And(position,sp, sp, mask));
 				Emit(And(position,sp, sp, mask));
 				Emit(Add(position, sp, sp, IntermediateCode.Immediate(addressType, gap)));
 				Emit(Add(position, sp, sp, IntermediateCode.Immediate(addressType, gap)));
 			 	Emit(Push(position,reg));
 			 	Emit(Push(position,reg));
-				(*
-				IntermediateCode.InitMemory(mem, addressType, sp, 0);
-				Emit(Mov(position,mem,reg));
-				*)
 				ReleaseIntermediateOperand(reg);
 				ReleaseIntermediateOperand(reg);
 			END;
 			END;