Browse Source

added code for returning parameter stackspace in WINAPI

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6625 8c9fc860-2736-0410-a75d-ab315db34111
eth.guenter 9 years ago
parent
commit
b67f09f693
1 changed files with 14 additions and 9 deletions
  1. 14 9
      source/FoxIntermediateBackend.Mod

+ 14 - 9
source/FoxIntermediateBackend.Mod

@@ -5650,13 +5650,6 @@ TYPE
 				
 				
 				passByRegister := parameterRegisters > 0;
 				passByRegister := parameterRegisters > 0;
 				registerNumber := 0;
 				registerNumber := 0;
-				IF passByRegister & (parameters.Length() > parameterRegisters) THEN
-					gap := (-ParametersSize( system, procedureType, FALSE )) MOD 16;
-					IF gap # 0 THEN
-						IntermediateCode.InitImmediate(size,addressType,gap);
-						Emit(Sub(position,sp,sp,size))
-					END
-				END;
 				formalParameter := procedureType.lastParameter;
 				formalParameter := procedureType.lastParameter;
 				FOR i := parameters.Length() - 1 TO 0 BY -1 DO
 				FOR i := parameters.Length() - 1 TO 0 BY -1 DO
 					actualParameter := parameters.GetExpression(i);
 					actualParameter := parameters.GetExpression(i);
@@ -5730,6 +5723,19 @@ TYPE
 				return := NewRegisterOperand(IntermediateCode.GetType(system,procedureType.returnType));
 				return := NewRegisterOperand(IntermediateCode.GetType(system,procedureType.returnType));
 				Emit(Result(position,return));
 				Emit(Result(position,return));
 			END;
 			END;
+			
+			(* === return parameter space === *)
+			IF procedureType.callingConvention = SyntaxTree.WinAPICallingConvention THEN
+				parametersSize := ToMemoryUnits(system,parameters.Length()*addressType.sizeInBits);
+				IF passByRegister & (parametersSize < 32) THEN 
+					(* allocated space for all parameter registers *)
+					parametersSize := 32
+				END;
+				IF parametersSize > 0 THEN
+					size := IntermediateCode.Immediate(addressType,parametersSize);
+					Emit(Add(position,sp,sp,size))
+				END;
+			END; 
 
 
 			IF SysvABI(procedureType.callingConvention) THEN
 			IF SysvABI(procedureType.callingConvention) THEN
 				IF passByRegister THEN 
 				IF passByRegister THEN 
@@ -5737,12 +5743,11 @@ TYPE
 						parametersSize := ToMemoryUnits(system,(parameters.Length()-parameterRegisters)*addressType.sizeInBits)
 						parametersSize := ToMemoryUnits(system,(parameters.Length()-parameterRegisters)*addressType.sizeInBits)
 					ELSE 
 					ELSE 
 						parametersSize := 0
 						parametersSize := 0
-					END
+					END;
 				ELSE
 				ELSE
 					parametersSize := ToMemoryUnits(system,parameters.Length()*addressType.sizeInBits)
 					parametersSize := ToMemoryUnits(system,parameters.Length()*addressType.sizeInBits)
 				END;
 				END;
 				IF parametersSize > 0 THEN
 				IF parametersSize > 0 THEN
-					INC( parametersSize, (-parametersSize) MOD 16 );
 					size := IntermediateCode.Immediate(addressType,parametersSize);
 					size := IntermediateCode.Immediate(addressType,parametersSize);
 					Emit(Add(position,sp,sp,size))
 					Emit(Add(position,sp,sp,size))
 				END;
 				END;